public class Test
{
public static void main(String[] args)
{
System.out.println(Super.index);
System.out.println(Sub.index);
}
}class Super
{
public static int index; static
{
index = 1;
}
}class Sub extends Super
{
static
{
index = 2;
}
}
大家觉得分别会打印出什么呢?(先别运行看结果)
{
public static void main(String[] args)
{
System.out.println(Super.index);
System.out.println(Sub.index);
}
}class Super
{
public static int index; static
{
index = 1;
}
}class Sub extends Super
{
static
{
index = 2;
}
}
大家觉得分别会打印出什么呢?(先别运行看结果)
System.out.println(Sub.index);
第二个语句并不会使得Sub的static代码段执行,所以会打印 1,1
但是如果你改为System.out.println(Super.index);
new Sub();
System.out.println(Sub.index);
这样就会使得Sub中的static代码段执行就会打印1,2
sub 类加载时不就要运行sub的静态代码块吗,为什么你说没执行?
明智的做法是:如果一个类中没有定义某个静态成员,就不要用这个类名去引用该静态成员,即使可以通过名称查找机制引用到它,也不要这么做。
如果把楼主的代码改成:public class Test
{
public static void main(String[] args)
{
System.out.println(Super.index);
System.out.println(Super.index);
}
}class Super
{
public static int index; static
{
index = 1;
}
}class Sub extends Super
{
static
{
Super.index = 2;
}
}编译的结果是完全一样的,但消除了误导性,可读性增强了。另外,通过实例变量引用类的静态成员,也不是很明智的做法。
在Class代码中,你可以看到编译器并没有把Sub.index变成Super.index,你可以用javap -classpath . Test -c看到
Sub.index时,只是JVM觉得不需要初始化Sub,然后没有执行Sub的static代码而已
public class Test
{
public static void main(String[] args)
{
System.out.println(Super.index);
Sub sub = new Sub();
System.out.println(Sub.index);
}
}如果代码是这样,输出才是
1
2