猿问

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

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.执行结果

3

A.this.hashCode=412537538

b.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对象变量,强转成自定义主题类实例,调用主题类的相关方法。


宝慕林4294392
浏览 1240回答 4
4回答

喵喵时光机

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

手掌心

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

慕村9548890

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

慕丝7291255

你可以在写个A的子类C,public class C extends A {        public void test() {        super.a();    }        public static void main(String[] args) {        new C().test();    }}试试感觉如何
随时随地看视频慕课网APP

相关分类

Java
我要回答