初始化顺序

package lcy;
 
public class Test6 {
 
 /** 
  * 方法描述:移动端—
  * 创建人:汪俊 
  * 创建时间:2017-8-1 上午09:01:37 
  * 修改人:汪俊 
  * 修改时间:2017-8-1 上午09:01:37 
  * 修改备注: 
  * @version V1.0 
  */
  //静态变量 
  static String i=lcy();
  public static String lcy()
  {
   System.out.println("父类静态变量");
   return "静态变量";
  }    
  //静态语句块
  static {
      System.out.println("父类静态语句块1");
  }
  //静态语句块
  static {
      System.out.println("父类静态语句块2");
  }
  //静态语句块
  static{
      System.out.println("父类静态语句块3");
  }
  
  //非静态变量 
  String j=pplcy();
  public String pplcy()
  {
   System.out.println("父类非静态变量");
   return "父类非静态变量";
  }    
  //非静态语句块
  {
    System.out.println("父类非静态语句块1");
  }
  //非静态语句块
  {
    System.out.println("父类非静态语句块2");
  }
  //非静态方法
  public void bDisplay(){
      System.out.println("父类非静态方法");
      return ;
  }
  //静态方法
  public static void bTest(){
      System.out.println("父类静态方法");
      return ;
  }
  //构造函数
  public Test6(){
      System.out.println("父类构造函数");
  }
 
  
  public static void main (String args[]) {
   Test6 a=new Test6();
   a.bDisplay();
   a.bTest();
   
     }
}

结论:在初始化类时候,首先加载类的静态变量和静态语句块(按照代码上下顺序执行),然后加载类的非静态变量和非静态语句块(按照代码上下顺序执行),最后加载类的构造函数。

至于类的静态方法和非静态方法只有主动调用的时候才会执行,区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。

 

以下是有子类的情况:

package lcy;
 
public class Test7 extends Test6 {
 
 /** 
  * 方法描述:移动端—
  * 创建人:汪俊 
  * 创建时间:2017-8-1 上午09:01:37 
  * 修改人:汪俊 
  * 修改时间:2017-8-1 上午09:01:37 
  * 修改备注: 
  * @version V1.0 
  */
  //静态变量 
  static String a=lcyhh();
  public static String lcyhh()
  {
   System.out.println("子类静态变量");
   return "静态变量";
  }    
  //静态语句块
  static {
      System.out.println("子类静态语句块1");
  }
  //静态语句块
  static {
      System.out.println("子类静态语句块2");
  }
  //静态语句块
  static{
      System.out.println("子类静态语句块3");
  }
  
  //非静态变量 
  String b=ppplcy();
  public String ppplcy()
  {
   System.out.println("子类非静态变量");
   return "子类非静态变量";
  }    
  //非静态语句块
  {
    System.out.println("子类非静态语句块1");
  }
  //非静态语句块
  {
    System.out.println("子类非静态语句块2");
  }
  //非静态方法
  public void bDisplay(){
      System.out.println("子类非静态方法");
      return ;
  }
  //静态方法
  public static void bTest(){
      System.out.println("子类静态方法");
      return ;
  }
  //构造函数
  public Test7(){
      System.out.println("子类构造函数");
  }
  
}

运行结果分析②:


Test6 a=new Test6(); //在父类Test6中执行结果,和
运行结果分析①完全相同

Test6 a=new Test6(); //在子类Test7中执行结果如下

父类静态变量

父类静态语句块1

父类静态语句块2

父类静态语句块3

子类静态变量

子类静态语句块1

子类静态语句块2

子类静态语句块3

父类非静态变量

父类非静态语句块1

父类非静态语句块2

父类构造函数

结论:在初始化父类Test6的时候,首先加载父类的静态变量和静态语句块(按照代码上下顺序执行),然后加载子类的静态变量和静态语句块(按照代码上下顺序执行),然后加载父类的非静态变量和非静态语句块(按照代码上下顺序执行),最后加载父类的构造函数。

 

posted on 2021-11-26 21:07  Krcoding  阅读(49)  评论(0)    收藏  举报