【发布时间】:2015-09-09 23:30:34
【问题描述】:
我想弄清楚 1) 派生类变量的初始化/实例化 2) 在这段代码 sn-p 中调用基类构造函数的顺序
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 被初始化。这个顺序正确吗?
【问题讨论】:
-
基类总是首先被实例化,然后是初始化器,然后是构造器。请注意,您的两个
y字段不是同一个字段,因此第一次调用function打印 0(derived.y 尚未初始化),第二次调用打印 3。 -
那么,是不是在 B 中的 y 初始化为 3 之前调用了基类构造函数?
-
但是在您的评论中写了“然后是初始化程序,然后是构造函数”。这不意味着 b 中的 y 首先被初始化吗?我在这里弄糊涂了,请 calrify
-
基类首先(
base初始化器,然后base构造器),然后子类(derived初始化器,然后derived构造函数)。 -
不知道你在问什么,因为到目前为止的整个讨论都是关于对象实例化的。
标签: java inheritance constructor initialization instantiation