Java中的非虚方法

时间:2010-09-01 18:34:43

标签: java virtual-method

刚开始使用Java。我发现.NET有许多相似之处,但我发现Java中的所有方法都是虚拟的。 所以问题是如何才能使它们成为非虚拟的呢? final关键字是唯一正确的解决方案吗?

4 个答案:

答案 0 :(得分:8)

是,或私人

答案 1 :(得分:6)

如果您的目标是使该方法非虚拟性能,那么让JIT处理它,直到您有证据表明它没有。

如果使方法非虚拟的原因是能够在子类中定义它但不涉及多态,那么你可能没有真正的原因进行子类化(如果你想对此进行比较,可以发布更多代码)

如果是设计,我建议尽可能使课程最终而不是单独的方法。 IDEA对班级设计进行了很好的检查。尽量不要过于密切地倾听那些希望你把所有东西都打开的人,以便他们可以继承黑客攻击错误或限制;当你不小心打破他们的子类时,他们会大声喊叫。

为客户提供一种方法来添加他们自己的类型而不是子类,他们甚至可能不会注意到你的类是最终的。

答案 2 :(得分:2)

您可以将整个类定义为final,而不是将所有方法定义为final。我不是说这种好坏风格。

答案 3 :(得分:1)

让它静止。

如果你调用非虚方法,那么你想从你的代码中知道你正在调用哪个类方法。 .net的缺陷是你无法从你的代码中知道这一点。

示例

在Java中,如果将ClassB定义为

public class ClassB extends ClassA {
    @Override 
    public void run() {
    }
}

和对象

ClassA obj=new ClassB();

如果你调用obj.run(),你怎么知道该代码是否遵循多态打开/关闭原则的规则,或者它将编写与ClassA相关的方法?在Java中,您将知道总是存在多态性。制作模拟更容易,并且更容易扩展类并遵循Liskov替换原则。

另一方面,静态方法与类有关,因此如果要调用与ClassA相关的方法,可以像这样定义该方法:

public static run(ClassA obj)

你可以用

来调用它
ClassB obj=new ClassB();
ClassA.run(obj);

从代码中您将知道您调用的方法是在ClassA中定义的,而不是在ClassB中定义。