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
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
其实这也是可以理解的,对于静态代码的加载来说,编译器认为你既然不调用我,那我也不加载你了,因为我就调用你老子的代码就够用了,需要再说。而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();
}
}
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("no args.");
}
}
}像楼主的代码层级多,又没有排版,没法看。
父类静态变量
父类静态块
子类静态变量
子类静态块
父类非静态变量
父类非静态块
父类构造函数
子类非静态变量
子类非静态块
子类构造函数
以你这个例子来说,执行System.out.println(SuperClass.value)会先去执行父类静态块System.out.println("SSClass");,然后执行子类静态变量把value的值初始化为123,然后执行子类静态块,打印System.out.println("SuperClass init!");,然后结束初始化,执行主函数代码,打印出value的值123