Java学习13
上午2.5h多态核心 向上 / 向下转型1. 多态的 3 个前提条件0.5h必须同时满足缺一不可必须有继承关系extends子类必须重写父类方法override父类引用指向子类对象向上转型一句话记住多态 继承 重写 父类引用装子类对象2. 向上转型自动类型转换0.7h格式java运行父类类型 引用名 new 子类类型();核心口诀面试必考编译看左边运行看右边编译只能调用父类里有的方法运行执行子类重写后的方法特点自动完成不需要强转不能调用子类独有方法统一管理不同子类企业代码最常用完整案例代码Animal Catjava运行// 父类 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()因为编译只看左边Animal3. 向下转型强制类型转换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. 抽象类语法abstract1h规则必须背用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✅ 会写抽象类、抽象方法✅ 会写多态数组企业核心总结一下多态----直接用父类引用统一装所有子类不仅这样更夸张的是 ——可以放进一个数组多态数组然后我们就可以用一个循环全部调用。