1. 初始化原因:避免发生空指向异常。
2. 类加载与初始化的顺序:
2.1 类加载时间:
每个类的编译代码都存在于他自己的独立文件中,该文件的加载通常发生在创建类的第一个对象时,或是访问类的static域或static方法时。
2.2 初始化顺序:(先父类后子类,创建对象之前先对类中的域进行初始化)
首先,类加载器主动加载主类(主类的初始化顺序与下面普通类一样),找到main方法,在main方法中根据第一行要创建的对象,加载该类的字节码文件,如果编译器注意到她有基类(这是由extends关键字得知)则继续加载(,不管是否需要创建基类对象,这都要发生。)在根基类中首先的static初始化,static代码块,依次是子类,至此类加载和静态初始化及静态代码快的执行已经完毕,对象就可以被创建。首先对象中所有的域都会设为默认值,然后在调用父类的构造方法之前普通域会被初始化,依次执行直到完成初始化工作。
3. 代码验证:
class Person{
private static String city = "shanxi" ;
private String name = new String("wh") ;
private String age ;
static{
System.out.println(city+"perosn静态代码块");
}
{
System.out.println(name+"普通块"+age);
}
public Person(String name,String age){
System.out.println(city+"---------->"+this.name+"----------->"+this.age);
this.name = name ;
this.age = age ;
System.out.println(city+"---------->"+this.name+"----------->"+this.age);
}
}
class Student extends Person{
private static String school = "xd" ;
private String sname = new String("sn") ;
private String sage ;
static{
System.out.println(school+" student静态代码块");
}
{
System.out.println(sname+" student普通块"+sage);
}
public Student(String name,String age){
super(name,age) ;
System.out.println(Student.school+"------------>"+this.sname+"------->"+this.sage);
this.sname = name ;
this.sage = age ;
System.out.println(Student.school+"------------>"+this.sname+"------->"+this.sage);
}
}
public class InitSort {
public static void main(String[] args) {
Student s1 = new Student("cjt","23") ;
Student s2 = new Student("cjr","21") ;
}
}
输出:
shanxiperosn静态代码块
xd student静态代码块
wh普通块null
shanxi---------->wh----------->null
shanxi---------->cjt----------->23
sn student普通块null
xd------------>sn------->null
xd------------>cjt------->23
wh普通块null
shanxi---------->wh----------->null
shanxi---------->cjr----------->21
sn student普通块null
xd------------>sn------->null
xd------------>cjr------->21