它不起作用,我不知道为什么......我是java世界的新手。
public class Mixed2 {
public static void main(String[] args) {
A c = new C();
c.m1();
c.m2();
c.m3("My text");
}
}
class A {
void m1() {
System.out.print("A's m1, ");
}
}
class B extends A {
void m2() {
System.out.print("B's m2, ");
}
}
class C extends B {
void m3(Object text) {
System.out.print("C's m3, " + text);
}
}
Mixed2.java:5: error: cannot find symbol
c.m2();
^
symbol: method m2()
location: variable c of type A
Mixed2.java:6: error: cannot find symbol
c.m3("My text");
^
symbol: method m3(String)
location: variable c of type A
2 errors
是因为A没有m2和m3方法?如果我放入A m2和m3它可以工作,但是B m2和C m3被调用。我不明白。
答案 0 :(得分:4)
A
变量,因此此类型不存在m2和m3方法,并且无法在不进行强制转换的情况下使用,这会违背OOP的目的。我会将B中的方法m2()
重命名为m1()
,然后您将获得真正的多态性:
class B extends A {
@Override
public void m1() {
// do you want to call the super's method here?
// if so, then call
// super.m1();
System.out.print("B's m1, ");
}
}
类c的m3方法需要一个参数,因此多态性不会对它起作用,因为它的签名不能与m1的签名相匹配。
修改强>
你在评论中提问:
抱歉是关于继承和。我不知道...是A类型的参考,它保留了C型物体...那么c应该对m3有所了解吗?
您的c变量是引用C对象的A类型变量。只有A方法可用于该变量,除非您明确地将其转换为其他方法:
((C)c).m3("foo");
这是脆弱和丑陋的代码。如果要演示多态,那么子类方法应该覆盖父方法。
答案 1 :(得分:1)
虽然您构建了C
类型的对象,但对象的引用属于A
类型。
您可以这样做,因为C
是A
的子类,但您只能访问A
中声明的方法。