为了账号安全,请及时绑定邮箱和手机立即绑定

java父类方法中使用this,可以把this强转为子类对象,然后调用子类的实例方法,怎么解释?

java父类方法中使用this,可以把this强转为子类对象,然后调用子类的实例方法,怎么解释?

宝慕林4294392 2019-03-21 18:13:42
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贡献1846条经验 获得超7个赞

看到输出结果这了,还是没明白你的问题是什么.


查看完整回答
反对 回复 2019-04-23
?
手掌心

TA贡献1942条经验 获得超3个赞

Java中的方法调用是这样的,比如说:


B b=new B();

b.test();//实际相当于B.test(this)

//然后调用

super.a();//实际相当于调用了A.a(this)

//所以,当进入A类方法的时候this指向的还是B的对象

//你可以在super处打个断点,看看super到底是什么东西


查看完整回答
反对 回复 2019-04-23
?
慕村9548890

TA贡献1884条经验 获得超4个赞

对于这种问题我倾向于将“类class”和“实例instance”分清楚讨论。

this指向的是instance,你在A#a()方法里将this强制转换成B类型的变量是完全合法的。
当然到底这个时候this是不是B类型的还得在运行时判断(这个JVM会判断的)

所以也别管什么super、子类父类,你只需要看调用a()的时候,那个instance到底是什么类型就行了。


查看完整回答
反对 回复 2019-04-23
?
慕丝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();

    }

}

试试感觉如何


查看完整回答
反对 回复 2019-04-23
  • 4 回答
  • 0 关注
  • 1238 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号