以下一系列类和接口编译。但是在这段代码之后,下面的类没有。
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);
}
}
答案 0 :(得分:2)
ClassA twoA = new ClassA();
你不能这样做,因为ClassA是抽象的,意味着只有子类可以是例如
的实例ClassA twoA = new ClassB();
答案 1 :(得分:2)
抽象类是一个声明为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详细解释了这一点。在那里阅读它。