JavaSE-子类实例化对象的过程
package com.btp.t1; //子类对象实例化的全过程 /*1.当最底层子类实例化对象时,它的父类,父类的父类...到Object类的所有类的构造器都会被调用,只不过当一个类拥有多个构造器时,调用的是其中一个。 *2.子类构造器内,默认调用父类构造器:super();当有this关键字时,就不调用父类构造器了,就会调用同一个类内的其他构造器,所以一个类当有n个构造器时,仅允许最多有n-1个构造器内使用this关键字,最少有一个构造器去调用上层父类的构造器。 *3.当父类重载一个构造器,则默认的无形参构造器就会消失,父类又不重载另一个无形参的构造器,那么子类构造器不使用this或super关键字就会出错,因为子类构造器不使用this和super关键字,默认调用父类的无形参构造器,而这个构造器不存在,就会出错,解决办法:1)父类声明一个无形参的构造器2)调用父类另一个参数不为空的构造器 *4.所以建议:创建类时,都创建一个无形参的构造器 *5.当有类实例化对象时,Object类的无形参构造器一定会被调用。 * */ public class Parent { public static void main(String args[]) { // Dog d=new Dog(); // d.setAge(10); // d.setName("花花"); // d.setHostName("小明"); Dog d=new Dog("小黑","狗狗",12); System.out.println("name:"+d.getName()+"年龄:"+d.getAge()+"主人:"+d.getHostName()); } } class Creator { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Creator() {//可以试试把这个构造器注释掉 super(); System.out.println("This is Creator's ()constructor"); } public Creator(int age) { super(); this.age=age; System.out.println("This is Creator's (int)constructor"); } } class Animal extends Creator { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Animal() {
//默认super();
System.out.println("This is Animal's ()constructor");
} public Animal(String name,int age) { super(age); this.name=name; System.out.println("This is Animal's (String,int)constructor"); } } class Dog extends Animal { private String hostName; public String getHostName() { return hostName; } public void setHostName(String hostName) { this.hostName = hostName; } public Dog() { super(); System.out.println("This is Dog's ()constructor"); } public Dog(String hostname,String name,int age) { super(name,age); this.hostName=hostname; System.out.println("This is Dog's (String,String,int)constructor"); } }