Java JVM是否在内部实例化抽象类的对象?

Java JVM是否在内部实例化抽象类的对象?,java,abstract-class,object-construction,Java,Abstract Class,Object Construction,我有一个抽象类和它的具体子类,当我创建子类的对象时,它会自动调用超级构造函数。JVM是否在内部创建抽象类的对象 public abstract class MyAbstractClass { public MyAbstractClass() { System.out.println("abstract default constructor"); } } public class ConcreteClass extends MyAbstractClass{

我有一个抽象类和它的具体子类,当我创建子类的对象时,它会自动调用超级构造函数。JVM是否在内部创建抽象类的对象

public abstract class MyAbstractClass {

    public MyAbstractClass() {
        System.out.println("abstract default constructor");
    }

}
public class ConcreteClass extends MyAbstractClass{

    public static void main(String[] args) {
        new ConcreteClass();
    }

}
那么,在JVM中没有对象的构造函数是如何存在的呢??(对于抽象类)

另外,构造函数在创建对象之后执行,而不创建抽象类的对象默认构造函数是如何执行的??(这在中提到)

不能实例化抽象类是真的吗

public abstract class MyAbstractClass {

    public MyAbstractClass() {
        System.out.println("abstract default constructor");
    }

}
public class ConcreteClass extends MyAbstractClass{

    public static void main(String[] args) {
        new ConcreteClass();
    }

}

JVM是否在内部创建抽象类的对象

不,但这是一个常见的误解(这样做并不是不合理的;JavaScript等原型语言就是这样做的)

JVM创建一个对象,该对象属于您创建的类(在您的示例中为
ConcreteClass
)。一个对象的某些方面是从其超类(
MyAbstractClass
)和子类(
ConcreteClass
)获得的,但只有一个对象

对象是其所有部分的集合,包括似乎具有相同名称的部分,例如被子类重写的超类的方法。事实上,这些方法具有不同的完全限定名并且彼此不冲突,这就是为什么可以调用超类版本的重写方法

因此,如果它只是一个对象,为什么会看到对
MyAbstractClass
构造函数的调用?在回答这个问题之前,我需要提到Java编译器正在做的一些在源代码中看不到的事情:

  • 它正在为
    ConcreteClass
    创建一个默认构造函数

  • 在该构造函数中,它调用
    MyAbstractClass
    构造函数

  • 需要彻底说明的是:在
    MyAbstractClass
    构造函数中,它添加了对超类(
    Object
    )构造函数的调用,因为
    MyAbstractClass
    构造函数中没有编写
    super(…)
    调用

  • 下面是Java编译器为您添加的位的代码:

    public abstract class MyAbstractClass {
    
        public MyAbstractClass() {
            super();           // <== The Java compiler adds this call to Object's constructor (#3 in the list above)
            System.out.println("abstract default constructor");
        }
    
    }
    public class ConcreteClass extends MyAbstractClass{
    
        ConcreteClass() {      // <== The Java compiler adds this default constuctor (#1 in the list above)
            super();           // <== Which calls the superclass's (MyAbstractClass's) constructor (#2 in the list above)
        }
    
        public static void main(String[] args) {
            new ConcreteClass();
        }
    
    }
    
    公共抽象类MyAbstractClass{
    公共MyAbstractClass(){
    
    超级();//JVM不创建抽象类的对象。它调用它的超级构造函数

    JVM将创建一个对象,一个具体类的实例,它继承抽象类的字段和方法

    在JVM中只有一个对象,类型为
    具体类
    构造函数
    是向子类添加超类功能所必需的。子类的所有实例隐式调用其超类的构造函数。您不能实例化抽象类,只能实例化其子类。您可以通过匿名类实例化它,尽管它不是recommended@VinceEmigh-您可以通过ano对其进行实例化nymous类-不完全正确。它不是抽象类的实例。创建的实例将是抽象类的子类的实例class@TheLostMind这很明显。我只是介绍了一种创建实例的方法,而没有定义新的可访问类型,例如,ConcreteClass。很抱歉没有100%的技术性…JVM无法创建类为接口或抽象类的对象,即使您破解字节码或使用
    Unsafe
    。那么调用其构造函数的意义是什么?@javaguy:确保运行初始化对象基本部分所需的逻辑。@kavitemre:MyAbstractClass构造函数运行在创建的
    ConcreteClass
    对象上;只是它只能看到该对象的一部分,而不能看到整个对象。@kavitemre:构造函数和方法不是对象的一部分,它们是类的一部分。class=code,object=data。代码(抽象构造函数)对数据(对象)进行操作.@kavitemre-您没有看到的一点是-构造函数只初始化对象,而不创建它们。那么构造函数调用呢?调用构造函数对象时created@kavitemre-调用构造函数时确实会创建一个构造函数对象-这取决于类是抽象的还是协同的对象仅为具体类创建。不能明确使用
    new
    创建抽象类的实例class@TheLostMind-我知道不能创建抽象类的对象。我问的是JVM??不。JVM也不会创建抽象类的实例。请注意,类对象是创建的,但不是insta抽象概念class@TheLostMind那么,在没有对象的情况下,构造函数是如何存在的呢??(在抽象类的情况下)