Java 面向对象核心:多态(向上转型 + 方法重写)实战详解

Java 面向对象核心:多态(向上转型 + 方法重写)实战详解 1. 经典例题定义一个父类Animal包含私有属性name、构造方法和普通方法eat()再定义两个子类Dog和Cat继承自Animal并分别重写eat()方法最后编写测试类使用父类引用指向子类对象的方式调用eat()方法验证多态的执行效果。要求父类Animal的eat()方法输出动物在吃东西子类Dog的eat()方法输出小狗 [名字] 在啃骨头子类Cat的eat()方法输出小猫 [名字] 在吃鱼测试类中创建 3 个对象一个父类对象、一个 Dog 子类对象、一个 Cat 子类对象统一用Animal类型引用接收并调用eat()2. 解题思路封装父类共性提取所有动物共有的属性name和行为eat()封装到父类Animal中通过构造方法初始化属性。子类继承并扩展Dog和Cat通过extends关键字继承Animal复用父类的name属性同时重写父类的eat()方法实现各自特有的行为。向上转型实现多态测试类中用父类Animal的引用指向子类对象Animal a new Dog();调用方法时会自动执行子类重写后的版本。核心原则多态的执行遵循编译看左边运行看右边—— 编译时只检查父类是否有该方法运行时实际执行子类重写后的方法。3. 代码实现与逐行解释java运行// 1. 定义父类Animal public class Animal { // 私有属性封装只能通过父类方法访问 private String name; // 父类构造方法初始化name属性 public Animal(String name) { this.name name; // this指代当前对象给当前对象的name赋值 } // 父类普通方法所有动物共有的行为 public void eat() { System.out.println(动物在吃东西); } // 提供getter方法让子类可以获取name属性 public String getName() { return name; } } // 2. 定义子类Dog继承Animal class Dog extends Animal { // 子类构造方法必须通过super调用父类构造方法 public Dog(String name) { super(name); // super指代父类对象调用父类的构造方法初始化name } // 重写父类的eat()方法Override注解标记重写 Override public void eat() { // 调用父类的getName()获取名字实现子类特有行为 System.out.println(小狗 getName() 在啃骨头); } } // 3. 定义子类Cat继承Animal class Cat extends Animal { public Cat(String name) { super(name); } Override public void eat() { System.out.println(小猫 getName() 在吃鱼); } } // 4. 测试类验证多态 class TestPolymorphism { public static void main(String[] args) { // 父类引用指向父类对象执行父类的eat() Animal animal new Animal(通用动物); // 父类引用指向Dog子类对象向上转型执行Dog的eat() Animal dog new Dog(旺财); // 父类引用指向Cat子类对象向上转型执行Cat的eat() Animal cat new Cat(咪咪); // 统一调用eat()方法实际执行不同子类的逻辑 animal.eat(); dog.eat(); cat.eat(); } }运行结果plaintext动物在吃东西 小狗旺财在啃骨头 小猫咪咪在吃鱼4. 核心总结多态的三个必要前提必须有继承关系子类继承父类子类必须重写父类的方法必须存在向上转型父类引用指向子类对象多态的核心优势提高代码扩展性新增子类如Pig时无需修改测试类代码直接继承并重写方法即可统一调用规范所有子类对象都可以用父类引用接收调用同一个方法实现不同逻辑常见误区成员变量不参与多态编译和运行都看左边父类静态方法不能被重写属于类不属于对象调用时看引用类型私有方法不能被重写子类无法访问父类私有方法重写无效