Java 超类字段存储在子类中的什么位置?

Java 超类字段存储在子类中的什么位置?,java,Java,我们有以下代码: class Parent { public int i = 5; } class Son extends Parent { } public class MyTest { public static void main(String[] args){ **Son son = new Son();** System.out.println(son.i); } } public Parent() {} pub

我们有以下代码:

class Parent {
    public int i = 5;
}

class Son extends Parent {

}

public class MyTest {

    public static void main(String[] args){
        **Son son = new Son();**
        System.out.println(son.i);

    }

}

public Parent() {}
public Son() {
    super() // Calls Parent()
}
当执行Son-Son=new-Son()时,以下问题让我感到困惑:

  • 是否在内存中创建父实例?我知道在创建实例之前,将调用默认构造函数,没有参数,正确的调用构造函数和创建实例是不同的事情吗
  • 如果未创建父实例,但字段i存储在子实例中的哪里?因为我们可以通过son引用获得i的值
  • 非常感谢

    是否在内存中创建父实例?我知道在创建子实例之前,将调用父默认构造函数而不带参数,正确的调用构造函数和创建实例是不同的事情吗

    将不会创建
    Parent
    的实例,实际上,将调用
    Parent
    的构造函数。构造函数只是JVM在创建实例时要运行的特殊代码块。没有规则规定,“在创建
    T
    的实例时,只能运行
    T
    的构造函数”

    若并没有创建父实例,但子实例中存储的字段在哪里?因为我们可以通过子引用得到i的值


    仅仅因为它没有写在源代码中,并不意味着它不在那里。通过编写
    sonextensedparent
    ,您告诉编译器和运行时,
    Son
    确实有一个名为
    i
    的字段,因此您不必在
    Son
    中再次声明它。这是继承的主要目的之一-减少重复代码。

    当您创建子类的实例时,必须调用超类构造函数来初始化超类字段,在本例中为
    son.i
    。如果没有为超类提供构造函数,Java会隐式创建一个默认构造函数,相当于以下代码:

    class Parent {
        public int i = 5;
    }
    
    class Son extends Parent {
    
    }
    
    public class MyTest {
    
        public static void main(String[] args){
            **Son son = new Son();**
            System.out.println(son.i);
    
        }
    
    }
    
    
    public Parent() {}
    
    public Son() {
        super() // Calls Parent()
    }
    
    扩展
    Parent
    时,
    Son
    的构造函数首先调用
    Parent
    的构造函数,通过以下代码隐式完成:

    class Parent {
        public int i = 5;
    }
    
    class Son extends Parent {
    
    }
    
    public class MyTest {
    
        public static void main(String[] args){
            **Son son = new Son();**
            System.out.println(son.i);
    
        }
    
    }
    
    
    public Parent() {}
    
    public Son() {
        super() // Calls Parent()
    }
    
    简言之,是的。子类在内存中为超类生成字段。把一个子类想象成一个有一些提示的父类。例如:

    Parent myObj = new Son();
    System.out.println(myObj.i); // Still prints 5 because i is still a variable of son
    

    问题1:是的,如果您还没有创建默认的父构造函数,Java将自动创建一个默认的父构造函数,并且每次创建一个新的子对象时,父构造函数也将被调用。通过在子构造函数的第一行中调用super(…),可以显式调用您选择的父构造函数(假设您定义了一个或多个)

    问题2:字段“i”是父类的一部分。按照您目前编写的方式(使用公共访问),子类和其他想要更改它的人都可以访问它


    进一步说明:将字段设置为类的私有字段,如果可能,设置为最终字段,这是一种很好的编程实践

    这回答了你的问题吗?