package com.jrpay;public class SSClass {
static {
System.out.println("SSClass");
}
}
class SuperClass extends SSClass{
static {
System.out.println("SuperClass init!");
}
public static int value = 123;
public SuperClass() {
System.out.println("init SuperClass");
}
}
class SubClass extends SuperClass {
static {
System.out.println("SubClass init");
}
static int a;
public SubClass() {
System.out.println("init SubClass");
}
}
class A extends SubClass {
static {
System.out.println("Chenguoqing");
}
static int a;
public A() {
System.out.println("jrpay");
}
}class Test {

public static void main(String[] args) {
System.out.println(SuperClass.value);
}
}结果:
SSClass
SuperClass init!
123为什么没有SubClass init!  和 chenguoqing   

解决方案 »

  1.   

    直接调用的SuperClass,当然只打印父类的代码块,还有子类的静态方法及变量
      

  2.   

    我调用 SubClass  还是一样的结果  这是怎么回事啊?能详细的教教我吗?
      

  3.   

    说实话这结果也出乎我意料,只能说java是学无止境了。我是这么理解的,对于静态代码的执行,如果没有直接执行子类的静态代码,那么它只会加载到你执行的那个父类的代码。
    其实这也是可以理解的,对于静态代码的加载来说,编译器认为你既然不调用我,那我也不加载你了,因为我就调用你老子的代码就够用了,需要再说。而new因为是要必须执行子类构造函数,所以父类包括自己必须全加载。
    以下是验证代码:
    class SSClass {
    static {
    System.out.println("SSClass");
    }
    }class SuperClass extends SSClass {
    static {
    System.out.println("SuperClass init!");
    }
    public static int value = 123; public SuperClass() {
    System.out.println("init SuperClass");
    }
    }class SubClass extends SuperClass {
    static {
    System.out.println("SubClass init");
    }
    static int a; public SubClass() {
    System.out.println("init SubClass");
    }
    }class A extends SubClass {
    static void go(){
    System.out.println("go!");
    }

    static {
    System.out.println("Chenguoqing");
    }
    static int a; public A() {
    System.out.println("jrpay");
    }
    }public class Test3 {
    public static void main(String[] args) {
    System.out.println(A.value);
    System.out.println("---------------------------------");
    A.go();
    }
    }
      

  4.   

    楼主的问题根本和对象无关,也就是和new及构造无关,纯粹是静态代码执行,大家看清代码了!
      

  5.   

    楼主要学会贴代码public class Demo {
        public static void main(String[] args) {
            if (args.length == 0) {
                System.out.println("no args.");
            }
        }
    }像楼主的代码层级多,又没有排版,没法看。
      

  6.   

    完整的初始化顺序是:
    父类静态变量
    父类静态块
    子类静态变量
    子类静态块
    父类非静态变量
    父类非静态块
    父类构造函数   
    子类非静态变量
    子类非静态块    
    子类构造函数    
    以你这个例子来说,执行System.out.println(SuperClass.value)会先去执行父类静态块System.out.println("SSClass");,然后执行子类静态变量把value的值初始化为123,然后执行子类静态块,打印System.out.println("SuperClass init!");,然后结束初始化,执行主函数代码,打印出value的值123