当前位置: 首页 > news >正文

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

http://www.cnnetsun.cn/news/1248884.html

相关文章:

  • SQL概念及DDL
  • AI Agent 两大 “神辅助” 对决:MCP vs Skills 谁更能打?
  • 告别“代码民工”,拥抱“智能体架构师”:我的 2025 复盘与 2026 OpenClaw+VibeCoding 实战宣言
  • sqlilabs less-3 笔记
  • 从全网爆火的 OpenClaw 说起:为什么“个人数字员工”撑不起企业的 AI 野心?
  • OpenClaw(龙虾) + Qwen3-32B 踩坑实录:那些文档里没写的“血泪教训”
  • 贴心售后RFID设备资深厂家
  • 平滑加权轮询负载均衡的底层逻辑
  • . 使用TFloatKeyAnimation关键帧创建弹跳球动画 . 使用TColorKeyAnimation关键帧动画眩目背景变换 ...
  • Docker Desktop里搭建RabbitMq ..集群的保姆级教程
  • 2026年AI写作与创作利器:7款高效工具助你事半功倍
  • 写一段提取PDF单线图材料表的代码,能支持各种格式的PDF
  • 彼岸花会盛开在理想的他乡
  • Spring AI + RAG 从 0 到 1 落地:本地知识库 + 联网搜索,一套代码直接跑通
  • 推理框架极简入门与实战指南(非常详细),Nano-vLLM从入门到精通,收藏这一篇就够了!
  • 14K Star开源RAG项目实战全解(非常详细),检索优化从入门到精通,收藏这一篇就够了!
  • windows 安装openclaw的优势
  • 第 21 篇、为什么 Docker Compose 的 depends_on 根本管不住服务启动顺序?90% 的新手都搞错了
  • OpenClaw 腾讯云 + 火山方舟(Volcengine Ark)完整安装与扩展教程
  • HLS.js 原生开发!m3u8live.cn打造最贴合项目的 M3U8 在线播放器
  • 给Redis增加密码
  • 项目实训记录
  • CMake构建学习笔记-iconv库的构建
  • Flutter 三方库 graph_kit 的鸿蒙化适配指南 - 让逻辑治理回归“拓扑之美”,打造鸿蒙应用专家级的图算法与依赖治理中台
  • STM32F系列兼容西门子S7 200PLC源码 CPU:STM32F103RCT6(或其他S...
  • 【拼多多内推】2027届实习生
  • mac电脑查看安装的mysql版本以及启动
  • 使用 C++、YOLO 和 ONNX Runtime 实现实时目标检测的完整教程整理与代码实现指南。
  • 线性代数直觉(六):向量通过矩阵
  • 华沙理工大学突破性发现:让音乐生成变得可控