揭秘子类构造函数执行过程
子父类中的构造函数
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数底层默认第一行有一条隐式的语句 super();
seper(); 会访问呢父类空参数的构造函数,而且子类中的所有构造函数默认第一行都是seper();
为什么子类一定要访问父类中的构造函数?
1.因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
2.所以在子类在对象初始化时,要先访问一下父类中的构造函数。
3.如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
package cn.zhaoqiang.pet; /* * 宠物类,狗狗和企鹅的父类 * */ public class Pet{ private String name = "SeyHello"; //名字 private int health = 100; //健康值 private int love = 10; //亲密度 //无参构造方法 public Pet() { this.health=95; System.out.println("执行宠物的无参构造方法"); } //有参构造方法 public Pet(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public int getLove() { return love; } public void setLove(int love) { this.love = love; } //输出宠物信息 public void print(){ System.out.println("宠物自白:\n我的名字叫:"+this.name+",我的健康值为:"+this.health+",我和主人的亲密度:"+this.love); } }
package cn.zhaoqiang.pet; /* * 宠物类狗狗的子类 * */ public class Dog extends Pet { //品种 private String strain; //有参构造 名字,品种 public Dog(String name,String strain){ super(name);//此出不能使用 this.name=name; this.strain=strain; } public String getStrain(){ return strain; } } package cn.zhaoqiang.pet; /* * 企鹅类,宠物的子类 * */ public class Penguin extends Pet{ private String sex; //性别 //有参构造方法 public Penguin(String name,String sex){ super(name);//此出不能使用 this.name=name; this.sex = sex; } public String getsex(){ return sex; } }
package cn.zhaoqiang.pet; /* * 测试类的继承; * * */ public class Test { public static void main(String[] args) { //创建宠物对象pp并输出信息 Pet pp = new Pet(); pp.print(); //创建狗狗对象dog并输出信息 Dog dog =new Dog("藏獒", "哈吉吧"); dog.print(); //创建企鹅对象pgn并输出信息 Penguin pgn = new Penguin("毛奥","Q妹"); pgn.print(); } }