2010-09-01 83 views
7

刚开始使用Java。我发现与.NET有许多相似之处,但我发现Java中的所有方法默认都是虚拟的。 所以问题是我能做些什么来使它们不是虚拟的? final关键字是一种正确的解决方案吗?Java中的非虚拟方法

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html – 2010-09-01 18:36:44

+5

猜猜看,在'C#.NET'中发现了很多与'JAVA'类似的东西......因为我有一些与我父亲的相似之处...... – 2010-09-01 18:38:57

+5

@Garis无法理解你的观点......它是如何与问题相关的? – NixDev 2010-09-01 18:42:12

回答

8

是的,或私人

+5

但'private' - 就像在.net中一样 - 使得该方法不可用于其他类的调用,以及防止重写。 – 2010-09-01 18:37:38

+2

但是当我需要在子类中使用与父类中相同的名称的方法时,我该怎么办?在C#中,这种情况下有一个新的关键字...在Java中有类似的东西。 – NixDev 2010-09-01 18:44:53

+1

nope,什么也没有 – 2010-09-01 19:14:13

2

而不是定义的所有方法为final的,你也可以定义整个类为final。我不是在说这种好或坏的风格。

6

如果你打算让这个方法对于性能来说是非虚拟的,让JIT来处理,直到你有证据表明它没有做。

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

如果是为了设计,我建议让班级最终取代个别方法,如果可能的话。 IDEA对班级设计进行了很好的检查。尽量不要过于密切地倾听那些希望你放下所有东西的人的意见,以便他们可以继承问题以解决错误或限制;当你不小心破坏他们的子类时,他们会更大声地对你大喊。

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

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中定义的。

+2

否。不要使方法属于对象时为静态方法。这是非常糟糕的设计。 – Cephalopod 2015-04-24 20:32:22