#2019-07-26 Java 构造方法的“继承”问题

#2019-07-26 Java 构造方法的“继承”问题_第1张图片
来一杯 java 岛的☕️

图片来源: http://openarc.edu.lk/wp-content/uploads/2015/11/java-100432255-primary.idge_.jpg

2019-07-26 Java 构造方法的“继承”问题

问题描述:
父类: Animal.java,子类:Dog.java ,调试入口类:Test.java
如果 Animal 实现了一个有参数 Animal(int age, String name)的构造方法,Dog 继承 Animal,Dog 并未实现任何方法,在 Demonew Dog() 会报错,说找不到构造方法。

以下为三个类文件内容

父类:Animal.java


public class Animal {
    int age = 10;
    String name = "animal";

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

子类:Dog.java

// 并未实现任何方法和属性
public class Dog extends Animal {

}

main 方法入口类:Test.java

public class Demo {
    public static void main(String string[]) {

        Dog dog = new Dog();
        System.out.println("dog.age = " + dog.age);
    }
}

运行 Test.java main 方法出现问题

父类 Animal 实现有参数的构造方法,子类 Dog 不实现构造方法,会报错

Error:(3, 8) java: constructor Animal in class inherit.Animal cannot be applied to given types;
  required: int,java.lang.String
  found: no arguments
  reason: actual and formal argument lists differ in length

解析

报错原因:

  1. 如果父类 Animal 中不实现构造方法,编译器会自动隐式实现一个无参的构造方法 Animal(){}
  2. 如果父类 Animal 中实现了构造方法,编译器不会自动实现无参的构造方法Animal(){},所以报错

解决方案,有好多种,具体看自己需求(以下演示两种):

1、在父类 Animal.java 中手动实现无参的构造方法 public Animal(){}
2、在子类 Dog.java 中实现无参数的构造方法 ,并且调用父类中已有的构造方法:

public Dog(){
  // 调用父类中已有的构造方法
  super(4, '小花');
}

总结:java 的单继承模式的有优点很明显,不会出现 c++ 多继承的坑。但是隐式实现的构造方法确实是困扰初学者的问题,自己还是多做实验,多写,多问。

你可能感兴趣的:(#2019-07-26 Java 构造方法的“继承”问题)