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()时,以下问题让我感到困惑:
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”是父类的一部分。按照您目前编写的方式(使用公共访问),子类和其他想要更改它的人都可以访问它
进一步说明:将字段设置为类的私有字段,如果可能,设置为最终字段,这是一种很好的编程实践 这回答了你的问题吗?