我有以下程序,但它不会编译:
public class A {
public void method() {
System.out.println ("bla");
}
}
class AX extends A {
public void method(int a) {
System.out.println ("Blabla");
}
public static void main(String[] args) {
A a2 = new AX();
a2.method(5);
}
}
为什么a2.method(5)不使用子类方法?这种方法不是重载吗?
答案 0 :(得分:1)
只有类A
的方法对编译器可见。这是因为根据a2
,您的对象A
的类型为A a2 = new AX();
。如果您将此行更改为AX a2 = new AX();
,则可以使用。
答案 1 :(得分:1)
也许您会混淆术语overloading
和overriding
。
Overloading
正在添加一个与现有方法同名的不同方法,它在输入参数和返回类型方面有所不同。它与继承无关。从继承的角度看,重载只是添加了一种新方法。你的班级A
不知道,它的继承者新方法是什么。
Overriding
正在用不同的实现替换方法。 A
知道存在一种方法,因此您可以在其后续版AX
中更改它。
你有两种可能性。在public void method(int a)
中定义A
:
public class A {
public void method() {
System.out.println ("bla");
}
public void method(int a) {
System.out.println ("Blabla from A");
}
}
或使用AX
AX a2 = new AX();
a2.method(5);
因为唯一知道public void method(int a)
的班级是AX
。
答案 2 :(得分:0)
由Object type
确定的Java可见性,而不是Reference type
。
在你的情况下:
A a2 = new AX();
Object type A, so compiler can't find method(int a);