我想弄清楚 1) 派生类变量的初始化/实例化 2) 在此代码片段中调用基类构造函数的顺序
public class base
{
int y = 1;
public base()
{
y = 2;
function();
}
void function ()
{
System.out.println("In base Value = " + String.valueOf(y));
}
public static class derived extends base
{
int y = 3;
public derived()
{
function();
}
void function ()
{
System.out.println("In derived Value = " + String.valueOf(y));
}
}
public static void main(String[] args)
{
base b = new base.derived();
return;
}
}
我的理解是首先实例化派生类,然后调用基类构造函数,然后初始化派生类变量y。这个顺序正确吗?
最佳答案
执行顺序如下:
1) 静态初始化器
[基类实例化]
2) 实例初始化器
3)构造函数
4) 主体的剩余部分。
静态初始化器先于基类实例化。
如果您有超过 1 个实例初始化器,它们会按照从上到下写入的顺序出现。
你的代码
您没有任何实例 block 。
先运行父类构造函数,将基类中的y变量with设置为2,然后调用function方法,但是子类中function方法已经被覆盖,所以使用子类方法。
但是 derived.y 变量尚未初始化,因此 y 的值默认为 0。
在那之后,子类; derived 的构造函数然后运行,derived.y 的值声明为 3,派生类中定义的覆盖函数方法运行,因此打印派生值为 3。
注意:两个y变量不一样
关于java - 派生类的类变量的初始化/实例化和调用基类构造函数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490714/