错误 继承 接口



以下一系列类和接口编译。但是,在此代码之后,以下类却没有。

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);

   } 
}

在抽象类和覆盖

上查看Oracle文档页面

抽象类是一个被声明为抽象的类 - 它可能包括或不包括抽象方法。摘要类不能实例化,但可以分类。

由于上述原因,下面的语句引发了编译错误(因为ClassA是抽象类,无法实例化(

ClassA twoA = new ClassA(); 

关于您的查询

另外,例如classa_type bla = new classB((?

,这到底是什么意思。

这意味着已经创建了混凝土类ClassBClassA的子类。

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

使用

的优点
ClassA_Type bla = new ClassB()

而不是

ClassB_Type bla = new ClassB()

是:

将来,如果ClassC扩展了Classa,则可以简单地更改

 ClassA_Type bla = new ClassC() 

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

ClassA twoA = new ClassA(); 

您不能这样做,因为班级是抽象的,这意味着只有子类是

的实例
ClassA twoA = new ClassB();

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

您询问的作业是JLS详细解释的"扩大转换"的示例。在那里阅读有关它的信息。

最新更新