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");
}
}