素材牛VIP会员
java父类方法中使用this,可以把this强转为子类对象,然后调用子类的实例方法,怎么解释?
 16***50  分类:Java代码  人气:930  回帖:4  发布于6年前 收藏

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

  1. 个人猜测在调用方法时,之前有看到过相关子类说,每个方法都隐式
    传了当前对象的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对象变量,强转成自定义主题类实例,调用主题类的相关方法。

 标签:java

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv4 码徒
风***0 JS工程师 6年前#1

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

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

Lv3 码奴
te***es 产品经理 6年前#2

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

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

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

Lv1 新人
阿***扫 JAVA开发工程师 6年前#3

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

Lv2 入门
yz***zw 学生 6年前#4

你可以在写个A的子类C,

public class C extends A {
    
    public void test() {
        super.a();
    }
    
    public static void main(String[] args) {
        new C().test();
    }
}

试试感觉如何

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取