Instantiate Java Abstract class?
比较新的Java程序员和我已经被教导过,你不能创建一个抽象类的实例。我还做了一些研究,我了解到在大多数情况下,当一个抽象类被创建时,它实际上是一个匿名的子类。但我遇到的问题是:
Java的EDCOX1×0类有一个方法EDCOX1,1,它返回一个EDCOX1,2,}。EDCOX1 2是一个抽象类,Java文档还列出了它的所有子类抽象。所以我真的迷路了。退回什么?
返回的是API文档中找不到的非抽象子类,例如
所以这里没有技巧也没有魔力,只是一些类不会出现在API文档中,因为它们被认为是实现内部的,并且会发生变化。
有许多类似的例子,
但对于同一个问题也有不同的解决方案:JDBC用静态方法定义了
顺便说一下,要找到对象的实际运行时类,只需调用它们的
这里将应用多态性概念。
对象的类型将是URLConnection(父类接口),对象将是其子类(扩展或实现(如果是接口))。
下面的例子可能会让您明白这一点。
1 2 3 |
假设你有自己的班级。
1 2 3 4 5 6 7 8 9 10 11 | class ConnectionClass extends URLConnection { // some methods } class Main { URLConnection connect = null public URLConnection getUrl() { return connect = new ConnectionClass(); } } |
您将返回类的对象,该对象提供了
可能是匿名类
比如说你有一个
1 2 3 | abstract class Vehicle { abstract public void move(); } |
不用制作一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Example { public Vehicle foo() { Vehicle car = new Vehicle { @Override public void move() { // do some car movement, i.e. driving } } return car; } public Vehicle bar() { Vehicle boat = new Vehicle { @Override public void move() { // do some boat movement, i.e. boating } } return boat; } } |
所以不,你不能实例化一个
再说一次,假设你有一个
1 2 3 | abstract class Vehicle { abstract public void move(); } |
如果内部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Example { private class Car extends Vehicle { @Override public void move() { // do some car movement, i.e. driving } } private class Boat extends Vehicle { @Override public void move() { // do some boat movement, i.e. boating } } public Vehicle foo() { return new Car(); } public Vehicle bar() { return new Boat(); } } |
这并不能解释任何关于实例化
它是一个扩展
当所有子类都是抽象的,那么这是因为只能通过在工厂中创建类来使用类。如果您仔细检查使用java.net.urlconnection来触发和处理HTTP请求中的代码,您将看到
1 |