以下代码是否将后期绑定应用于静态方法?多态性 Java
Did this following code apply late binding onto a static method? Polymorphism Java
所以我在Java中玩弄以了解多态性的概念,然后我写了这个:
public class Practice
{
public static void main(String[] args)
{
Parent p = new Child();
p.instanceMethod();
}
}
class Child extends Parent {
public void instanceMethod(){
System.out.println("child's instance method");
staticMethod();
}
public static void staticMethod() {
System.out.println("child's static method");
}
}
class Parent {
public void instanceMethod(){
System.out.println("parent's instance method");
staticMethod();
}
public static void staticMethod() {
System.out.println("parent's static method");
}
}
所以输出是:
child's instance method
child's static method
为什么静态方法是从 child 的 class 而不是从它的静态类型 Parent 的 class 调用的?
是不是因为,它首先被child的class中的实例方法调用,所以此时它的类型已经是完全动态的,又名child的类型?
静态方法不'do'多态。完全没有。
non-static(即实例)方法可以。方法的 signature 是完全静态绑定的;在类型层次结构中找到实际 运行 方法的实际前景完全是动态完成的(后期绑定)。
对于静态方法,整个事情都是完全静态的。
那么,让我们看一下这段代码:
p.instanceMethod()
表达式 p
的类型为 Parent
。编译器查看 Parent
及其所有超类型中可用的签名,并确定此 instanceMethod()
调用尝试调用的完整方法签名是 void instanceMethod()
。此调用(字节码中的 Parent
::instanceMethod()V
)在发出的 .class 文件中进行编码。
在 运行 时间,系统检查 p
表达式解析的实际 运行 时间类型(即您之前所做的 new Child()
),并进行动态调度。选择并执行 Child
的 public void instanceMethod()
,它显然覆盖了 Parent
中的 public void instanceMethod()
,因此打印了 "child's instance method"
。
staticMethod()
在 Child
接下来,让我们看一下 staticMethod 调用:在编译时,javac 确定这显然是对 Child
中 staticMethod()
的引用。它在字节码中将 INVOKESTATIC
字节码编码为 Child
::staticMethod()V
。动态分派现在或从未应用于静态方法调用。
在 运行 时..调用了该方法。
就这么简单。
也许您希望静态方法仍然首先检查调用上下文,但这不是 java 的工作方式。
所以我在Java中玩弄以了解多态性的概念,然后我写了这个:
public class Practice
{
public static void main(String[] args)
{
Parent p = new Child();
p.instanceMethod();
}
}
class Child extends Parent {
public void instanceMethod(){
System.out.println("child's instance method");
staticMethod();
}
public static void staticMethod() {
System.out.println("child's static method");
}
}
class Parent {
public void instanceMethod(){
System.out.println("parent's instance method");
staticMethod();
}
public static void staticMethod() {
System.out.println("parent's static method");
}
}
所以输出是:
child's instance method
child's static method
为什么静态方法是从 child 的 class 而不是从它的静态类型 Parent 的 class 调用的?
是不是因为,它首先被child的class中的实例方法调用,所以此时它的类型已经是完全动态的,又名child的类型?
静态方法不'do'多态。完全没有。
non-static(即实例)方法可以。方法的 signature 是完全静态绑定的;在类型层次结构中找到实际 运行 方法的实际前景完全是动态完成的(后期绑定)。
对于静态方法,整个事情都是完全静态的。
那么,让我们看一下这段代码:
p.instanceMethod()
表达式 p
的类型为 Parent
。编译器查看 Parent
及其所有超类型中可用的签名,并确定此 instanceMethod()
调用尝试调用的完整方法签名是 void instanceMethod()
。此调用(字节码中的 Parent
::instanceMethod()V
)在发出的 .class 文件中进行编码。
在 运行 时间,系统检查 p
表达式解析的实际 运行 时间类型(即您之前所做的 new Child()
),并进行动态调度。选择并执行 Child
的 public void instanceMethod()
,它显然覆盖了 Parent
中的 public void instanceMethod()
,因此打印了 "child's instance method"
。
staticMethod()
在 Child
接下来,让我们看一下 staticMethod 调用:在编译时,javac 确定这显然是对 Child
中 staticMethod()
的引用。它在字节码中将 INVOKESTATIC
字节码编码为 Child
::staticMethod()V
。动态分派现在或从未应用于静态方法调用。
在 运行 时..调用了该方法。
就这么简单。
也许您希望静态方法仍然首先检查调用上下文,但这不是 java 的工作方式。