【发布时间】:2017-07-13 02:03:48
【问题描述】:
来自以下来源:
https://www.amazon.com/Java-Complete-Reference-Herbert-Schildt/dp/0071808558
第 8 章:使用 final 和继承
http://javarevisited.blogspot.com.by/2012/03/what-is-static-and-dynamic-binding-in.html
Static Vs. Dynamic Binding in Java
对于私有、静态、最终方法,早期(静态)方法绑定应该 被使用
。所以我创建了一个小测试
class MethodRefDemo2
{
public static void main( String args[] )
{
BindingTest bindingTest = new BindingTest();
bindingTest.printEarly();
bindingTest.printLate();
}
}
class BindingTest
{
private String early = "static";
private String late = "dynamic";
final String printEarly()
{
return early;
}
String printLate()
{
return late;
}
}
所以我认为,这两种方法应该有不同的绑定类型。检查字节码:
public static main([Ljava/lang/String;)V
L0
LINENUMBER 8 L0
NEW spring/BindingTest
DUP
INVOKESPECIAL spring/BindingTest.<init> ()V
ASTORE 1
L1
LINENUMBER 9 L1
ALOAD 1
INVOKEVIRTUAL spring/BindingTest.printEarly ()Ljava/lang/String;
POP
L2
LINENUMBER 10 L2
ALOAD 1
INVOKEVIRTUAL spring/BindingTest.printLate ()Ljava/lang/String;
POP
L3
LINENUMBER 11 L3
RETURN
L4
LOCALVARIABLE args [Ljava/lang/String; L0 L4 0
LOCALVARIABLE bindingTest Lspring/BindingTest; L1 L4 1
MAXSTACK = 2
MAXLOCALS = 2
在这里我看到两个 INVOKEVIRTUAL 指令。那么有没有办法确定类字节码使用了什么样的绑定呢?如果没有,我如何确定绑定类型?
【问题讨论】: