Java 如果我们创建子类的对象,是否会创建父类的对象?

Java 如果我们创建子类的对象,是否会创建父类的对象?,java,inheritance,Java,Inheritance,我知道每次创建子类对象时都会调用super。但是,我特别想知道的是,它会加载类还是创建父类的对象 提前感谢。当您第一次加载类时,它的所有祖先也会递归加载 实例化对象时,不会实例化其父对象的其他实例。但是,您刚才实例化的对象本身也是父对象的实例。您有一个单个对象。 在实例化类时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数 假设:AextendsBextendsC newa()生成调用自身的C构造函数的B构造函数调用。 当C然后返回B构造函数调用时,A构造函数

我知道每次创建子类对象时都会调用super。但是,我特别想知道的是,它会加载类还是创建父类的对象


提前感谢。

当您第一次加载类时,它的所有祖先也会递归加载


实例化对象时,不会实例化其父对象的其他实例。但是,您刚才实例化的对象本身也是父对象的实例。

您有一个单个对象。
在实例化类时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数

假设:
A
extends
B
extends
C

newa()
生成调用自身的
C
构造函数的
B
构造函数调用。
C
然后返回
B
构造函数调用时,
A
构造函数可以继续运行,并创建实例
A

但是,我特别想知道的是,它会加载类吗 或者它将创建父类的对象

与构造函数执行类似,在加载类之前,必须先加载其父类
,然后递归加载每个父类

这里对应于
A
扩展
B
扩展
C
的类:

class C {
    public C(){    
        System.out.println("C constructor");
    }
}

class B extends C{
    public B() {
        System.out.println("B constructor");
    }

}
class A extends B{
    public A() {
        System.out.println("A constructor");
    }
}


public class Test {
    public static void main(String[] args) {
        new A();
    }
}
编译这些类,然后通过在
java
命令中指定
-verbose
标志(默认情况下启用类日志),执行
Test
类,该类在其
main()
方法中创建一个
实例:

java -verbose Test
您应该在输出标准中看到如下内容:

[Loaded java.lang.Object from C:\...] [Loaded java.io.Serializable from C:\...] ... // load all classes required until loaded C, B and A classes [Loaded C from file:/C:/...] [Loaded B from file:/C:/...] [Loaded A from file:/C:/...] C constructor B constructor A constructor [已从C:\…]加载java.lang.Object] [已从C:\…]加载java.io.Serializable] ... // 加载所需的所有类,直到加载C、B和A类 [从文件加载的C:/C:/…] [已从文件加载B:/C:/…] [从文件加载:/C:/…] C构造函数 B构装师 构造器 它确认:

  • 首先需要从根父类(
    Object
    )开始加载父类,直到最近的父类(
    B
  • 在加载层次结构的所有类之前,不会执行任何构造函数
  • 父类的构造函数总是在实例化类的构造函数之前执行,从根父构造函数(
    Object
    )开始执行,直到最近的父构造函数(
    B

调用构造函数,因此创建父类的对象。该对象稍后用于构建子类的对象。这是因为子类的对象是具有更多内容的父类的对象。

因为子类从父类继承属性和方法,所以整个类层次结构(包括超类和实现的接口)都加载

创建childclass实例时,仅创建(实例化)childclass类型的单个对象。没有任何父级的其他实例

在父类上声明的属性和方法可以通过childclass实例访问,由于这种继承,childclass实例将被接受为任何期望父类实例(或它或任何父类实现的任何接口)的方法的参数

如果您认为代码是一种合同设计,那么这是非常有意义的:

  • 父类声明确定某些方法可用于调用自身或其任何子类。接口也是如此
    例如,现实世界中的所有雇佣合同都必须包含某些条款,但其余条款由公司决定
  • 通过继承(
    扩展
    实现
    ),可以保证子级也会自动提供相同的方法
    例如,我们可以假设任何守法的公司都会提供雇佣合同,包括这些条款以及(一旦同意)您和公司双方的签字
  • 为了理解完整的合同,需要加载整个层次结构。
    例如,如果存在争议,审查合同的律师将检查法律规定的内容,可能通过查看立法机构提供的合同样本。父类就是问题中的示例
  • 我们只需要一个对象实例
    例如你不会得到两份雇佣合同,一份是关于基本材料的,另一份是关于更多信息的。您将收到并签署一份文件
  • 最后,在我的类比中,任何要求你证明你与雇佣你的公司的关系的机构都可以接受任何雇佣合同(无论其措辞如何)(通过包含法律规定的条款和适当的签名,假设其合法有效)

将只创建一个将继承其父类属性的对象。也可以通过父类引用引用。childclass的实例也是父类的对象(实例)。每个类都必须小心:没有创建父类的其他实例。