首先:在继承中,子类不能继承父类的构造器,子类只能调用父类的构造器
分如下四种情况讨论,并在代码中一一验证。
(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--小黑
小黑