2016-11-04 103 views
1

修改的方法我有以下的類名爲A,該方法getValue()如何從另一個類

public class A { 
    public final int getValue() { 
     return 3; 
    } 
} 

的方法getValue()總是返回,那我也叫B另一個類,我需要實現一些東西來訪問方法getValue()A,但我需要返回而不是

B

public class B { 
    public static A getValueA() { 
    return new A(); 
    } 
} 

主類ATest

import org.junit.Test; 
import static org.junit.Assert.assertEquals; 
import org.junit.runners.JUnit4; 

public class ATest { 

    @Test 
    public void testA() { 
     A a = B.getValueA(); 
     assertEquals(
      a.getValue() == 4, 
      Boolean.TRUE 
     ); 
    } 
} 

我試圖覆蓋的方法,但我真的不知道如何得到我想要的東西。任何問題發表評論。

+2

該方法不能被重寫。這是'最終'。 –

回答

2

您不能覆蓋該方法,因爲它是final。若不是final,你可以這樣做:

public static A getValueA() { 
    return new A() { 
     // Will not work with getValue marked final 
     @Override 
     public int getValue() { 
      return 4; 
     } 
    }; 
} 

這種方法創建一個匿名子類中,B,覆蓋方法,並返回一個實例給調用者。根據需要,匿名子類中的覆蓋返回4

+0

@TimeToCode它已經在那裏了:將函數'getValueA'複製粘貼到你的類'B'中,從''''''getValue'中移除'final',進行編譯,它會做你想做的。 'new A()'後面的大括號是擴展'A'的匿名類的主體。 – dasblinkenlight

+0

但方法應該是最終的,這是對問題的限制:/ – TimeToCode

+2

你要求的是不可能的。如果你現在已經寫了'A','someA.getValue()'總是返回3,並且你無能爲力。 –

0

仔細看看你在做什麼:你已經給B類一個工廠方法來創建一個新的A類實例。但是這並沒有改變方法getValue()的實現。

試試這個:

從方法getValue()類A.

刪除final修飾符然後讓B類擴展/繼承類A.

public class B extends A { 
    @Override 
    public int getValue() { 
    return 4; 
    } 
} 

希望這將有助於... =)

致以問候

Al ex

+0

是的,它很明顯,但我有限制,在A班的方法應該永遠是最終的.. – TimeToCode

+0

好吧,我不得不承認,dasblinkenlight更快,也有正確的答案......真是遺憾.. 。=/ – Quurz

+0

@TimeToCode如果你需要這種方法是最終的,你不能做你想做的。這兩個答案都不適用於標記爲最終的方法。 – BackSlash