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

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

4

5 回答 5

1

static方法不能被覆盖,如果在子类中重新定义,它们将保持隐藏状态。

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

于 2013-04-03T04:58:43.290 回答
1

这称为动态方法调用。你可以看看这个JLS。它指出,

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

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

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

于 2013-04-03T04:59:15.643 回答
1

这是因为静态方法不是多态的。静态方法不会被 覆盖

于 2013-04-03T04:59:23.653 回答
0

搜索Dynamic method dispatch

静态方法不能被覆盖,这就是为什么在将其设为静态后你会得到这样的输出。

于 2013-04-03T05:05:59.440 回答
0

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

于 2013-04-03T05:53:37.623 回答