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