news 2026/4/23 23:03:16

Java学习13

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java学习13

上午(2.5h)多态核心 + 向上 / 向下转型

1. 多态的 3 个前提条件(0.5h)

必须同时满足,缺一不可

  1. 必须有继承关系(extends)
  2. 子类必须重写父类方法(override)
  3. 父类引用指向子类对象(向上转型)

一句话记住:多态 = 继承 + 重写 + 父类引用装子类对象


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

它做了什么操作?

  1. 在内存里创建了一个 Cat 对象
  2. 让父类类型的变量a指向这个 Cat 对象
  3. 这叫向上转型

本质:猫还是猫,只是你用 “动物” 的眼光看它。

  • 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()
  • 子类:StudentTeacherDoctor
  • 测试:多态创建对象、调用方法、强转、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()
  • 子类:CircleRectangle
  • 多态数组遍历,求总面积

完整代码(最终大综合)

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✅ 会写抽象类、抽象方法✅ 会写多态数组(企业核心)

总结一下:多态----直接用父类引用统一装所有子类不仅这样更夸张的是 ——可以放进一个数组!多态数组!然后我们就可以用一个循环全部调用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 23:01:03

保姆级教程:在Ubuntu 20.04 ROS Noetic下,用奥比中光Astra Pro完成相机标定(附常见报错解决)

奥比中光Astra Pro相机标定全流程实战:从环境搭建到避坑指南 在机器人视觉和三维感知领域,相机标定是确保测量精度的基础环节。作为一款性价比较高的深度相机,奥比中光Astra Pro在SLAM、手势识别等场景中应用广泛。但许多开发者在ROS环境下进…

作者头像 李华
网站建设 2026/4/23 23:01:02

保姆级教程:用OpenCV和PCL库给激光雷达点云上色(附完整C++代码)

从零实现激光雷达点云着色:OpenCVPCL实战指南 当激光雷达扫描的稀疏点云被赋予相机捕捉的真实色彩,三维世界瞬间变得鲜活起来。这种融合不仅提升了数据的直观性,更为自动驾驶、机器人导航和三维重建等应用提供了更丰富的信息维度。本文将手把…

作者头像 李华
网站建设 2026/4/23 23:00:18

从零开发一个Illustrator条码插件:手把手教你用ExtendScript写UI和算法

从零开发Illustrator条码插件:ExtendScript实战指南 在平面设计和印刷领域,条码生成是常见的需求。虽然市面上有现成的条码生成工具,但作为设计师或开发者,掌握如何为Illustrator开发自定义插件不仅能提升工作效率,还能…

作者头像 李华
网站建设 2026/4/23 22:57:22

如何用VSCode插件构建你的智能投资决策中心:韭菜盒子深度解析

如何用VSCode插件构建你的智能投资决策中心:韭菜盒子深度解析 【免费下载链接】leek-fund :chart_with_upwards_trend: 韭菜盒子VSCode插件,可以看股票、基金、期货等实时数据。 LeekFund turns your VS Code and Cursor into a real-time stock, fund, …

作者头像 李华