美文网首页
#2019-07-26 Java 构造方法的“继承”问题

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

作者: Zeayal | 来源:发表于2019-07-26 13:22 被阅读0次
    来一杯 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 构造方法的“继承”问题

          本文链接:https://www.haomeiwen.com/subject/wvvrrctx.html