Java中的静态变量

时间:2014-02-17 06:03:00

标签: java inheritance static-members

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类也不会被加载?

请告知。

2 个答案:

答案 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);