Java 继承静态方法中的概念
我有两门课,如下所示Java 继承静态方法中的概念,java,Java,我有两门课,如下所示 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 = n
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
在这种情况下,延迟绑定发生了什么??任何人都可以解释静态方法不能被重写,如果在子类中重新定义,它们仍然是隐藏的
Ps:他们确实参与了继承。您可以从子类名称访问静态方法。
静态方法不能被重写,如果在子类中重新定义,它们将保持隐藏状态
Ps:他们确实参与了继承。您可以从子类名称访问静态方法。这称为动态方法调用。您可以查看JLS。
它说
方法查找的策略取决于调用模式
如果调用模式是静态的,则不需要目标引用,并且
不允许重写。T类的方法m是要使用的方法
调用
否则,将调用一个实例方法,并且存在一个目标
参考资料。如果目标引用为null,则会生成NullPointerException
在这一点上抛出。否则,目标引用称为引用
指向目标对象,并将用作关键字this的值
在调用的方法中。调用的其他四种可能性
然后考虑模式
这称为动态方法调用。您可以查看JLS。
它说
方法查找的策略取决于调用模式
如果调用模式是静态的,则不需要目标引用,并且
不允许重写。T类的方法m是要使用的方法
调用
否则,将调用一个实例方法,并且存在一个目标
参考资料。如果目标引用为null,则会生成NullPointerException
在这一点上抛出。否则,目标引用称为引用
指向目标对象,并将用作关键字this的值
在调用的方法中。调用的其他四种可能性
然后考虑模式
这是因为静态方法不是多态的。静态方法将不会被覆盖 这是因为静态方法不是多态的。静态方法将不会被覆盖 搜索动态方法调度
静态方法不能被覆盖,这就是为什么在将其设置为静态后,您会得到这样的输出。在动态方法调度上搜索
静态方法不能被重写,这就是为什么在将其设置为静态后,您会得到这样的输出。静态方法不能被重写。
您使用statictest类引用变量temp2为较新的类创建了对象,并使用super类引用变量保留该对象。编译时,编译器只需检查该方法在statictest类中是否可用的语法。如果该方法可用,则符合要求,否则会出现错误。您的代码声明了静态打印方法,因此在statictest类编译中可用。完成得很好,但您的方法是静态的,无法重写。现在来看看你宣布的主要方法
statistest temp=new-newer()强>
现在临时对象仅使用statictest类功能创建。它不会包含较新的类方法或变量对象是基于引用的类属性创建的,但它不会包含子类属性(较新的类),如果超类(statictest)包含与子类(较新的类)相同的任何非静态值,则它将覆盖超类属性。为什么它会覆盖?因为类不允许声明相同的变量或相同的方法静态方法不能被重写。
您使用statictest类引用变量temp2为较新的类创建了对象,并使用super类引用变量保留该对象。编译时,编译器只需检查该方法在statictest类中是否可用的语法。如果该方法可用,则符合要求,否则会出现错误。您的代码声明了静态打印方法,因此在statictest类编译中可用。完成得很好,但您的方法是静态的,无法重写。现在来看看你宣布的主要方法
statistest temp=new-newer()强>
现在临时对象仅使用statictest类功能创建。它不会包含较新的类方法或变量对象是基于引用的类属性创建的,但它不会包含子类属性(较新的类),如果超类(statictest)包含与子类(较新的类)相同的任何非静态值,则它将覆盖超类属性。为什么它会覆盖?因为类不允许声明相同的变量或相同的方法从这里得到答案静态方法不被继承你看到了吗。。。从这里得到答案静态方法不是继承的你看到这个了吗。。。它们参与继承,因为您可以通过子类名称访问静态方法,但不具有多态性。它们参与继承,因为您可以通过子类名称访问静态方法,但不具有多态性。