以下一系列类和接口编译。但是,在此代码之后,以下类却没有。
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((?
,这到底是什么意思。
这意味着已经创建了混凝土类ClassB
,ClassA
的子类。
当摘要类别分类时,该子类通常为其父类中的所有抽象方法提供实现。在这种情况下,抽象方法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详细解释的"扩大转换"的示例。在那里阅读有关它的信息。