2014-06-15 46 views
0

它不工作,我不知道为什么...我是新的Java世界。我不明白关于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 

是因为没有M2和M3的方法呢?如果我出过M2和M3它的工作原理,而B 2和C M3被调用。我不明白。

+1

你的参考是一个'A'。所以即使运行时类型是'C',编译器也无法知道这一点。您只能从对“A”的引用访问'A'中定义的方法。 –

回答

4
  1. 在代码中没有使用多态。
  2. 您的变量是一个A变量,因此m2和m3方法不存在此类型,并且不能在没有转换的情况下使用,这会破坏OOP的目的。

我会在B到m1()重命名方法m2(),然后你会得到真正的多态性

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类型变量。只有方法将提供给该变量,除非你明确地将其转换为别的东西:

((C)c).m3("foo"); 

这是脆,丑陋的代码。如果你想演示多态,那么你的子类方法应该重写父方法。

+0

抱歉是关于继承和。我不知道......是类型A的参考,它保持C类型的对象...然后c应该对m3有所了解? – user3743026

+0

@ user3743026:请参阅编辑以回答。 –

1

尽管您构造了一个类型为C的对象,但该对象的引用类型为A
您可以这样做,因为CA的子类,但只能访问在A中声明的方法。