2014-04-11 58 views
2

继承和多态性如何与静态方法一起工作?有人可以解释什么是适当的输出应该在这里以及它是如何派生的?静态方法的继承和多态性

class A { public static int get() { return 17; } } 
class B extends A { public static int get() { return 42; } } 


Main 
A x = new B(); 
x.get(); 

错误消息,

静态get()方法从A型应以静态方式

我想我知道如何访问到它访问静态的方式,但是这是从课堂上提问和其排序意味着一个或另一个值将返回

在我们的计划,我们的类定义:

class A { public static int get() { return 17; } } 
class B extends A { public static int get() { return 42; } } 

和其他地方,我们声明A x = new B();

什么号码将呼叫x.get()回来吗?

+0

尝试运行它。 –

+0

作为Sotirios指出,'A x = new B();'将返回17在'x.get();''B y = new B();'将在'y.get();'返回42; – Matthew

+0

你可以得到一些特殊的软件,它会告诉你任何Java程序的输出。它非常适合解决这样的问题。你只需要给你的程序,你就可以找出程序的输出结果。我严肃地建议使用这种软件来解决这类问题 - 这将为您节省大量时间。你可以为自己找到答案,而不必信任你从未见过的人。如果你想知道这个惊人的软件叫做什么......它是“Java”。尝试一下。 –

回答

5

的调用将返回int价值17

static方法是不能继承的。

static方法结合并调用基于它们被调用的表达式的类型。

所以

x.get(); 

其中xA类型的调用A的实现。另请注意,static方法不需要调用实例。

这些也会起作用。

((A) null).get(); 
A.get(); 
... 
public static A someMethod() {} 
... 
someMethod().get(); 

你那里得到的消息是警告,而不是错误。

3
static methods are not inherited. 

静态方法属于类,而不是对象。他们属于 该类,因此不适合多态行为

覆盖取决于拥有一个类的实例。多态性的要点是,你可以继承一个类的子类,并且实现这些子类的对象对于在超类中定义的相同方法(并在子类中重写)将具有不同的行为。静态方法不与任何类的任何实例关联,因此这个概念不适用。

推动Java设计的两个因素影响了这一点。 其中一个问题是性能问题:Smalltalk对它的速度太慢了(垃圾收集和多态调用是其中的一部分),Java的创建者决心避免这种情况。另一个决定是Java的目标受众是C++开发人员。让静态方法的工作方式有着对C++程序员熟悉的好处,而且速度也非常快,因为没有上级类层次结构来确定要调用哪种方法,而是直接进入类并调用指定的方法。

参见this page