【问题标题】:How jvm handles abstract class in javajvm如何处理java中的抽象类
【发布时间】:2013-12-24 07:25:01
【问题描述】:

我有一个关于java中的抽象类的非常基本的问题。

众所周知,我们不能创建抽象类的实例,那么JVM如何处理java中抽象类的实例化。

我们可以在抽象类中定义一个参数化的构造器,我们可以定义另一个扩展抽象类的构造器。在这种情况下,创建抽象类的实例并调用抽象类的构造函数。

我想了解一下,JVM是如何管理抽象类的对象创建的。

【问题讨论】:

标签: java abstract


【解决方案1】:

JVM 不能实例化抽象类,它只能实例化抽象类的非抽象子类的实例。创建实例意味着在内存中分配必要的空间来保存所有非静态字段,然后通过调用构造函数来初始化这些字段。

【讨论】:

  • 如果你能从JVM内部的角度解释一下,我需要一个更好的答案。如果抽象类有构造函数,JVM如何处理,JVM如何调用构造函数。
【解决方案2】:

JVM 无法实例化接口或抽象类。

看看this

在 JVM 中,每个对象都有一个指向其类的指针,但仅指向其具体类,而不指向其接口或抽象类。如果我们得到一个对象的内存地址,我们可以很容易地得到它的类的地址。此方法仅对可以创建实例的类有用。 接口和抽象类都不能以这种方式使用。

更多详情请参考this

Abstract class 的情况下,它是具体的SubClass,当你这样做时:

AbstractClass obj = new ConcreteClass();

new 运算符创建ConcreteClass 的对象,并调用其构造函数来初始化创建对象的状态。在这个过程中,抽象类的构造函数也从ConcreteClass构造函数中调用,初始化抽象类中对象的状态。

所以,基本上AbstractClass 的对象没有被创建。只是调用了它的构造函数来初始化对象的状态。

【讨论】:

  • 如果抽象类有参数化的构造函数,子类扩展了抽象类,抽象的构造函数如何调用?
【解决方案3】:

如果抽象类对象不是由 JVM 内部创建的,而是仅调用其构造函数来初始化状态。然后在没有实例化的情况下,初始化的重点是什么以及执行的对象初始化。

【讨论】:

  • 欢迎来到 stack over flow,虽然我们感谢您的回答,但这篇文章已经很老了,您的回答与现有的回答几乎相同。集中精力回答新问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多