2016-11-04 105 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