首页 > 代码库 > 类加载与对象初始化

类加载与对象初始化

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