Java的三大特性:封装、继承、多态
一、Java 三大特性整体概述
Java 的封装、继承、多态是面向对象编程(OOP)的核心基石,三者相互配合,让代码具备高内聚、低耦合、可复用、易扩展的特性:
- 封装:隐藏内部细节,只暴露必要接口,保障数据安全;
- 继承:复用已有类的代码,建立类之间的层级关系;
- 多态:基于继承实现行为的差异化,提升代码通用性和灵活性。
二、封装
1. 官方定义
封装是面向对象编程的核心特性之一,指将对象的属性(成员变量)和行为(方法)捆绑在一起,通过访问控制符(private/protected/public)隐藏对象内部的实现细节,仅对外暴露标准化的访问接口,以此保障数据的安全性和代码的可控性。
2. 白话解释
封装就像一个 “快递箱”:你只需要知道怎么打开(调用公开方法)、怎么放东西(set 方法赋值)、怎么取东西(get 方法取值),但不需要知道箱子内部的构造、材料等细节;同时快递箱有 “锁”(private 修饰),外部不能随意拆改内部物品,只能通过指定方式操作,避免数据被错误修改。
3. 核心作用
- 隐藏实现细节,降低代码耦合度;
- 控制属性的访问权限,可在赋值 / 取值时做数据校验,保障数据合法性;
- 统一对外接口,便于代码维护和扩展。
4. 代码示例
// 封装的典型实现:实体类 public class Phone { // 私有属性:外部无法直接访问,隐藏细节 private String brand; private double price; // 公开的get方法:获取属性值 public String getBrand() { return brand; } // 公开的set方法:设置属性值,可做校验 public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } // 对价格赋值做合法性校验,体现封装的安全性 public void setPrice(double price) { if (price > 0 && price < 10000) { this.price = price; } else { System.out.println("价格输入非法!"); } } // 公开的行为方法:对外提供功能接口 public void call() { System.out.println(brand + "手机正在打电话"); } } // 测试类 public class EncapsulationDemo { public static void main(String[] args) { Phone phone = new Phone(); // 只能通过set方法赋值,无法直接修改private属性 phone.setBrand("华为"); phone.setPrice(5999); phone.call(); // 输出:华为手机正在打电话 phone.setPrice(-100); // 触发校验,输出:价格输入非法! } }三、继承
1. 官方定义
继承是面向对象中实现代码复用的核心机制,允许一个类(子类 / 派生类)继承另一个类(父类 / 基类 / 超类)的属性和方法,子类可在父类基础上扩展新的功能,或重写父类的方法,以此建立类之间的层级关系。Java 中通过extends关键字实现单继承,一个子类只能直接继承一个父类。
2. 白话解释
继承就像 “子女继承父母的特征”:子女会继承父母的身高、肤色等基础特征(父类的属性和方法),同时又有自己的专属特征(子类扩展的属性 / 方法),比如父母会说话(父类方法),子女不仅会说话,还会编程(子类扩展方法)。
3. 核心作用
- 复用父类的代码,减少重复开发;
- 建立类的层级关系,便于代码的管理和扩展;
- 为多态提供基础。
4. 代码示例
// 父类:提取通用属性和方法 public class Animal { protected String name; // 受保护的属性,子类可直接访问 public Animal(String name) { this.name = name; } // 父类通用方法 public void eat() { System.out.println(name + "在吃东西"); } } // 子类:继承父类,扩展专属功能 public class Cat extends Animal { // 子类构造方法必须调用父类构造方法 public Cat(String name) { super(name); // super关键字调用父类构造方法 } // 子类扩展的专属方法 public void catchMouse() { System.out.println(name + "在抓老鼠"); } // 可选:重写父类方法(为多态做准备) @Override public void eat() { System.out.println(name + "在吃小鱼干"); } } // 测试类 public class InheritanceDemo { public static void main(String[] args) { Cat cat = new Cat("小花"); cat.eat(); // 调用重写后的方法,输出:小花在吃小鱼干 cat.catchMouse(); // 调用子类扩展方法,输出:小花在抓老鼠 } }四、多态
1. 官方定义
多态(Polymorphism)是面向对象编程的三大特性之一(封装、继承、多态),指同一个行为(方法)在不同的对象实例上表现出不同的实现形式,核心体现为 “父类引用指向子类对象”,并结合方法重写实现行为的差异化执行。
2. 白话解释
多态就像 “同一个动作,不同人做有不同结果”:比如 “吃饭” 这个行为,普通人用筷子吃、西方人用刀叉吃、小朋友用勺子吃 —— 动作(行为)是同一个,但不同对象(人)执行的方式和结果不同。在代码里,就是父类的 “壳”(引用)装了子类的 “芯”(对象),调用同一个方法时,实际执行的是子类重写后的逻辑。
3. 多态的核心知识点
1. 多态的表现形式
// 父类 class Animal { public void eat() { System.out.println("动物吃东西"); } } // 子类1:重写父类方法 class Cat extends Animal { @Override public void eat() { System.out.println("猫吃小鱼干"); } // 子类特有方法 public void catchMouse() { System.out.println("猫抓老鼠"); } } // 子类2:重写父类方法 class Dog extends Animal { @Override public void eat() { System.out.println("狗啃骨头"); } } public class PolymorphismDemo { public static void main(String[] args) { // 核心表现:父类引用指向子类对象(向上转型/自动类型转换) Animal animal1 = new Cat(); Animal animal2 = new Dog(); // 调用eat方法:表现出不同形态(多态核心效果) animal1.eat(); // 输出:猫吃小鱼干 animal2.eat(); // 输出:狗啃骨头 } }2. 多态的前提
- 必须有继承 / 实现关系(如 Cat 继承 Animal);
- 必须有父类引用指向子类对象(如
Animal animal1 = new Cat()); - 必须有方法的重写(如 Cat、Dog 重写 eat 方法)。
3. 多态的好处
- 好处 1:方法参数用父类型,可接收所有子类对象,提升代码通用性:
// 新增方法:接收Animal类型,可传入Cat/Dog等子类对象 public static void feed(Animal animal) { animal.eat(); // 传入Cat则执行Cat的eat,传入Dog则执行Dog的eat } // 调用示例 feed(new Cat()); // 输出:猫吃小鱼干 feed(new Dog()); // 输出:狗啃骨头 - 好处 2:统一调用入口,不同子类自动执行重写后的逻辑,降低代码耦合。
4. 多态的弊端与解决
- 弊端:父类引用无法直接调用子类特有功能(如
animal1.catchMouse()会报错); - 解决:强制类型转换(向下转型),但需用
instanceof判断类型,避免ClassCastException:public static void main(String[] args) { Animal animal1 = new Cat(); // 向下转型:父类引用转回子类类型 if (animal1 instanceof Cat) { // 判断animal1是否是Cat类型 Cat cat = (Cat) animal1; // 强制转换 cat.catchMouse(); // 调用子类特有方法,输出:猫抓老鼠 } // 错误示例:若转换类型不匹配,会抛异常 // if (animal1 instanceof Dog) { // Dog dog = (Dog) animal1; // 报错:ClassCastException // } }
5. 多态的类型转换
| 类型 | 说明 | 示例 |
|---|---|---|
| 向上转型(自动) | 子类→父类,多态的默认形式 | Animal a = new Cat() |
| 向下转型(强制) | 父类→子类,用于调用子类特有方法 | Cat c = (Cat) a |
