今早有个朋友在群里问了一个问题,关于继承的 this 问题,他不是很理解,我们先发题。
其主要是对两种情况的输出结果不理解。
1.情况一
输出结果:
18
孩子在吃饭
2.情况二
输出结果:
40
孩子在吃饭
这两种情况唯一的区别就是情况二中 子类有一个和父类相同的属性
对于子类和父类同名成员变量,调用该变量,将直接获取父类的属性。
因为 Java 的重写,只有对方法的重写,对属性并不存在重写。
举例
我们给子类和父类都添加 getter/setter 方法,然后这里在第二行加 setAge
当我们都以为这个 father.age 最终输出为 11 时,结果大跌眼镜,输出结果为 40。
也就是说这里通过 . 获得成员变量值时,获得的是父类同名变量的值。
如果我们想获得子类的对象值,通过 get 方法,返回子类对象的成员变量即可
完整示例如下
输出结果:
40
11
孩子在吃饭
其主要是对两种情况的输出结果不理解。
问题如下
1.情况一
- public class Father {
- int age;
- public Father() {
- this.age = 40;
- }
- void eat() {
- System.out.println("父亲在吃饭");
- }
- }
- public class Child extends Father {
- public Child() {
- this.age = 18;
- }
- void eat() {
- System.out.println("孩子在吃饭");
- }
- public static void main(String[] args) {
- Father father = new Child();
- System.out.println(father.age); // 18
- father.eat(); // 孩子在吃饭
- }
- }
输出结果:
18
孩子在吃饭
2.情况二
- public class Father {
- int age;
- public Father() {
- this.age = 40;
- }
- void eat() {
- System.out.println("父亲在吃饭");
- }
- }
- public class Child extends Father {
- int age;
- public Child() {
- this.age = 18;
- }
- void eat() {
- System.out.println("孩子在吃饭");
- }
- public static void main(String[] args) {
- Father father = new Child();
- System.out.println(father.age); // 40
- father.eat(); // 孩子在吃饭
- }
- }
输出结果:
40
孩子在吃饭
这两种情况唯一的区别就是情况二中 子类有一个和父类相同的属性
解答
对于子类和父类同名成员变量,调用该变量,将直接获取父类的属性。
因为 Java 的重写,只有对方法的重写,对属性并不存在重写。
举例
- Father father = new Child();
- father.setAge(11);
- System.out.println(father.age);
我们给子类和父类都添加 getter/setter 方法,然后这里在第二行加 setAge
当我们都以为这个 father.age 最终输出为 11 时,结果大跌眼镜,输出结果为 40。
也就是说这里通过 . 获得成员变量值时,获得的是父类同名变量的值。
如果我们想获得子类的对象值,通过 get 方法,返回子类对象的成员变量即可
完整示例如下
- public class Child extends Father {
- int age;
- public Child() {
- this.age = 18;
- }
- void eat() {
- System.out.println("孩子在吃饭");
- }
- @Override
- public int getAge() {
- return age;
- }
- @Override
- public void setAge(int age) {
- this.age = age;
- }
- public static void main(String[] args) {
- Father father = new Child();
- father.setAge(11);
- System.out.println(father.age); // 40
- System.out.println(father.getAge()); // 11
- father.eat(); // 孩子在吃饭
- }
- }
输出结果:
40
11
孩子在吃饭
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏