1.代码如下父类代码:public class A {public void a(){ B b=(B)this; System.out.println(b.getNum()); System.out.println("A.this.hashCode="+this.hashCode());}}子类代码:public class B extends A {public int num = 3;public int getNum() { return num;}public void test() { super.a();}public static void main(String[] args) { B b=new B(); b.test(); System.out.println("b.hashCode="+b.hashCode());}}2.执行结果3A.this.hashCode=412537538b.hashCode=412537538个人猜测在调用方法时,之前有看到过相关子类说,每个方法都隐式传了当前对象的this变量,因为子类是通过super调父类方法的,所以父类方法中的这个this应该是子类实例对象,而且把各自对象的hashCode打印出来,是一样的,不知道这样猜测对不?4.这个问题在看jdk内置观察者模式框架代码时,发现有个困惑的代码,最后一行的this对象,源代码如下:public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length - 1; i >= 0; i--) ((Observer) arrLocal[i]).update(this, arg);}我们使用时,一般自定义主题类均继承java.util.Observable,观察者实现java.util.Observer,需要将update方法中的Observable对象变量,强转成自定义主题类实例,调用主题类的相关方法。
4 回答

手掌心
TA贡献1942条经验 获得超3个赞
Java中的方法调用是这样的,比如说:
B b=new B();
b.test();//实际相当于B.test(this)
//然后调用
super.a();//实际相当于调用了A.a(this)
//所以,当进入A类方法的时候this指向的还是B的对象
//你可以在super处打个断点,看看super到底是什么东西

慕村9548890
TA贡献1884条经验 获得超4个赞
对于这种问题我倾向于将“类class”和“实例instance”分清楚讨论。
this
指向的是instance,你在A#a()
方法里将this
强制转换成B
类型的变量是完全合法的。
当然到底这个时候this
是不是B
类型的还得在运行时判断(这个JVM会判断的)
所以也别管什么super、子类父类,你只需要看调用a()
的时候,那个instance到底是什么类型就行了。

慕丝7291255
TA贡献1859条经验 获得超6个赞
你可以在写个A的子类C,
public class C extends A {
public void test() {
super.a();
}
public static void main(String[] args) {
new C().test();
}
}
试试感觉如何
添加回答
举报
0/150
提交
取消