看到许多人都会迷惑JAVA类的初始化顺序,有时间自己也要看下书做下测试才能明白。所以记下来,其中的原理关于编译和JVM比较罗索,自行查书吧……
1.基类静态变量初始化或静态代码块执行,它们的顺序按照字面出现的顺序
2.派生类的 静态变量初始化或静态代码块执行,它们的顺序按照字面出现的顺序
3.基类实例变量初始化
4.基类代码块执行
5.基类构造方法执行
6.派生类实例变量初始化
7.派生类代码块执行
8.派生类构造方法执行
注意:上传调用时,变量为声明引用类型的变量值;调用方法则为创建对象(NEW)时类型的方法。
其实就是类加载时执行静态变量和静态代码块(只执行一次),然后实例变量和代码块,最后是构造(每次new 的时候都执行)。
package com.sing.demo;
class A {
String name = isName();
static String as = print();
public static String print(){
System.out.println("A.static .args()........");
return "";
}
String isName() {
System.out.println("222222222");
return "a";
}
A() {
System.out.println("333333333");
}
static {
System.out.println("A.static.block........");
}
}
class B extends A {
String name = isNameb();
String isNameb() {
super.isName();
System.out.println("1111111111");
return "b";
}
static {
System.out.println("B.static block........");
}
{
System.out.println("B.block........");
}
static String bs = print();
public static String print(){
System.out.println("B.static .args()........");
return "";
}
}
public class Demo {
public static void main(String[] args) {
A a = new B();
// System.out.println(a.name);
// new A();
}
}