java中方法调用(invokevirtual,invokespecial)
本帖最后由 smallfoxxizo 于 2014-01-19 21:57:26 编辑
public class SperClass {
private void interestingMethod(){
System.out.println(this.getClass().getSimpleName());
System.out.println("superclass interesting method");
}
void exampleMethod(){
System.out.println(this.getClass().getSimpleName());
interestingMethod();
}
}
public class Subclass extends SperClass {
void interestingMethod() {
// TODO Auto-generated method stub
//super.interestingMethod();
System.out.println("subclass interesting method");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Subclass me = new Subclass();
me.exampleMethod();
}
}
程序的运行如果是:
Subclass
Subclass
superclass interesting method
java的方法调用中指令:invokevirtual和invokeespecial有区别是,前一个是按对象的实际类型调用方法,后一个是按对象的引用类开调用方法。
在上面那个程序中:
main方法首先生成了subclass的实例me,并把这个对象的引用存在main方法的局部变量表中,
调用实例me的方法exampleMethod()调用的指令是invokevirtual,并把对象的引用类型放到这个方法的局部变量表的0位置。这时引用对象的实际类型是subclass,在方法放入了this.getclass().getsimplename()显示了这一点。
在方法exampleMethod方法中调用了interestingMethod方法,这个方法的调用是用指令invokeespecial(调用了私有方法)这个方法的调用了父类的interestingMethod方法。也就是说方法局部变量表中的引用类型变成了sperclass.
我不明白的是,在main方法中引用类型是subclass,这个引用类型是什么时候变成了sperclass,是怎么变是,什么时候变的。我在程序中加入的this显示方法局部变量表中第一项引用对象的实际类型还是subclass,望大神指点。
------解决思路----------------------
这个还真是不好翻译,只是大体明白怎么回事。。。
返回当前对象的运行时类,返回的类为:所对应类的static synchronized方法锁定的那个类(这个可能涉及到Java对象方法的调用机制,不看Java标准是解释不了的。。。)。The actual result type is {@code Class extends
------解决思路----------------------
X
------解决思路----------------------
>} where {@code
------解决思路----------------------
X
------解决思路----------------------
} is the erasure of the static type of the expression on which {@code getClass} is called.
结果就是继承自
------解决思路----------------------
X
------解决思路----------------------
的某个类,而
------解决思路----------------------
X
------解决思路----------------------
就是getClass方法在哪个类中被调用的,结果其实就是返回该对象的最远代子类,其实也就是重载了。就相当于你调用父类的toString()会调子类的toString()一样。
第一次调用getClass是me.exampleMethod(),虽然Subclass没有exampleMethod是继承来的,但是,你是用的显示调用,就是在Subclass中调用的,没问题;而第二次调用,虽然你是调用的Supeclass但是,返回的仍然是继承类的重载方法