class Parent
{
public static String sName = "Parent";
static
{
System.out.println("Parents static block called");
sName = "Parent";
}
}
class Child extends Parent
{
public static String sName1;
static
{
System.out.println("Childs static block called");
sName = "Child";
sName1 = "Child";
}
}
public class Inheritance
{
public static void main(String []args)
{
System.out.println(Child.sName);
System.out.println(Parent.sName);
}
}
在上面的代码段中,我有一个'Parent
'类和一个扩展Parent的'Child
'类。我理解静态变量之间共享的事实
父级及其所有子类。当我运行上面的程序时,输出是
Parents static block called
Parent
Parent
我想知道为什么即使在执行'System.out.println(Child.sName);
'之后也没有执行Child的静态块。我不确定为什么只有父类被加载而不是Childs类。现在,当我修改main()
函数时,如下所示,Child的类被加载。
public static void main(String []args)
{
System.out.println(Child.sName);
System.out.println(Parent.sName);
System.out.println(Child.sName1); //sName is declared in Child class.
System.out.println(Parent.sName);
}
现在输出如下所示,并且符合预期。现在,当我们引用在Child类中声明的静态变量sName1时,必须加载Child类。
Parents static block called
Parent
Parent
Childs static block called
Child
Child
静态变量“sName
”现在有'Child
'作为其值。我的问题是,为什么在修改它之前,即使在主函数的第一行中引用了一个引用后,Child类也不会被加载?
请告知。
答案 0 :(得分:3)
来自JLS
类或接口类型T将在紧接之前初始化 首次出现以下任何一种情况:
- T是一个类,创建了一个T实例。
- T是一个类,调用T声明的静态方法。
- 分配由T声明的静态字段。
- 使用由T声明的静态字段,该字段不是常量变量(§4.12.4)。
- T是顶级类,并且执行词法嵌套在T中的断言语句(第14.10节)。
在第一种情况(第一组打印标准)中,您只能访问sName
变量,并且它属于Parent
类,因此子类未初始化。
在第二组打印语句中,您可以访问属于sName1
类的Child
变量,所以此时,Child类已初始化。
无所谓,即使您访问过Child.sName
,它实际上也会引用Parent.sName
,因此它不会加载Child
类。
答案 1 :(得分:-1)
class Parent
{
public static String sName = "Parent"; // here you defining **sName** as static
static
{
System.out.println("Parents static block called");
sName = "Parent";
}
}
class Child extends Parent
{
public static String sName1; // here you defining **sName1** as static
static
{
System.out.println("Childs static block called");
sName = "Child";
sName1 = "Child";
}
}
所以当你致电System.out.println(Child.sName);
时,sName在class parent
中声明为静态。程序将获得存储在sName中的值(即在sName = "Parent";
内的静态块中定义的parent
)。所以你去结果父。
和其他情况相似
System.out.println(Child.sName);
System.out.println(Parent.sName);
System.out.println(Child.sName1); //sName is declared in Child class.
System.out.println(Parent.sName);