【发布时间】:2013-12-24 07:25:01
【问题描述】:
我有一个关于java中的抽象类的非常基本的问题。
众所周知,我们不能创建抽象类的实例,那么JVM如何处理java中抽象类的实例化。
我们可以在抽象类中定义一个参数化的构造器,我们可以定义另一个扩展抽象类的构造器。在这种情况下,创建抽象类的实例并调用抽象类的构造函数。
我想了解一下,JVM是如何管理抽象类的对象创建的。
【问题讨论】:
我有一个关于java中的抽象类的非常基本的问题。
众所周知,我们不能创建抽象类的实例,那么JVM如何处理java中抽象类的实例化。
我们可以在抽象类中定义一个参数化的构造器,我们可以定义另一个扩展抽象类的构造器。在这种情况下,创建抽象类的实例并调用抽象类的构造函数。
我想了解一下,JVM是如何管理抽象类的对象创建的。
【问题讨论】:
JVM 不能实例化抽象类,它只能实例化抽象类的非抽象子类的实例。创建实例意味着在内存中分配必要的空间来保存所有非静态字段,然后通过调用构造函数来初始化这些字段。
【讨论】:
JVM 无法实例化接口或抽象类。
看看this。
在 JVM 中,每个对象都有一个指向其类的指针,但仅指向其具体类,而不指向其接口或抽象类。如果我们得到一个对象的内存地址,我们可以很容易地得到它的类的地址。此方法仅对可以创建实例的类有用。 接口和抽象类都不能以这种方式使用。
更多详情请参考this。
在Abstract class 的情况下,它是具体的SubClass,当你这样做时:
AbstractClass obj = new ConcreteClass();
new 运算符创建ConcreteClass 的对象,并调用其构造函数来初始化创建对象的状态。在这个过程中,抽象类的构造函数也从ConcreteClass构造函数中调用,初始化抽象类中对象的状态。
所以,基本上AbstractClass 的对象没有被创建。只是调用了它的构造函数来初始化对象的状态。
【讨论】:
如果抽象类对象不是由 JVM 内部创建的,而是仅调用其构造函数来初始化状态。然后在没有实例化的情况下,初始化的重点是什么以及执行的对象初始化。
【讨论】: