java中对象的初始化顺序

class HelloA {
  public HelloA() {
  System.out.println("HelloA");
  }
  { System.out.println("I'm A class"); }
  static { 
  System.out.println("static A");
  } }
public class HelloB extends HelloA {   public HelloB() {   System.out.println("HelloB");   }   { System.out.println("I'm B class"); }   static {
    System.out.println("static B");
}   
public static void main(String[] args) {     System.out.println("main() start");     new HelloB();     System.out.println("main() end"); } }

运行结果为:

static A
static B
main() start
I'm A class
HelloA
I'm B class
HelloB
main() end

对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

class People {
  String name;
  public People() {
    System.out.print(1);
  }
  public People(String name) {
    System.out.print(2);
    this.name = name;
  }
}
class Child extends People {
  People father;
  public Child(String name) {
    System.out.print(3);
    this.name = name;
    father = new People(name + ":F");
  }
  public Child() {
    System.out.print(4);
  }
  }
new Child("mike")

输出132

第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super();  这样就会调用父类没有参数的构造方法。    

第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。

 转自https://www.cnblogs.com/LoganChen/p/6391532.html

原文地址:https://www.cnblogs.com/kavins/p/8514509.html