刚开始使用Java。我发现与.NET有许多相似之处,但我发现Java中的所有方法默认都是虚拟的。 所以问题是我能做些什么来使它们不是虚拟的? final
关键字是一种正确的解决方案吗?Java中的非虚拟方法
回答
是的,或私人
但'private' - 就像在.net中一样 - 使得该方法不可用于其他类的调用,以及防止重写。 – 2010-09-01 18:37:38
但是当我需要在子类中使用与父类中相同的名称的方法时,我该怎么办?在C#中,这种情况下有一个新的关键字...在Java中有类似的东西。 – NixDev 2010-09-01 18:44:53
nope,什么也没有 – 2010-09-01 19:14:13
而不是定义的所有方法为final的,你也可以定义整个类为final。我不是在说这种好或坏的风格。
如果你打算让这个方法对于性能来说是非虚拟的,让JIT来处理,直到你有证据表明它没有做。
如果让方法成为非虚拟的原因是为了能够在一个子类中定义它,但不涉及多态性,那么您可能没有真正原因的子类化(发布更多的代码,如果您想对此进行比较)。
如果是为了设计,我建议让班级最终取代个别方法,如果可能的话。 IDEA对班级设计进行了很好的检查。尽量不要过于密切地倾听那些希望你放下所有东西的人的意见,以便他们可以继承问题以解决错误或限制;当你不小心破坏他们的子类时,他们会更大声地对你大喊。
为客户提供一种方法来添加自己的类型而不是子类,他们甚至可能不会注意到您的类是最终的。
使其成为静态。
如果你调用一个非虚方法,那么你想从你的代码中知道你调用的是哪个类方法。 .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中定义的。
否。不要使方法属于对象时为静态方法。这是非常糟糕的设计。 – Cephalopod 2015-04-24 20:32:22
- 1. 虚拟非方法成员
- 2. 虚拟方法比非虚拟方法要慢
- 3. 重载虚拟方法与非虚拟方法有何不同?
- 4. 如何模拟非虚拟方法?
- 5. 在C#中嘲弄非虚拟方法#
- 6. 如何调用(非虚拟)虚拟方法的原始实现?
- 7. 模拟非虚方法C++(gmock)
- 8. 如果类也有非虚拟方法,嘲弄纯虚拟方法?
- 9. 虚拟方法
- 10. C++从实现的虚拟类调用非虚方法
- 11. GMock和模拟非虚拟方法的构造函数
- 12. '虚拟XYZ' VS 'XYZ虚拟' 方法
- 13. java虚拟方法:功能还是bug?
- 14. 从非虚拟父类虚拟类继承的正确方式
- 15. 虚拟方法表
- 16. c#虚拟方法
- 17. TypeMock如何模拟密封类和非虚拟方法?
- 18. 使用/不使用虚拟方法实现纯虚拟方法?
- 19. 带空虚的虚拟方法和纯虚拟方法有什么区别?
- 20. C++:继承重载的非虚拟方法和虚拟方法都具有相同的名称导致问题
- 21. 替换非静态方法java模拟
- 22. 非虚拟的非抽象方法导致“c#虚拟或抽象成员不能私有”
- 23. static_cast和C++中的虚拟方法
- 24. C++中的私有虚拟方法
- 25. 虚拟类中的抽象方法
- 26. C#中的虚拟方法或事件#
- 27. C++中的虚拟与非虚拟多重继承
- 28. 虚拟扩展方法?
- 29. 重写虚拟方法
- 30. 使渲染方法虚拟?
http://download.oracle.com/javase/tutorial/java/IandI/final.html – 2010-09-01 18:36:44
猜猜看,在'C#.NET'中发现了很多与'JAVA'类似的东西......因为我有一些与我父亲的相似之处...... – 2010-09-01 18:38:57
@Garis无法理解你的观点......它是如何与问题相关的? – NixDev 2010-09-01 18:42:12