Class 被创建:
类变量初始化顺序:
1. 父类与子类中static 变量在内存中分配空间,并初始化为默认值。数据型为0 或0.0 ,boolean 为false,引用类型为null
2. 父类的static 代码块 、static 变量定义 执行(执行顺序看类中代码的顺序,哪个在前哪个先执行)
3.子类的static 代码块 、static 变量定义 执行(执行顺序看类中代码的顺序,哪个在前哪个先执行)
对象实例被创建:
实例 变量初始化顺序:
1.首先在堆中中为父类,子类创建空间,并初始化变量为默认值:数据型为0 或0.0 ,boolean 为false,引用类型为null
1. 父类的 初始化代码块、变量定义执行(执行顺序看类中代码的顺序,哪个在前哪个先执行)
2. 子类的构建器执行
3. 子类的 初始化代码块、变量定义执行(执行顺序看类中代码的顺序,哪个在前哪个先执行)
4. 子类的构建器执行
实例化子类,并赋值给子类型变量或父类型变量,调用其方法时:
由于实际类型为子类,所以都是以子类为准执行方法:
如果子类中有定义,则调用该方法
如果子类中没有定义,父类中有定义,即继承,则执行父类中的方法
实例化子类,并赋值给子类型变量或父类型变量,调用其成员变量时(引用类型.成员变量):
如果是父类型变量,则调用父类型成员变量
如果是子类型变量,则调用子类型成员变量
即:调用方法--》对象实际类型处理,调用成员变量--》按引用变量的声明类型。
public class FatherClass { static { System.out.println("FatherClass static init code piece init :source age value :"+FatherClass.age); age = 80; System.out.println("FatherClass static init code piece init :change age value :"+FatherClass.age); } { System.out.println("FatherClass init code piece init :source name value ="+this.name); name = "father one"; System.out.println("FatherClass init code piece init :change name value ="+this.name); } public FatherClass(){ System.out.println(" FatherClass constructor running ....."); } public void printName(){ System.out.println("FatherClass.printName son.name = "+name); } public static void printAge(){ System.out.println("FatherClass.printAge father.age = "+age); } public void printAgeAndName(){ System.out.println("FatherClass.printAgeAndName age:"+this.age+" ,name:"+this.name); } static int age = 65; String name = "father"; }
public class SonClass extends FatherClass { static { System.out.println("SonClass static init code piece init :source age value :"+SonClass.age); age = 20; System.out.println("SonClass static init code piece init :change age value :"+SonClass.age); } { System.out.println("SonClass init code piece init :source name value ="+this.name); name = "son one"; System.out.println("SonClass init code piece init :change name value ="+this.name); } public SonClass(){ System.out.println(" SonClass constructor running ....."); } public static void printAge(){ System.out.println("SonClass.printAge son.age = "+age); } public void printName(){ System.out.println("SonClass.printName son.name = "+name); System.out.println("SonClass.printName super.name = "+super.name); } public static void main(String args []){ SonClass.printAge(); SonClass son = new SonClass(); son.printName(); son.printAgeAndName(); } static int age = 10; String name = "son"; }
FatherClass static int code piece init :source age value :0 FatherClass static int code piece init :change age value :80 SonClass static init code piece init :source age value :0 SonClass static init code piece init :change age value :20 SonClass.printAge son.age = 10 FatherClass init code piece init :source name value =null FatherClass init code piece init :change name value =father one FatherClass constructor running ..... SonClass init code piece init :source name value =null SonClass init code piece init :change name value =son one SonClass constructor running ..... SonClass.printName son.name = son SonClass.printName super.name = father FatherClass.printAgeAndName age:65 ,name:father