guangzhanzb
2017-05-19 08:25
采纳率: 66.7%
浏览 2.3k
已采纳

有关Java继承中,this使用方法的问题。

首先,我理解的this就是指向当前对象。但是如下代码让人有点想不通。

//父类
public class Sup {
    public Object f1 = "Sup.f1";
    public Object f2 = "Sup.f2";

    public void mA(){
        System.out.println("Sup.mA");
    }
    public void mB(){
        this.mA();
    }

    public void getF1(){
        System.out.println(this.f1);
    }
    public void getF2(){
        System.out.println(this.f2);
    }
}
//子类
public class Sub extends Sup {
    public Object f1 = "Sub.f1";
    public Object f2 = "Sub.f2";

    public void mA(){
        System.out.println("Sub.mA");
    }

    public void getF2(){
        System.out.println(this.f2);
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        Sup sup1 = new Sub();
        sup1.mB();

        sup1.getF1();
        sup1.getF2();
    }
}
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • guangzhanzb 2017-05-20 11:48
    已采纳

    是我把问题搞复杂了。
    首先,对于继承时候的内存分配图我认为是下面这样的(Hotspot)
    图片说明
    方法重写之所以会调用到子类重写的,是因为this指向方法区中子类的类信息,其直接就可以找到重写的方法,因此调用的也是子类的。
    而没重写的会调用到父类的,是因为子类里面找不到,然后通过子类类信息中的存储的super class值找到父类的类信息,进而调用。

    从图中也可以看出来,this与sup1存的值其实一样,都是子类对象的地址,并且在子类对象中其实是存有两份f1、f2的。
    那么,这个f1、f2有没有什么相应的进制,来决定究竟返回那个?这其实就是我主要想问的。

    打赏 评论
  • oyljerry 2017-05-19 08:44

    你这里用到了多态,sup1实际指向的是Sub子类,所以它的方法都会调用子类的方法。

    打赏 评论
  • Palma4 2017-05-19 08:46

    这代码让人想不通什么啊?

    打赏 评论
  • legendCoder 2017-05-19 08:53

    输出应该一次是Sub.mA,Sup.f1,Sub.f2。

    Sup sup1 = new Sub();创建了sup1变量,其实是一个Sub的对象实例。

    首先调用 sup1.mB();的时候,因为子类没有mb方法,只能调用继承自父类的mb方法,父类mb方法又调用了ma方法,因为子类复写了ma方法,
    所以调用子类的ma方法。

    getF1只有父类存在,所以调用父类的方法。

    getF2方法在子类复写了,所以调用子类的方法。

    另外定义的f1和f2变量都是子类和父类特有的,定义在哪个类就属于哪个类,不能覆盖。

    打赏 评论
  • 接口的说法 2017-05-19 09:04

    就像一楼说的这里用到多态, Sup sup1 = new Sub();其实得到的相当于sub对象, sup1调用就相当于sub调用sub的方法了

    打赏 评论
  • guangzhanzb 2017-05-19 09:40

    之前问题发了一半……想着确认下代码格式再补充的,结果CSDN不让我继续编辑了……
    以上代码的疑问在于,this应该是指向实际的子类对象的。并且通过方法可以证实,即便子类重写了父类方法,最终调用的也是子类里的。
    但是到了属性……getF2因为子类重写,最终调用的是子类的,返回子类的f2无可厚非。
    但是getF1,虽然子类没重写,但是其指向的也是子类对象(因为根本就不存在父类对象,并且debug也可以看到确实是指向子类对象),既然指向了子类对象,又是如何调到父类属性的呢?

    打赏 评论
  • Teddy_YYF 2017-05-19 10:00

    在调用sup1.getF1();的时候,父类里的this.f1,因为f1是参数对象,它不是方法重写啊,跟sup1.mB()的不一样啊

    打赏 评论
  • gongqiang_love 2017-05-19 10:32

    继承,多态...你把你直接绕晕了.,你只需要想父类引用指向子类对象,子类没有重写父类的时候,子类是不是继承了父类的,所以调用的是父类.而当你子类重写了之后,就调用自己的了

    打赏 评论
  • cheng_f 2017-05-19 12:23

    this指针并不是指向实例化的具体对象。而是防止和其他函数或者方法重命名,所以才this指向内部类中的函数和方法。管他创建的是父类还是子类,this永远都是指向自己的类,不可能父类中的this指向子类中去,子类中的this指向父类中去,这样不就乱套了吗?这样说你应该能懂吧。。

    打赏 评论
  • cheng_f 2017-05-19 12:33

    可以把继承比喻成父亲和儿子,父亲说的自己就是说父亲自己,儿子说的自己就是儿子自己,这里的自己就是this的意思。儿子只是继承了父亲的一些特性,并不是代替了父亲,你可以吧他们看做两个不同的类。

    打赏 评论

相关推荐 更多相似问题