上午(2.5h)多态核心 + 向上 / 向下转型
1. 多态的 3 个前提条件(0.5h)
必须同时满足,缺一不可
- 必须有继承关系(extends)
- 子类必须重写父类方法(override)
- 父类引用指向子类对象(向上转型)
一句话记住:多态 = 继承 + 重写 + 父类引用装子类对象
2. 向上转型(自动类型转换)(0.7h)
格式
java
运行
父类类型 引用名 = new 子类类型();核心口诀(面试必考)
编译看左边,运行看右边
- 编译:只能调用父类里有的方法
- 运行:执行子类重写后的方法
特点
- 自动完成,不需要强转
- 不能调用子类独有方法
- 统一管理不同子类,企业代码最常用
完整案例代码(Animal & Cat)
java
运行
// 父类 class Animal { public void eat() { System.out.println("动物吃东西"); } } // 子类继承父类 class Cat extends Animal { // 重写方法 @Override public void eat() { System.out.println("猫吃鱼"); } // 子类独有方法 public void catchMouse() { System.out.println("猫抓老鼠"); } } // 测试类 public class TestUpCast { public static void main(String[] args) { // 向上转型:父类引用指向子类对象 Animal a = new Cat(); // 编译看左(Animal),运行看右(Cat) a.eat(); // 输出:猫吃鱼 // 错误!不能调用子类独有方法 // a.catchMouse(); } }代码解释
Animal a = new Cat()就是向上转型
这一句对初学者是个超难点在这里我来解释一下
new Cat()→实实在在创建了一只猫(真实对象)
Animal a→给这只猫贴了一个 “动物” 标签(引用)
完整含义:
用 “动物” 的名字,指向一只真实的 “猫”
- 对象本身:永远是
Cat - 引用类型:写成了
Animal
它做了什么操作?
- 在内存里创建了一个 Cat 对象
- 让父类类型的变量
a指向这个 Cat 对象 - 这叫向上转型
本质:猫还是猫,只是你用 “动物” 的眼光看它。
a.eat()表面是父类方法,实际运行子类重写的方法a不能调用catchMouse(),因为编译只看左边Animal
3. 向下转型(强制类型转换)(0.8h)
作用
把向上转型后的对象转回原本子类类型,从而调用子类独有方法。
格式
java
运行
子类类型 引用名 = (子类类型) 父类引用;风险
如果类型不匹配,会抛ClassCastException类型转换异常。
完整代码
java
运行
public class TestDownCast { public static void main(String[] args) { // 向上转型 Animal a = new Cat(); // 向下转型(强制转换) Cat c = (Cat) a; // 可以调用子类独有方法 c.catchMouse(); // 输出:猫抓老鼠 } }4. instanceof 类型判断(0.5h)
作用
判断一个对象真实类型是什么,避免强转报错。
企业必备写法
java
运行
if (对象 instanceof 类型) { // 强转一定安全 }完整代码
java
运行
public class TestInstanceof { public static void main(String[] args) { Animal a = new Cat(); // 判断 a 是不是 Cat 类型 if (a instanceof Cat) { Cat c = (Cat) a; c.catchMouse(); } else { System.out.println("不是猫,不能抓老鼠"); } } }这是实习、面试、企业开发最常用的安全强转写法。
下午(3h)抽象类 + 多态综合应用
1. 抽象类语法(abstract)(1h)
规则(必须背)
- 用
abstract修饰类 - 抽象方法只有声明,没有方法体
- 包含抽象方法的类必须是抽象类
- 抽象类不能直接 new 对象
- 子类必须重写所有抽象方法,否则子类也要变成抽象类
抽象方法格式
java
运行
public abstract 返回值 方法名(参数);完整抽象类案例
java
运行
// 抽象类 abstract class Animal { // 抽象方法:没有方法体 public abstract void eat(); // 普通方法:可以有实现 public void sleep() { System.out.println("动物睡觉"); } } // 子类必须重写抽象方法 class Dog extends Animal { @Override public void eat() { System.out.println("狗吃骨头"); } }2. 抽象类核心特点(0.8h)
- 可以有成员变量
- 可以有构造方法(给子类用)
- 可以有普通方法
- 可以没有抽象方法(只是不让别人 new)
- 设计意义:制定规范,强制子类必须实现某些功能
抽象类 = 模板 + 强制约束
3. 多态实战案例(1.2h)
需求(实习面试原题)
- 抽象父类:
Person,抽象方法work() - 子类:
Student、Teacher、Doctor - 测试:多态创建对象、调用方法、强转、instanceof
完整代码(可直接运行)
java
运行
// 抽象父类 abstract class Person { public abstract void work(); } // 子类1 class Student extends Person { @Override public void work() { System.out.println("学生学习"); } // 独有方法 public void studyJava() { System.out.println("学生学 Java"); } } // 子类2 class Teacher extends Person { @Override public void work() { System.out.println("老师讲课"); } // 独有方法 public void teach() { System.out.println("老师教 Java"); } } // 子类3 class Doctor extends Person { @Override public void work() { System.out.println("医生治病"); } } // 测试类(多态+强转+instanceof) public class TestPerson { public static void main(String[] args) { // 多态数组(企业最常用!) Person[] p = { new Student(), new Teacher(), new Doctor() }; // 遍历批量执行 for (Person person : p) { person.work(); // 判断类型 + 安全强转 if (person instanceof Student) { Student s = (Student) person; s.studyJava(); } else if (person instanceof Teacher) { Teacher t = (Teacher) person; t.teach(); } } } }运行结果
plaintext
学生学习 学生学 Java 老师讲课 老师教 Java 医生治病晚上(1.5h)综合练习 + 今日验收
必做实战:图形面积计算(企业高频)
需求
- 抽象类
Graphic - 抽象方法
getArea() - 子类:
Circle、Rectangle - 多态数组遍历,求总面积
完整代码(最终大综合)
java
运行
// 抽象类 abstract class Graphic { public abstract double getArea(); } // 圆形 class Circle extends Graphic { private double r; private final double PI = 3.14; public Circle(double r) { this.r = r; } @Override public double getArea() { return PI * r * r; } } // 矩形 class Rectangle extends Graphic { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double getArea() { return width * height; } } // 测试:多态数组 + 总面积 public class TestGraphic { public static void main(String[] args) { // 多态数组 Graphic[] g = { new Circle(2), new Rectangle(3, 4), new Circle(5) }; // 求总面积 double sum = 0; for (Graphic graphic : g) { sum += graphic.getArea(); } System.out.println("总面积:" + sum); } }运行结果
plaintext
总面积:94.2今日总结(面试必背)
多态
- 3 前提:继承 + 重写 + 父类引用指向子类
- 口诀:编译看左,运行看右
- 向上自动转,向下强制转
instanceof判断类型,避免异常
抽象类
abstract修饰- 抽象方法无方法体
- 不能 new
- 子类必须重写抽象方法
- 作用:制定规范、强制实现
企业最常用技能
- 多态数组
- 遍历批量处理
- 安全强转
Day13 硬标准(你必须全部做到才算通关)
✅ 能说出多态 3 前提✅ 会写向上 / 向下转型✅ 会用instanceof✅ 会写抽象类、抽象方法✅ 会写多态数组(企业核心)
总结一下:多态----直接用父类引用统一装所有子类不仅这样更夸张的是 ——可以放进一个数组!多态数组!然后我们就可以用一个循环全部调用。