JAVA面向对象--继承:子类对父类构造器继承问题总结

本文详细探讨了JAVA中继承时,子类与父类构造器的关系。从父类无构造器,仅有无参构造器,仅有有参构造器,到同时拥有无参和有参构造器四种情况,通过实例代码逐一验证了子类如何调用父类构造器。总结了子类在不同情况下调用父类构造器的规则和注意事项。

首先:在继承中,子类不能继承父类的构造器,子类只能调用父类的构造器

分如下四种情况讨论,并在代码中一一验证。

(1)父类没有构造器

父类代码:

public class Annamal {
	public String run;
	public String eat;

	public  void getRun() {
		System.out.println(" Annamal is run!");
	}
	public void setRun(String run) {
		this.run = run;
	}
	public void getEat() {
		System.out.println(" Annamal is eat!");
	}
	public void setEat(String eat) {
		this.eat = eat;
	}
}

 

子类代码:

public class Dog extends Annamal{
	 
   private String name;
   private String sex;
   
   
   public Dog(){ //无参构造
	   
	    System.out.println("--无参构造--Dog--");
   }
   
    
   public Dog(String name,String sex){ //有参构造
	   
	    System.out.println("--有参构造--Dog--"+name);
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}  
}

演示代码:

public class TestDemo {
	
	public static void main(String[] args){
		
		Dog d1 = new Dog();
		Dog d2 = new Dog("小黑","Man");
		System.out.println(d2.getName());
		
	}
}

输出结果:

--无参构造--Dog--
--有参构造--Dog--小黑
小黑

(2)父类只有无参构造器

 

父类代码:

public class Annamal {
	public String run;
	public String eat;
	
	public Annamal(){ //无参构造
	System.out.println("--无参构造--Annamal--");
   }

	public  void getRun() {
		System.out.println(" Annamal is run!");
	}
	public void setRun(String run) {
		this.run = run;
	}
	public void getEat() {
		System.out.println(" Annamal is eat!");
	}
	public void setEat(String eat) {
		this.eat = eat;
	}
}

子类代码:

public class Dog extends Annamal{
	 
   private String name;
   private String sex;
   
   public Dog(){//无参构造
	   
	    System.out.println("--无参构造--Dog--");
   }
   
   public Dog(String name,String sex){//有参构造
	   
	    System.out.println("--有参构造--Dog--"+name);
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}  
}

演示代码:

public class TestDemo {
	
	public static void main(String[] args){
		
		Dog d1 = new Dog();
		Dog d2 = new Dog("小黑","man");
		System.out.println(d2.getName());
		
	}
}

输出结果:

--无参构造--Annamal--
--无参构造--Dog--
--无参构造--Annamal--
--有参构造--Dog--小黑
小黑

(3)父类只有有参构造器

父类代码:

public class Annamal {
	public String run;
	public String eat;
	
	public Annamal(String name){
	System.out.println("--有参构造--Annamal-- "+name);
}
	public  void getRun() {
		System.out.println(" Annamal is run!");
	}
	public void setRun(String run) {
		this.run = run;
	}
	public void getEat() {
		System.out.println(" Annamal is eat!");
	}
	public void setEat(String eat) {
		this.eat = eat;
	}
}

此时子类代码报错,如图所示

鼠标放在红色×号上,提示:“Annamal() is undefined”

 

修改后的子类代码:

public class Dog extends Annamal{
	 
   private String name;
   private String sex;
   
   public Dog(){//无参构造
	   
	    //子类显示调用父类构造器,用super关键字。注意,super里的参数(个数和类型)要和父类有参构造器里的对应
	    super("子类无参构造器,显式调用父类有参构造器"); 
	    System.out.println("--无参构造--Dog--");
   }
   
   public Dog(String name,String sex){//有参构造
	    super("子类有参构造器,显式调用父类有参构造器");
	    System.out.println("--有参构造--Dog--"+name);
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}  
}

 

演示代码:

public class TestDemo {
	
	public static void main(String[] args){
		
		Dog d1 = new Dog();
		Dog d2 = new Dog("小黑","man");
		System.out.println(d2.getName());
		
	}
}

输出结果:

--有参构造--Annamal-- 子类无参构造器,显式调用父类有参构造器
--无参构造--Dog--
--有参构造--Annamal-- 子类有参构造器,显式调用父类有参构造器
--有参构造--Dog--小黑
小黑

(4)父类既有无参构造器,又有有参构造器

父类代码:

public class Annamal {
	public String run;
	public String eat;
	
	public Annamal(){ //无参构造
	System.out.println("--无参构造--Annamal--");
}

	public Annamal(String name){//有参构造
	System.out.println("--有参构造--Annamal-- "+name);
}

	public  void getRun() {
		System.out.println(" Annamal is run!");
	}
	public void setRun(String run) {
		this.run = run;
	}
	public void getEat() {
		System.out.println(" Annamal is eat!");
	}
	public void setEat(String eat) {
		this.eat = eat;
	}
}

此时,子类仍用super显式调用,编译不报错,运行结果也正确。如图所示:

下面把子类的显式调用super去掉。

子类代码:

public class Dog extends Annamal{
	 
   private String name;
   private String sex;
   
   public Dog(){//无参构造
	   
	    System.out.println("--无参构造--Dog--");
   }
   
   public Dog(String name,String sex){//有参构造

	    System.out.println("--有参构造--Dog--"+name);
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}  
}

演示代码:

public class TestDemo {
	
	public static void main(String[] args){
		
		Dog d1 = new Dog();
		Dog d2 = new Dog("小黑","man");
		System.out.println(d2.getName());
		
	}
}

输出结果:

--无参构造--Annamal--
--无参构造--Dog--
--无参构造--Annamal--
--有参构造--Dog--小黑
小黑

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值