疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中子类建立对象的初始化流程


 

   

  首先,建立了一个父类Animal 和 子类Dog

  package com.dayuanit.constructor;

  public class Animal {

  String name;

  {

  System.out.println("animal {} 被调用");

  }

  static {

  System.out.println("animal static{} 被调用");

  }

  public Animal() {

  System.out.println("Animal() 被调用");

  }

  public Animal(String name) {

  System.out.println("Animal(String name) 被调用");

  }

  }

  package com.dayuanit.constructor;

  public class Dog extends Animal {

  String name;

  {

  System.out.println("Dog {} 被调用");

  }

  static {

  System.out.println("Dog static{} 被调用");

  }

  public Dog() {

  System.out.println("Dog() 被调用");

  }

  public Dog(String name) {

  System.out.println("Dog(String name) 被调用");

  }

  }

  2、建立个测试类, 第一测试 new 一个无参数的对象Dog

  package com.dayuanit.constructor;

  public class Test {

  public static void main(String[] args) {

  new Dog();

  }

  }

  animal static{} 被调用

  Dog static{} 被调用

  animal {} 被调用

  Animal() 被调用

  Dog {} 被调用

  Dog() 被调用

  结论:看图说话。

  再者, new一个有参数的对象。

  package com.dayuanit.constructor;

  public class Test {

  public static void main(String[] args) {

  new Dog("嘿嘿嘿");

  }

  }

  animal static{} 被调用

  Dog static{} 被调用

  animal {} 被调用

  Animal() 被调用

  Dog {} 被调用

  Dog(String name) 被调用

  此处为何只是调用了 父类的无参数的构造函数呢? 因为在 Dog有参数的构造的第一行系统默认为super();,那就在子类的有参数那儿加个有参数的super看看

  public Dog(String name) {

  super("animal heiheihei");

  System.out.println("Dog(String name) 被调用");

  }

  package com.dayuanit.constructor;

  public class Test {

  public static void main(String[] args) {

  new Dog("嘿嘿嘿");

  }

  }

  结果为:

  animal static{} 被调用

  Dog static{} 被调用

  animal {} 被调用

  Animal(String name) 被调用

  Dog {} 被调用

  Dog(String name) 被调用