关于Java继承中的this的表示关系

avatar 2020年1月12日12:03:13 评论 22 views

今早有个朋友在群里问了一个问题,关于继承的 this 问题,他不是很理解,我们先发题。

其主要是对两种情况的输出结果不理解。

问题如下

1.情况一

  1. public class Father {
  2.     int age;
  3.     public Father() {
  4.         this.age = 40;
  5.     }
  6.     void eat() {
  7.         System.out.println("父亲在吃饭");
  8.     }
  9. }
  10. public class Child extends Father {
  11.     public Child() {
  12.         this.age = 18;
  13.     }
  14.     void eat() {
  15.         System.out.println("孩子在吃饭");
  16.     }
  17.     public static void main(String[] args) {
  18.         Father father = new Child();
  19.         System.out.println(father.age); // 18
  20.         father.eat(); // 孩子在吃饭
  21.     }
  22. }

输出结果:
18
孩子在吃饭

 

2.情况二

  1. public class Father {
  2.     int age;
  3.     public Father() {
  4.         this.age = 40;
  5.     }
  6.     void eat() {
  7.         System.out.println("父亲在吃饭");
  8.     }
  9. }
  10. public class Child extends Father {
  11.     int age;
  12.     public Child() {
  13.         this.age = 18;
  14.     }
  15.     void eat() {
  16.         System.out.println("孩子在吃饭");
  17.     }
  18.     public static void main(String[] args) {
  19.         Father father = new Child();
  20.         System.out.println(father.age); // 40
  21.         father.eat(); // 孩子在吃饭
  22.     }
  23. }

输出结果:

40
孩子在吃饭

 

这两种情况唯一的区别就是情况二中 子类有一个和父类相同的属性

 

解答

对于子类和父类同名成员变量,调用该变量,将直接获取父类的属性

因为 Java 的重写,只有对方法的重写,对属性并不存在重写。

举例

  1. Father father = new Child();
  2. father.setAge(11);
  3. System.out.println(father.age);

我们给子类和父类都添加 getter/setter 方法,然后这里在第二行加 setAge

当我们都以为这个 father.age 最终输出为 11 时,结果大跌眼镜,输出结果为 40。

也就是说这里通过 . 获得成员变量值时,获得的是父类同名变量的值。

 

如果我们想获得子类的对象值,通过 get 方法,返回子类对象的成员变量即可

完整示例如下

  1. public class Child extends Father {
  2.     int age;
  3.     public Child() {
  4.         this.age = 18;
  5.     }
  6.     void eat() {
  7.         System.out.println("孩子在吃饭");
  8.     }
  9.     @Override
  10.     public int getAge() {
  11.         return age;
  12.     }
  13.     @Override
  14.     public void setAge(int age) {
  15.         this.age = age;
  16.     }
  17.     public static void main(String[] args) {
  18.         Father father = new Child();
  19.         father.setAge(11);
  20.         System.out.println(father.age); // 40
  21.         System.out.println(father.getAge()); // 11
  22.         father.eat(); // 孩子在吃饭
  23.     }
  24. }

输出结果:

40
11
孩子在吃饭

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: