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

Java十五:封装和接口

一、封装

1. 什么是封装

封装是将对象的状态(属性)和行为(方法)包装在一起,并隐藏内部实现细节,只对外暴露必要的访问接口。

2. 封装的实现方式

① 使用访问修饰符
修饰符同类同包子类任何地方
private
default(无修饰符)
protected
public
public class Student { // 私有属性 - 隐藏内部状态 private String name; private int age; private double score; private List<String> courses; // 构造方法 public Student(String name, int age) { this.name = name; setAge(age); // 使用setter进行校验 this.courses = new ArrayList<>(); } // 公开的getter方法 - 受控访问 public String getName() { return name; } public int getAge() { return age; } public double getScore() { return score; } // 公开的setter方法 - 包含业务逻辑和校验 public void setName(String name) { if (name == null || name.trim().isEmpty()) { throw new IllegalArgumentException("姓名不能为空"); } this.name = name; } public void setAge(int age) { if (age < 0 || age > 150) { throw new IllegalArgumentException("年龄必须在0-150之间"); } this.age = age; } public void setScore(double score) { if (score < 0 || score > 100) { throw new IllegalArgumentException("分数必须在0-100之间"); } this.score = score; } // 业务方法 - 封装行为 public void addCourse(String course) { if (course == null || course.isEmpty()) { throw new IllegalArgumentException("课程名不能为空"); } courses.add(course); System.out.println(name + " 已添加课程:" + course); } public List<String> getCourses() { // 返回副本,保护内部数据不被外部修改 return new ArrayList<>(courses); } // 内部计算逻辑 - 对外隐藏 private String calculateGrade() { if (score >= 90) return "A"; if (score >= 80) return "B"; if (score >= 70) return "C"; if (score >= 60) return "D"; return "F"; } // 只暴露结果,不暴露计算过程 public void printReport() { System.out.println("学生:" + name); System.out.println("年龄:" + age); System.out.println("分数:" + score); System.out.println("等级:" + calculateGrade()); System.out.println("课程数:" + courses.size()); } }

二、接口

1. 什么是接口

接口是Java中的一种引用类型,是方法的集合。

2. 接口的基本语法

// 定义接口 public interface Animal { // 常量(默认 public static final) String TYPE = "动物"; // 抽象方法(默认 public abstract) void eat(); void sleep(); // 默认方法(Java 8+) default void breathe() { System.out.println("呼吸空气"); } // 静态方法(Java 8+) static void showType() { System.out.println("这是动物接口"); } // 私有方法(Java 9+) private void privateHelper() { System.out.println("私有辅助方法"); } } // 实现接口 public class Dog implements Animal { @Override public void eat() { System.out.println("狗吃骨头"); } @Override public void sleep() { System.out.println("狗趴着睡"); } // 可以选择重写默认方法 @Override public void breathe() { System.out.println("狗用肺呼吸"); } }

3. 接口的多实现

// 多个接口 interface Flyable { void fly(); } interface Swimmable { void swim(); } interface Runnable { void run(); } // 一个类可以实现多个接口 class Duck implements Flyable, Swimmable, Runnable { @Override public void fly() { System.out.println("鸭子飞得很低"); } @Override public void swim() { System.out.println("鸭子游泳"); } @Override public void run() { System.out.println("鸭子走路摇摇摆摆"); } }

4. 接口的继承

interface Vehicle { void start(); void stop(); } // 接口可以多继承 interface ElectricVehicle extends Vehicle { void charge(); } interface AutonomousVehicle extends Vehicle { void autoDrive(); } // 多继承 interface SmartElectricVehicle extends ElectricVehicle, AutonomousVehicle { void updateSoftware(); } // 实现类需要实现所有方法 class Tesla implements SmartElectricVehicle { @Override public void start() { System.out.println("特斯拉启动"); } @Override public void stop() { System.out.println("特斯拉停止"); } @Override public void charge() { System.out.println("特斯拉充电"); } @Override public void autoDrive() { System.out.println("特斯拉自动驾驶"); } @Override public void updateSoftware() { System.out.println("特斯拉软件升级"); } }

5. 函数式接口

// 函数式接口:只有一个抽象方法的接口 @FunctionalInterface interface Calculator { int calculate(int a, int b); // 可以有默认方法和静态方法 default void print() { System.out.println("计算结果"); } } // 使用 Lambda 表达式 public class TestFunctional { public static void main(String[] args) { // 传统方式 Calculator add = new Calculator() { @Override public int calculate(int a, int b) { return a + b; } }; // Lambda 方式 Calculator subtract = (a, b) -> a - b; Calculator multiply = (a, b) -> a * b; System.out.println(add.calculate(10, 5)); // 15 System.out.println(subtract.calculate(10, 5)); // 5 System.out.println(multiply.calculate(10, 5)); // 50 } }
http://www.jsqmd.com/news/768815/

相关文章:

  • 不会修图的人,如何用 GPT-Image-2 辅助出图
  • 3倍推理加速!Ultralytics YOLO模型OpenVINO部署架构深度解析
  • OpenMV颜色识别总调不准?可能是你没搞懂LAB颜色空间和阈值设定
  • OpenWrt端口转发不生效?从防火墙规则到IP转发全面排查
  • 普通用户用GPT-Image-2文生图模型,最实用的5个应用
  • Worm-GPT:AI安全攻防视角下的恶意提示工程与LLM滥用防御
  • 2026用GPT-5.5写文章:新手也能快速出稿
  • 基于子孔径的星载斜视条带SAR成像算法研究及实现DSP【附代码】
  • 为AI智能体接入Kagi搜索:提升信息获取质量与效率
  • 从静态站点到开发者门户:深度解析AsyncAPI官网架构与工程实践
  • 会议背景资料自动汇编(使用千问)
  • ActVer Skills:基于MCP协议为AI助手集成GitHub Actions版本管理能力
  • 视频里的PPT怎么一键提取?这款开源神器让你告别手动截图
  • 告别轮询!用LIN总线的事件触发帧优化你的汽车车窗控制(附Arduino模拟代码)
  • QQ音乐解码终极指南:3分钟学会qmcdump解锁加密音频
  • 3个核心技巧彻底优化《鸣潮》体验:从帧率解锁到抽卡分析的终极指南
  • 2026年4月可靠的退磁器品牌口碑推荐,口碑好的退磁器哪家好 - 品牌推荐师
  • 终极免费指南:如何彻底清理macOS应用残留文件
  • 自托管代码片段管理工具CodeFire部署与实战指南
  • 如何让闲置的PS3控制器在Windows上重获新生:DsHidMini完整使用指南
  • 山西医科大学考研辅导班机构选择:排行榜单与哪家好评测 - michalwang
  • 长期使用Taotoken聚合服务对开发运维复杂度的实际降低
  • DownKyi终极指南:5个技巧轻松搞定B站高清视频下载与批量处理
  • 【MIMO通信】神经网络MIMO无线通信全面性能分析【含Matlab源码 15415期】
  • 利用快马平台快速原型腾讯coding plan前端学习项目:待办清单应用
  • MTKClient终极指南:高效解锁联发科设备的底层调试与救砖技术
  • 从零开始使用 Taotoken 和 OpenClaw 搭建自动化工作流体验
  • 全天候守护,主动预警——视程空间VPP SC6N0-IR,重塑工业安全新范式
  • docker-compose 如何安装、使用及快速入门?
  • 湖北工业大学考研辅导班机构选择:排行榜单与哪家好评测 - michalwang