关于继承以及方法重写的一道题

public class Child extends Father{
    public String name="Child";
    public String age="18";

    @Override
    void sayAge() {
        System.out.println("Child say age:\t"+this.age);
    }

    Child(){
        sayName();
        sayAge();
        super.sayAge();
    }

    public static void main(String[] args) {
        new Child();
    }
}
class Father {
    private String name="Father";
    public String age="40";

    Father() {
        sayName();
        sayAge();
    }
    void sayName(){
        System.out.println("Father say name:\t"+name);
    }
    void sayAge(){
        System.out.println("Father say age:\t"+this.age);
    }
}

简述一下代码大概写了什么:

        首先有一个父类Father,它有两个变量name私有age公共,然后他有两个方法分别是对这两个变量进行输出,需要注意的是它的构造方法就是调用这两个方法。>>>再然后是有一个继承Father类的子类Child,它具有一个与父类同名的变量name, 然后在类中对父类的sayAge()方法进行重写,然后它的构造方法也是像父类一样,调用两个方法。

答案:

Father say name:    Father
Child say age:    null
Father say name:    Father
Child say age:    18
Father say age:    40


        分析执行流程: new Child()        -->调用Child构造方法,然后发现Child具有父类,需要先去父类继承既有的变量和方法,会走到父类的构造方法,父类的Father.name和Father.age被赋值,然后走父类构造方法,走sayName方法就走父类自己的Father say name :Father,但是当走sayAge方法时因为当前执行的主体是子类就会调用子类重写过的sayAge方法,但是子类的sayAge是拿不到位于父类堆中的age变量的,因此输出会变成Child say age:null,走完父类的构造方法就开始回到子类中的构造方法,当然也是先赋值,然后走构造器,走到没有被重写的方法就会回到父类调用父类的方法,变量也是Father.xxx。最后形成的情况就是,父类走子类类的方法拿不到子类的变量,子类走父类的方法可以拿到父类的变量(即使本类中已经对父类中变量做覆盖)


这题我感觉就是见过了解套路就行   0JO   

        And you?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一道 Java 继承的练习: 假设有一个父类 `Animal` 和两个子类 `Dog` 和 `Cat`。`Animal` 类包含一个 `name` 成员变量和一个 `eat` 方法,`Dog` 和 `Cat` 类都继承了 `Animal` 类,并且都有一个 `sound` 方法。现在请你完成以下练习: 1. 在 `Animal` 类中,添加一个 `sleep` 方法,并在 `Dog` 和 `Cat` 类中覆盖(重写)该方法,使得 `Dog` 和 `Cat` 的 `sleep` 方法输出不同的内容。 2. 在 `Dog` 和 `Cat` 类中,实现各自的 `sound` 方法,使得 `Dog` 的 `sound` 方法输出 `"汪汪"`,`Cat` 的 `sound` 方法输出 `"喵喵"`。 3. 编写一个名为 `Main` 的测试类,并在其中创建一个 `Dog` 对象和一个 `Cat` 对象,分别调用它们的 `eat`、`sleep` 和 `sound` 方法。 你可以参考以下代码: ```java public class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + " is eating"); } public void sleep() { System.out.println(name + " is sleeping"); } } public class Dog extends Animal { public Dog(String name) { super(name); } public void sleep() { System.out.println(getName() + " is sleeping soundly"); } public void sound() { System.out.println("汪汪"); } } public class Cat extends Animal { public Cat(String name) { super(name); } public void sleep() { System.out.println(getName() + " is sleeping quietly"); } public void sound() { System.out.println("喵喵"); } } public class Main { public static void main(String[] args) { Animal dog = new Dog("旺财"); Animal cat = new Cat("小花"); dog.eat(); dog.sleep(); ((Dog) dog).sound(); cat.eat(); cat.sleep(); ((Cat) cat).sound(); } } ``` 希望这个练习能够帮助你理解 Java 继承的相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值