错误+继承+接口

时间:2017-05-04 15:49:02

标签: java inheritance interface

以下一系列类和接口编译。但是在这段代码之后,下面的类没有。

public abstract class ClassA {
    public void methodOne() {
        System.out.println("Hello from methodOne.");
    }

    public int methodTwo(int a, int b) {
        return a + b;
    }

    public abstract int methodThree(int a, int b);
}

public interface InterfaceA {
    int methodOne(int a, int b);
}

public class ClassB extends ClassA {
    public int methodOne(int a) {
        return 5 * a;
    }

    public int methodTwo(int a, int b) {
        return 2 * super.methodTwo(a, b);
    }

    public int methodThree(int a, int b) {
        return a * b;
    }
}

public class ClassC extends ClassB implements InterfaceA {

    public int methodOne(int a, int b) {
        return a % b;
    }

    public int methodThree(int a, int b) {
    return a ‐ b;
}

    public void methodFour(int a) {
        System.out.println("Here is number: " + a);
    }
}

public class ClassD extends ClassC {
    public void methodFour(int a, int b) {
        System.out.println("Here is the sum: " + (a + b));
    }

}

以下类中的以下输出在编译期间会出错,但为什么呢?此外,例如,当ClassA_Type bla = new ClassB()?

时,它究竟意味着什么
public class SomeClass {
    public static void main(String[] args) {

        ClassA oneA = new ClassB();
        System.out.println(oneA.methodOne(5));

        InterfaceA oneIA = new ClassD();
        oneIA.methodFour(6, 7);


   } 
}

3 个答案:

答案 0 :(得分:2)

ClassA twoA = new ClassA(); 

你不能这样做,因为ClassA是抽象的,意味着只有子类可以是例如

的实例
ClassA twoA = new ClassB();

答案 1 :(得分:2)

查看abstract classesoverriding

上的oracle文档页面
  

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类不能被实例化,但它们可以被子类化。

由于上述原因,下面的语句会抛出编译错误(因为ClassA是抽象类而无法实例化)

ClassA twoA = new ClassA(); 

关于

的查询
  

另外,例如,当ClassA_Type bla = new ClassB()时究竟是什么意思?

这意味着已创建具体类ClassB,即ClassA的子类。

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。在这种情况下,抽象方法methodThree已在ClassB中实现。

使用

的优势
ClassA_Type bla = new ClassB()

而不是

ClassB_Type bla = new ClassB()

是:

将来,如果ClassC扩展了ClassA,您只需更改

即可
 ClassA_Type bla = new ClassC() 

可以使用任何具体实现来实例化基类

答案 2 :(得分:0)

oneIA.methodFour(6, 7);无法编译,因为InterfaceA没有方法methodFour。编译器只能识别变量的声明类型的成员。

您询问的作业是“扩大转化”的示例,JLS详细解释了这一点。在那里阅读它。