很基础总是忘 记录一下 Java 继承加载顺序 class Test0 { public static String staticField = "父类-静态变量"; public String field = "父类-普通变量"; public Test0() { System.out.println("父类-构造器"); } static { System.out.println(staticField); System.out.println("父类-静态初始化块"); } { System.out.println(field); System.out.println("父类-初始化块"); } } public class Test1 extends Test0{ public static String staticField = "子类*静态变量"; public String field = "子类*普通变量"; static { System.out.println(staticField); System.out.println("子类*静态初始化块"); } { System.out.println(field); System.out.println("子类*初始化块"); } public Test1() { System.out.println("子类*子类构造器"); } public static void main(String args[]) { System.out.println("main方法"); Test1 test1 = new Test1(); } } 输出结果为: 父类-静态变量 父类-静态初始化块 子类*静态变量 子类*静态初始化块 main方法 父类-普通变量 父类-初始化块 父类-构造器 子类*普通变量 子类*初始化块 子类*子类构造器
最后给出执行步骤:
1、父类静态变量和静态代码块(先声明的先执行);
2、子类静态变量和静态代码块(先声明的先执行);
3、父类的变量和代码块(先声明的先执行);
4、父类的构造函数;
5、子类的变量和代码块(先声明的先执行);
6、子类的构造函数。
多态中变量和方法
class Fathers{ String var="FatherVar"; static String staticVar="StaticFatherVar"; void method(){System.out.println("Father method");} static void staticMethod(){System.out.println("Static Father method");} } class Sons extends Fathers{ String var="SonVar"; static String staticVar="StaticSonVar"; void method(){System.out.println("Son method");} static void staticMethod(){System.out.println("Static Son method");} String sonVar=null; void sonMethod(){} }public static void main(String[] args) {
// TODO Auto-generated method stub
Fathers f = new Sons();
System.out.println("f.var=" + f.var);
System.out.println("f.staticVar=" + f.staticVar);
Sons ff=(Sons)f;
System.out.println("ff.var=" + ff.var);
System.out.println("ff.staticVar=" + ff.staticVar);
f.method();
f.staticMethod();
}
结果:
f.var=FatherVar
f.staticVar=StaticFatherVar
ff.var=SonVar
ff.staticVar=StaticSonVar
Son method
Static Father method
总结:
成员变量、静态方法按照引用变量声明的类型静态绑定;实例方法按照引用变量引用的实例动态绑定