首页 新闻 会员 周边 捐助

关于Java中的this和super的使用

0
悬赏园豆:10 [已解决问题] 解决于 2018-03-02 10:11

先贴代码:

```
class Par{                           //定义一个父类
    int a;
    public Par(){                    //父类无参构造
        a=1;
    }
    public Par(int a){            //有参构造
        this();                            //调用无参构造
        this.Print();                   //输出结果,想看一下调用无参构造是否成功
        System.out.println("----");
        this.a=a;                       //对a进行重新赋值,覆盖a=1的值
    }
    public void Print(){
        System.out.println("a="+a);
    }
}
public class Demo extends Par{      //继承父类
    int b=1;
    public Demo(){                   
        super(4);                                       //调用父类的构造含参构造函数,赋值a=4
        b=0;
    }
    public void Print(){
        super.Print();
        System.out.println("b="+b);
    }
    public static void main(String[] args) {
        Demo demo=new Demo();
        demo.Print();
    }
}
```
这个地方输出的结果是:
a=1
b=0
----
a=4
b=0

疑问就是:
在使用this()调用了Par()的无参构造函数之后,使用了this.Print()进行输出,结果他还输出了b的值,疑惑有两个:1、这个地方b不是还没有被赋值吗?2、这个地方调用的Print()应该是父类的Print()啊,那么按理来说应该不会输出b的值啊,难道在子类中重写了之后调用的都是子类的Print()?
刚学Java,求大神解惑

秋水惊鸿的主页 秋水惊鸿 | 初学一级 | 园豆:193
提问于:2018-02-25 13:46

将编辑器改为markdown可支持markdown代码高亮

dudu 6年前

@dudu: 好的,谢谢,刚开始提问不知道,下次会注意

秋水惊鸿 6年前
< >
分享
最佳答案
0

this实际上是Demo的类指向,可以在父类的构造函数println一下this看一下,对于父类的构造函数,就是上面父类的this(),在父类中调用时会认为是调用父类的构造方法,对于普通函数,会认为是子类this的函数。所以this()会给a新赋值,而this.print()会调用子类的print()

收获园豆:10
随风行云 | 小虾三级 |园豆:936 | 2018-02-25 16:23

感谢,确实如你所说的,我print了this指针的指向,显示的是Demo类,那么还有一个疑惑,我在通过super(4)进入到Par的有参构造里面,然后调用了子类的Print(),这个时候b应该还没有被赋值啊,怎么也输出了b的结果

秋水惊鸿 | 园豆:193 (初学一级) | 2018-02-26 09:16

还有一个疑问:一般按理来说,this是当前对象的引用,那么我在Par类中使用this却是指向的子类,这是因为父类只是子类的一个内部类吗?所以this还是指向的是子类,如果单独的一个父类实例对象,那this肯定指向的是父类吧?

秋水惊鸿 | 园豆:193 (初学一级) | 2018-02-26 09:20

@秋水惊鸿: 第一个问题是因为java对于成员变量有默认初始值,而对于局部变量好像是没有的,这个倒记得不是很清楚了,你可以试一下在super(4)下面将b改成b=2,还是会发现第一次输出0,因为int类型的成员变量默认值是0

随风行云 | 园豆:936 (小虾三级) | 2018-02-26 17:13

@秋水惊鸿: 第二个问题,可以说this是当前对象的引用,但父类实际上并没有执行实例化,所以并没有父类对象,也就没有this,而我之前说的this(),我也没明白其中java的实际原理,不过我觉得应该是java为了避免继承中this概念混淆,而规定调用父类的构造函数吧(毕竟理论上在父类的this(),一般来说都不可能是调用子类,毕竟你也不知道他有没有,而对于其他普通函数就以子类是否重写为优先吧,不重写就默认父类呗)。如果是单独的一个父类对象,确实是只需要考虑父类就好。

随风行云 | 园豆:936 (小虾三级) | 2018-02-26 17:19

@生活还得继续: 好的,万分感谢~结贴了

秋水惊鸿 | 园豆:193 (初学一级) | 2018-03-02 10:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册