我了解到我们不能实例化抽象类。但今天我测试了一些代码,我对此感到困惑。
package MainPackage;
abstract class abstractClass {
abstract abstractClass a_function();
}
public class Src {
abstractClass m;
public abstractClass abstractClassTest() {
return m.a_function();
}
public static void main(String args[]) {
System.out.println("Hello world!");
}
}在这里,我创建了一个抽象类abstractClass并在abstractClassTest()函数中返回它。并且编译成功,没有错误!在返回某物之前,计算机应创建该类型的对象。在这里,它应该在返回m.function()之前创建一个abstractClass对象,这一点我无法理解。我认为不能实例化抽象类abstractClass m = new abstractClass() is illegal__).意味着不能创建抽象类的对象,或者不能新建类(例如)但是从上面的代码来看,我们似乎可以创建一个抽象类的对象。它怎么能实现呢?对于代码abstractClass m,当计算机看到代码时,它会做什么?我们不能说java已经实例化了代码abstractClass m的抽象类m。如果java不实例化类abstractClass,它如何在代码abstract abstractClass a_function();中返回abstractClass的对象?
发布于 2012-01-27 16:00:16
是的,它应该没有错误的编译。但是,如果您曾经调用过NullPointerException,那么它将在执行时抛出一个abstractClassTest,因为您从未初始化m变量来引用实际实例。为了做到这一点,您必须创建一个具体的类,该类将对抽象类进行子类。
例如:
public class ConcreteClass extends AbstractClass {
@Override AbstractClass a_function() {
return this;
}
}
public class Src {
private AbstractClass m = new ConcreteClass();
public AbstractClass abstractClassTest() {
return m.a_function();
}
public static void main(String args[]) {
new Src().abstractClassTest();
}
}注意,代码中没有创建抽象类的实例。仅仅因为有了该类型的变量,并不意味着已经创建了该类型的对象。
发布于 2012-01-27 16:02:05
M永远不会被分配,您也不会尝试用新关键字实例化一个新的abstractClass。如果您的代码真的到达了abstractClassTest,那么您只会得到一个空指针异常。我认为你可能混淆了声明一个变量并给它一个值。
发布于 2012-01-27 16:01:19
您不能直接实例化抽象类,代码实际上也不能实例化抽象类。您所拥有的只是对抽象类中某个子类或其他类的引用,当您实例化'm‘时,您必须提供一个实际的具体子类。
对于接口,您可以得到类似的模式。写是很合法的,例如:
List m;
...
m.size();但是,当您开始实例化时,您需要使用一个实现子类来实现,例如:
List m;
...
m = new ArrayList();
...
m.size();注意,在实例化时,我们使用的是ArrayList,而不是List (这只是接口)。
https://stackoverflow.com/questions/9036196
复制相似问题