public class Test {
public static void main(String[] args) {
System.out.println("A");
new Test();
new Test();
}
public Test() {
System.out.println("B");
}
{
System.out.println("C");
}
static {
System.out.println("D");
}
}
输出 DACBCB
结论:加载顺序:静态块->构造块->构造方法
这里D在A前因为整个main方法是在这个类里的,要运行main方法,需要先加载这个类。故D在A前
public class Test {
public static void main(String[] args) {
System.out.println(Test2.a);
}
}
class Test2 {
public static final String a = "CS";
static {
System.out.print("DN");
}
}
输出:CS
这里Test2.a的引用是先于Test2这个类加载时输出的。
public class Test {
public static void main(String[] args) {
System.out.println(Test.a);
}
static {
System.out.print("DN");
}
public static final String a = "CS";
}
输出:DNCS
这里是先加载了Test类,再输出
public class Test {
public static void main(String[] args) {
System.out.println(Test2.a);
}
static {
System.out.print("A");
}
public static final String a = "B";
}
class Test2 extends Test {
static {
System.out.print("C");
}
}
输出:AB
Test2 继承Test
Test2.a先加载父类,当子类没有重新定义静态属性则子类的静态属性与父类的静态属性为同一个变量
当子类重新定义了父类静态属性则子类的静态属性与父类的静态属性是两个不同的变量
静态方法调用的是定义这个静态方法的类的静态属性。
public class Test {
public static void main(String[] args) {
System.out.println(Test2.a);
}
static {
System.out.print("A");
}
public static final String a = "B";
}
class Test2 extends Test {
public static final String a = "D";
static {
System.out.print("C");
}
}
输出AD
此时子类重新定义了父类静态属性,与父类的静态属性是两个不同的变量
public class Test {
public static void main(String[] args) {
System.out.println(new Test2().a);
}
static {
System.out.print("A");
}
public static final String a = "B";
}
class Test2 extends Test {
public static final String a = "D";
static {
System.out.print("C");
}
}
输出ACD
new Test2().a就可以加载Test2这个类