继承静态方法的概念

时间:2013-04-03 04:56:21

标签: java

我有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

在这种情况下后期绑定发生了什么?任何人都可以解释

5 个答案:

答案 0 :(得分:1)

static方法无法覆盖,如果在子类中重新定义,它们仍然是隐藏的。

Ps:他们确实参与了继承。您可以从子类名称访问静态方法。

答案 1 :(得分:1)

这称为动态方法调用。您可以查看this JLS。 它说,

  

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

     

如果调用模式是静态的,则不需要目标引用   不允许覆盖。类T的方法m是一个   调用

     

否则,将调用实例方法并且存在目标   参考。如果目标引用为null,则为NullPointerException   抛出这一点。否则,据说目标参考是指   到目标对象,将用作关键字this的值   在调用的方法中。调用的其他四种可能性   然后考虑模式。

答案 2 :(得分:1)

这是因为静态方法不是 多态 。静态方法不会 重写

答案 3 :(得分:0)

搜索Dynamic method dispatch

静态方法无法被覆盖,这就是为什么在静态方法之后你会得到这样的输出。

答案 4 :(得分:0)

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