Java中expecial,java中方法调用(invokevirtual,invokespecial),该如何处理

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但是,返回的仍然是继承类的重载方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值