2013-04-03 121 views
0

我有2类,如下概念在继承静态方法

public class statictest { 

public void print() 
{ 
    System.out.println("first one");  
} 
    } 

public class newer extends statictest 
{ 

public void print() 
{ 

    System.out.println("second one"); 

} 
    } 

,并在主函数中我做

statictest temp = new newer(); 
newer temp2 = new newer(); 

temp.print(); 
temp2.print(); 

输出是:

second one 
second one 

但是当我做这两种方法静态输出是

firstone 
secondone 

在这种情况下晚绑定发生了什么?谁能解释

+0

http://stackoverflow.com/questions/4987127/inheritance-in-static-methods?rq=1从这里得到答案 – JATMON

+0

静态方法是没有继承 –

+0

你见过这个... http://stackoverflow.com/questions/10291949/are-static-methods-inherited-in-java –

回答

1

这就是所谓的动态方法调用。你可以看看this JLS。 它指出,

的方法查找的策略取决于调用模式。

如果调用模式是静态的,因此不需要目标参考和 压倒一切的是不允许的。类T的方法m是被调用的方法m为 。

否则,一个实例方法将被调用,并且存在目标 参考。如果目标引用为空,则此时抛出的NullPointerException为 。否则,目标引用被称为将 引用到目标对象,并将用作被调用方法中关键字 的值。然后考虑调用 模式的其他四种可能性。

1

static方法不能被重写,如果重新定义在子类中,他们仍然隐藏。

PS:他们采取在继承的一部分。您可以从子类名称中访问静态方法。

1

这是因为静态方法不多态性。静态方法将不会是覆盖

+0

他们参加继承,因为你可以通过子类名访问静态方法,但不是多态的。 – Ankit

+0

是的。编辑回复。 – Jayamohan

0

做好搜索上Dynamic method dispatch

静态方法不能被重写,这就是为什么使其静态你得到的输出是这样了。

0

静态方法不能被覆盖。 您使用statictest类引用变量temp2为较新的类创建了对象,通过使用超类引用变量来保存该对象。在编译时,编译器只检查static方法在statictest类中是否可用的语法天气。如果它可用,则符合要求,否则将出现错误。您的代码声明了静态打印方法,因此它在statictest类编译中可用但是你的方法是静态的,它不能被覆盖。现在将要宣布的主要方法是 statictest temp = new newer(); 现在的临时对象仅使用statictest类功能创建。它不会包含更新的类方法或变量如果超类(statictest)包含任何与子类相同的非静态值(新类),它将不包含子类属性(新类)只是它会覆盖超类的属性。为什么它覆盖?因为该类不允许声明相同的变量或相同的方法