一个JAVA基础题,在CSDN和JavaEye都得不到满意回答,特此求助大名鼎鼎的 Jdon 论坛

09-07-17 beyondyuefei
都说抽象类不允许创建具体对象实例,但是只是不能显式创建吧 ? 在一个类继承抽象类的时候,如果 new 一个子类对象,那么 JVM 首先就会创建一个抽象类的实例并调用其构造函数的,然后把这个抽象类对象包含在字类对象中,并通过 super关键子引用.

按 thinking in java 里所说,创建子类对象的时候,首先会递归的创建父类对象,并借助父类构造函数完成对父类对象的初始化。那么当父类为抽象类的时候,JVM 也同样会自动创建抽象父类的对象,然后把它包含在子类对象中。如此一来,我们平时所说的不能创建抽象类的对象并不准确了,只是我们不能在语法上写出 new abstractClass() 而已,但在继承体系中,JVM其实会自动创建的.

abstract class Father {

public void print() {

System.out.println("in father");

}

}

public class Test extends Father {

public void print() {

super.print();

}

这里的 super 就是对JVM 自动创建的抽象父类对象的引用,我觉得应该就是如此了.

大家怎么认为呢 ?

bloodrate
2009-07-18 00:08
没有吧。。。这个问题应该去《深入java虚拟机》里寻找答案,在继承的时候,创建子类并不会让虚拟机内产生两个实例,在字节码.class文件编码中有一个区域是“继承区”,在编译之后,父类(super的方法)是被写在了子类字节码的继承区里,是和子类揉在一起了,只不过你用super的时候才能调用。

coco1728
2009-08-12 13:28
我也曾和楼主的想法一样,但听完bloodrate的解释后,我恍然大悟了!呵呵!谢谢啊!

猜你喜欢