先贴代码:
```
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,求大神解惑
this实际上是Demo的类指向,可以在父类的构造函数println一下this看一下,对于父类的构造函数,就是上面父类的this(),在父类中调用时会认为是调用父类的构造方法,对于普通函数,会认为是子类this的函数。所以this()会给a新赋值,而this.print()会调用子类的print()
感谢,确实如你所说的,我print了this指针的指向,显示的是Demo类,那么还有一个疑惑,我在通过super(4)进入到Par的有参构造里面,然后调用了子类的Print(),这个时候b应该还没有被赋值啊,怎么也输出了b的结果
还有一个疑问:一般按理来说,this是当前对象的引用,那么我在Par类中使用this却是指向的子类,这是因为父类只是子类的一个内部类吗?所以this还是指向的是子类,如果单独的一个父类实例对象,那this肯定指向的是父类吧?
@秋水惊鸿: 第一个问题是因为java对于成员变量有默认初始值,而对于局部变量好像是没有的,这个倒记得不是很清楚了,你可以试一下在super(4)下面将b改成b=2,还是会发现第一次输出0,因为int类型的成员变量默认值是0
@秋水惊鸿: 第二个问题,可以说this是当前对象的引用,但父类实际上并没有执行实例化,所以并没有父类对象,也就没有this,而我之前说的this(),我也没明白其中java的实际原理,不过我觉得应该是java为了避免继承中this概念混淆,而规定调用父类的构造函数吧(毕竟理论上在父类的this(),一般来说都不可能是调用子类,毕竟你也不知道他有没有,而对于其他普通函数就以子类是否重写为优先吧,不重写就默认父类呗)。如果是单独的一个父类对象,确实是只需要考虑父类就好。
@生活还得继续: 好的,万分感谢~结贴了
将编辑器改为markdown可支持markdown代码高亮
– dudu 6年前@dudu: 好的,谢谢,刚开始提问不知道,下次会注意
– 秋水惊鸿 6年前