2012-08-08 88 views
2

我可以使用java中的子類對象調用父類重寫方法嗎?如何在不使用超級關鍵字的情況下調用超類重寫方法和子類對象?

我試過例如

class First1 
{ 
    void show() 
    { 
    String msg="You are in first class"; 
    System.out.println(msg); 
    } 
} 
class second extends First1 
{ 
    void show() 
    { 
    String msg="You are in second class"; 
    System.out.println(msg);   } 
    } 
} 
class CallingMethod extends second 
{ 
    void show() 
    { 
    String msg="You are in the third class"; 
    System.out.println(msg); 
    } 
    public static void main(String[] args) 
    { 
    CallingMethod cm=new CallingMethod(); 
    cm.show(); 
    } 

}

現在告訴我,如果可以打印下面的 「我在第二類人。」通過在示例中使用cm的CallingMethod類的對象,並且不使用超級關鍵字。

+3

你試過一個例子嗎?如果是這樣,張貼並讓我們知道你有問題。 – kosa 2012-08-08 14:51:50

+6

爲什麼你不想使用super關鍵字?你們讓我們玩這個遊戲的目標是什麼? – 2012-08-08 14:53:44

+0

是的,我做了,我有三個類叫做第一,第二和第三,第二擴展第一,第三擴展第二。並且每個類都有一個方法void show(),我創建了第三個類的對象t,並且我想調用並使用對象t打印第二個類的show()方法。我該怎麼做@thinksteep – P3M 2012-08-08 14:55:52

回答

4

我假設你的意思是從子類之外調用該方法。

然後不,在java中不可能,因爲重寫方法意味着改變了對新類有意義的行爲。

在課堂內部,您可以在任何情況下使用super關鍵字。

注意:使用反射,您可以使用對象進行操作,即語言本身不允許。

注:我測試了這個使用反射,它不起作用。但是當你用C使用JNI你也許可以做到這一點...

//does not work 
class YourClass 
{ 
    public static void main(String[] args) throws SecurityException, 
      NoSuchMethodException, IllegalArgumentException, 
      IllegalAccessException, InvocationTargetException 
    { 
     CallingMethod cm = new CallingMethod(); 
     First1 f = new First1(); 
     // Method m = First1.class.getDeclaredMethod("show"); 
     Method m = First1.class.getMethod("show"); 
     m.invoke(f); 
        //output: You are in first class 
     m.invoke(cm); 
        //output: You are in the third class 
    } 

} 
+0

啊,所以*那是他在說什麼! +1 – erickson 2012-08-08 15:00:55

+0

好的。你怎麼能這麼說呢? – P3M 2012-08-08 15:34:17

+0

@ P3M這是一個很難回答的問題。這裏是[super]的文檔(http://docs.oracle.com/javase/tutorial/java/IandI/super.html)。這就是說我處於這樣的位置,我知道(從閱讀)語言可以做什麼(不僅僅是超級),但我永遠無法確定它不能做那些沒有記錄的事情。也許你的老師想聽聽Reflection。反思允許你訪問私有方法和屬性,它可能允許你做你的老師想要的。從這個角度來看,你可以告訴他,如果你使用C,你幾乎可以用你的java類來做任何事情。 – 2012-08-08 16:02:02

0

是的,這裏有一個例子重寫方法:

http://www.cs.umd.edu/~clin/MoreJava/Objects/overriding.html

+0

這樣你只能調用方法一級。我想問題是關於不止一個級別。像super.super.foo()一樣。我相信這是不可能的。 – 2012-08-08 15:00:17

+0

我沒有覺得它有用..因爲它使用超級關鍵字。 – P3M 2012-08-08 15:32:53

0

可以使用super.overriddenMethod()只要你在孩子課堂內部調用它。

+0

是的,我知道,但問題是我不允許使用super關鍵字,現在呢? – P3M 2012-08-08 15:33:37

0

也許你想是這樣的:

class A 
    method() 
class B extends A 
    method() 
class C extends B 
    method() 
    { 
     //call A.method() 
    } 

這在Java中是不可能的爲好。你只能調用你的直接超類的方法。你永諾需要使用

super 

編輯:這就是爲什麼:

class A 
{ 
    private int positionA; 
    void move() 
    { 
    positionA++; 
    } 
    int getPosition() 
    { 
    return positionA; 
    } 
} 
class B 
{ 
    private int positionB; 

    void move() 
    { 
    positionB++; 
    } 
    int getPosition() 
    { 
    return positionB; 
    } 
} 
A a = new A() 
B b = new B() 

如果運行

b.move() 

然後positionB遞增。你可以從getPosition()的調用中得到你所期望的。

如果你能 b

它會增加positionA運行

A.move() 

。因此,對b.getPosition()的調用不會返回正確的位置。

如果你有

Class C extends B 

你會繞過B的舉動(),如果你能在

this. 

這是同樣的問題,因爲外部類調用

A.move() 

。你的類會表現得很奇怪,這就是Java開發人員不允許它的原因。

+0

你怎麼能這麼說? – P3M 2012-08-08 15:32:24

+0

@ P3M ansered通過編輯我的答案的問題... – 2012-08-08 16:53:49

相關問題