2014-06-15 49 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中聲明的方法。