Java 从入门到精通(五):封装、继承、多态到底怎么串起来理解?

发布时间:2026/5/17 20:41:48

Java 从入门到精通(五):封装、继承、多态到底怎么串起来理解? Java 从入门到精通五封装、继承、多态到底怎么串起来理解很多人学 Java 面向对象时会把封装、继承、多态当成三块分开的知识点。结果就是单独问定义会答一写代码还是不会设计。其实这三者不是并列背诵题而是一套连续的抽象方式。上一篇我们已经把“类、对象、封装”打了个基础。这一篇继续往前把继承和多态真正讲清楚并顺手把三者之间的关系串起来。一、先别急着背定义先看为什么会需要继承假设你在写一个管理系统里面有学生和老师。它们都有一些共同属性nameage也都有一些共同方法eat()sleep()如果你分别写两个类代码可能会变成这样public class Student { private String name; private int age; public void eat() { System.out.println(学生在吃饭); } public void sleep() { System.out.println(学生在睡觉); } }public class Teacher { private String name; private int age; public void eat() { System.out.println(老师在吃饭); } public void sleep() { System.out.println(老师在睡觉); } }这样写的问题很明显重复代码很多共同特征没有被抽出来后面一扩展就容易乱这时候就需要一个更上层的抽象比如Person。二、继承到底是什么继承的本质是把多个类的共性抽取到父类里让子类复用并在此基础上扩展自己的特性。例如public class Person { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } public String getName() { return name; } public int getAge() { return age; } public void eat() { System.out.println(name 在吃饭); } public void sleep() { System.out.println(name 在睡觉); } }public class Student extends Person { private String school; public Student(String name, int age, String school) { super(name, age); this.school school; } public void study() { System.out.println(getName() 在学习); } }public class Teacher extends Person { private String subject; public Teacher(String name, int age, String subject) { super(name, age); this.subject subject; } public void teach() { System.out.println(getName() 在讲授 subject); } }这样就清楚多了Person负责共性Student、Teacher负责个性这就是继承最直接的价值。三、继承里最容易搞混的几个点1. extends 表示什么public class Student extends Person表示Student是Person的子类。也可以理解成Student 是一种 PersonTeacher 也是一种 Person注意这种关系一定要满足“is-a”。比如学生是人 → 合理汽车是人 → 不合理如果这个关系本身就不成立那继承设计通常就是错的。2. 子类可以直接拿到父类所有东西吗不能简单这么理解。父类里如果属性是private子类不能直接访问只能通过父类暴露的方法间接使用。比如上面的name是private所以子类里不能直接写System.out.println(name);但可以通过getName()来访问。这就说明继承并不会破坏封装。封装仍然决定“哪些能直接碰哪些不能”。3. super 有什么用super最常见的两个作用调父类构造方法super(name, age);表示子类在初始化时先把父类那部分初始化好。调父类方法super.eat();表示明确调用父类版本的方法。四、方法重写是什么继承不是简单复制代码更重要的是子类可以在保留父类结构的前提下改写自己的行为。这就叫方法重写Override。例如父类里有一个通用方法public class Animal { public void makeSound() { System.out.println(动物发出声音); } }public class Dog extends Animal { Override public void makeSound() { System.out.println(汪汪汪); } }public class Cat extends Animal { Override public void makeSound() { System.out.println(喵喵喵); } }这里的重点不是语法而是设计能力父类定义统一接口子类给出各自实现这就是后面“多态”成立的基础。五、多态到底是什么多态是 Java 面向对象里最容易“听懂定义、看不懂代码”的部分。一句人话解释同一个父类引用指向不同子类对象时运行出来的行为可以不一样。public class Main { public static void main(String[] args) { Animal a1 new Dog(); Animal a2 new Cat(); a1.makeSound(); a2.makeSound(); } }变量类型都写成Animal但真正执行时会根据实际对象类型去调用对应方法。这就是多态。六、为什么多态重要因为它能让代码从“面向具体实现”变成“面向抽象编程”。public class AnimalTest { public void testSound(Animal animal) { animal.makeSound(); } }AnimalTest test new AnimalTest(); test.testSound(new Dog()); test.testSound(new Cat());这个方法不需要关心传进来的是狗还是猫。只要它是Animal的子类并且实现了makeSound()方法就能工作。比如支付接口微信支付、支付宝支付、银行卡支付日志接口控制台日志、文件日志、远程日志消息通知短信、邮件、站内信外部代码不应该绑死在某个具体实现上而应该依赖统一抽象。七、封装、继承、多态三者到底是什么关系1. 封装解决的是“边界”问题哪些数据能直接访问哪些操作必须受控类内部细节要不要暴露出去它解决的是对象设计的安全性和可维护性。2. 继承解决的是“复用与抽象层次”问题哪些能力是共性的哪些能力是子类特有的类之间有没有明确的层次结构它解决的是代码复用和模型抽象问题。3. 多态解决的是“统一调用”问题调用方能不能只依赖父类/接口不同实现能不能以统一方式接入系统后续扩展时是否少改老代码它解决的是扩展性问题。所以更工程化地说封装让一个类本身更稳继承让多个类之间更有层次多态让整套系统更容易扩展八、一个更贴近业务的例子假设你在写一个支付系统。public abstract class Payment { public abstract void pay(double amount); }public class AliPay extends Payment { Override public void pay(double amount) { System.out.println(使用支付宝支付 amount); } }public class WeChatPay extends Payment { Override public void pay(double amount) { System.out.println(使用微信支付 amount); } }public class PaymentService { public void submit(Payment payment, double amount) { payment.pay(amount); } }public class Main { public static void main(String[] args) { PaymentService service new PaymentService(); service.submit(new AliPay(), 100); service.submit(new WeChatPay(), 200); } }这里你会发现每个支付方式内部逻辑自己封装不同支付方式共享同一抽象层调用方通过多态统一处理九、初学者最常见的误区1. 以为继承就是为了少写代码少写代码只是表面收益更本质的是抽取共性、建立合理层次。2. 乱用继承不是看起来像“有关系”就能继承。继承要求关系足够稳定而且必须满足“is-a”。很多时候其实更适合组合而不是继承。3. 把多态理解成“重载”重载Overload是方法名相同、参数列表不同重写Override是父子类之间方法签名一致、子类改写父类实现。多态成立主要依赖的是重写不是重载。4. 父类引用就等于父类对象Animal a new Dog();这里a是父类引用但对象本身仍然是Dog。运行时调用哪个重写方法看的是对象真实类型不是左边变量名。十、小结1. 封装是把边界守住别让对象状态被随便破坏2. 继承是把共性抽出来让模型层次更清晰3. 多态是统一对外调用让系统更容易扩展把这三层理解顺了Java 面向对象就不再是“概念题”而会开始变成真正能指导你写代码的工具。推荐下一篇Java 进阶抽象类与接口到底怎么选因为学完封装、继承、多态之后最自然的下一步就是把“抽象能力”补完整。

相关新闻