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