问答详情
源自:9-4 Java 中的继承初始化顺序

​为什么子类this.seat和super.seat的输出值是一样的呢?

为什么子类this.seat和super.seat的输出值是一样的呢?
package com.imooc3;
public class Bus {
 int seat;//座位数
 float price;
 public void showSeat(){
  this.seat=47;
  System.out.println("Bus的座位数为:"+seat);
 }
 public Bus(int seat){
  System.out.println("父类的构造方法");
  this.seat=seat;
 }
package com.imooc3;
public class Car extends Bus {
 public void showSeat(){ //方法重写
  System.out.println("父类的Bus的座位数为"+super.seat);
  int seat=4;
  System.out.println("子类car的座位数为"+this.seat);             //为什么用this.seat和super.seat输出的值是一样的呢
  System.out.println("父类的Bus的座位数为"+super.seat);
 }
 public Car(int seat){ //带参构造方法
  super(seat);
  System.out.println("子类的构造方法");
 }
}
package com.imooc3;
public class Test {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  Car honda=new Car(55);
  honda.showSeat();

 }
}
最后结果是:
父类的构造方法
子类的构造方法
父类的Bus的座位数为55
子类car的座位数为55
父类的Bus的座位数为55

提问者:Refactor易先生 2015-06-14 16:55

个回答

  • 小州州
    2015-08-15 21:04:02

    我觉得是对象实例化的时候将55覆盖了子类默认的seat=4.就好像我先定义 int seat=4;之后我再让seat=55,是可以的,这时候seat=55,因为变量是可以改变值的,常量就不可以。

  • 无敌的大鹏鸟
    2015-07-29 17:20:33

    你的程序我看了,也运行了。这么和解释吧,在创建子类对象时即Car honda=new Car(55); 程序首先会访问和执行父类的属性和构造方法,然后再访问和执行子类的属性和构造方法,这是我们初始化访问你的顺序,在这之后我们的参数55就传给了父类中的属性seat,父类构造方法中this.seat=seat;就完成了这一步。接着运行到 honda.showSeat();系统默认会调用子类中的showSeat方法,看好你问的问题来了

    public void showSeat(){ //方法重写

    System.out.println("父类的Bus的座位数为"+super.seat);//这里访问的是父类属性seat=55

      int seat=4;//问题的关键在这里:这里的seat是你定义在showSeat中的一个局部变量,和你父类属性是两个不同的变量,只是同名而已,所以你这里的定义和赋值是不会传到父类属性的seat中的,父类属性seat还是55。

      System.out.println("子类car的座位数为"+this.seat);     //这里的this.seat代表的是当前对象Car里的seat属性,由于你没有在Car中定义属性seat,则默认继承f父类中的seat=55

      System.out.println("父类的Bus的座位数为"+super.seat);

     }

    你不如在加上一个System.out.println(seat);验证

  • Refactor易先生
    2015-06-14 17:11:14

    那this。seat调用的是父类的seat吗?

  • miaowing
    2015-06-14 17:02:25

    new car的时候先调用父类的构造方法并把值赋值给父类的seat属性了。