我有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 :(得分: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或相同的方法