彻底解析Java访问修饰符:public、private、protected及默认的区别

文章目录

  • 彻底解析 Java 访问修饰符:public、private、protected 及默认的区别?
    • 什么是访问修饰符?
    • 第一部分:public(公共的)
      • public 的作用范围
      • public 的应用场景
      • 示例代码
    • 第二部分:private(私有的)
      • private 的作用范围
      • private 的应用场景
      • 示例代码
    • 第三部分:protected(受保护的)
      • protected 的作用范围
      • protected 的应用场景
      • 示例代码
    • 第四部分:默认(无修饰符)
      • 默认的作用范围
      • 默认的使用场景
      • 示例代码
    • 总结
    • 理解这些规则并合理应用它们,将帮助我们写出更高质量的代码。
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

彻底解析 Java 访问修饰符:public、private、protected 及默认的区别?

作为一名 Java 开发者,你是否曾经对那些神秘的访问修饰符感到困惑?比如 public、private、protected 以及那个没有名字的“默认”访问级别。别担心,闫工来帮你理清这些概念!在这篇文章中,我们将彻底解析这四种访问修饰符的区别和应用场景,并通过代码示例来帮助你更好地理解它们。记住,掌握访问修饰符是成为一名优秀 Java 开发者的必经之路!


什么是访问修饰符?

在 Java 中,访问修饰符用于控制类、方法或变量的可见性和可访问性。简单来说,访问修饰符决定了其他类是否可以访问这些成员(如方法和变量)。Java 提供了四个访问修饰符:

  1. public
  2. private
  3. protected
  4. 默认(无修饰符)

每个修饰符都有不同的作用范围和使用场景。接下来,我们将逐一分析它们的特点,并通过代码示例来展示它们的实际效果。


第一部分:public(公共的)

public是最宽松的访问修饰符,它表示“完全公开”。任何类都可以访问被 public 修饰的方法或变量,无论这些类是在同一个包中还是在不同的包中。

public 的作用范围

  • 同一类:可以访问。
  • 同一个包中的其他类:可以访问。
  • 不同包中的类:如果使用了 import 语句,也可以访问。

public 的应用场景

当你希望某个方法或变量对其他类完全开放时,就可以使用 public。例如:

  • 类的构造函数通常会设置为 public,以便其他类能够创建该类的对象。
  • 类的 getter 和 setter 方法通常是 public,因为它们允许外部代码访问和修改对象的状态。

示例代码

// 定义一个类,其中包含 public 方法和变量publicclassCar{publicStringbrand;// 公共变量publicvoiddrive(){// 公共方法System.out.println("-driving the car...");}}// 在另一个类中访问 public 成员publicclassTestCar{publicstaticvoidmain(String[]args){CarmyCar=newCar();myCar.brand="Toyota";// 可以直接访问 brand 变量myCar.drive();// 可以直接调用 drive 方法}}

从上面的代码可以看到,TestCar 类可以轻松地访问 Car 类中的 public 成员。这展示了 public 的开放性和便利性。


第二部分:private(私有的)

private则是相反,它是最严格的访问修饰符。被 private 修饰的方法或变量只能在声明它的类中访问,其他任何类都无法直接访问它。

private 的作用范围

  • 同一类:可以访问。
  • 同一个包中的其他类:无法访问。
  • 不同包中的类:也无法访问。

private 的应用场景

当你希望某个方法或变量只在当前类内部使用时,就可以使用 private。例如:

  • 类的内部辅助方法通常会设置为 private,因为它们不需要被外部调用。
  • 类的某些敏感数据(如密码、令牌)可以设置为 private,以防止被篡改。

示例代码

// 定义一个类,其中包含 private 方法和变量publicclassPerson{privateStringpassword;// 私有变量privatevoidcheckPassword(){// 私有方法System.out.println("Checking password...");}}// 在另一个类中尝试访问 private 成员publicclassTestPerson{publicstaticvoidmain(String[]args){Personperson=newPerson();person.password="123456";// 编译错误,无法访问 private 变量person.checkPassword();// 编译错误,无法调用 private 方法}}

从上面的代码可以看到,TestPerson 类无法直接访问 Person 类中的 private 成员。这确保了数据的安全性和封装性。


第三部分:protected(受保护的)

protected是一个介于 public 和 private 之间的访问修饰符。它比 private 更宽松,但比 public 更严格。被 protected 修饰的方法或变量可以在以下情况下访问:

  • 同一类:可以访问。
  • 同一个包中的其他类:可以访问。
  • 不同包中的子类:也可以访问。

protected 的作用范围

  • 同一包中的类:可以访问。
  • 不同包中的子类:可以访问,但必须通过继承关系。
  • 其他情况:无法访问。

protected 的应用场景

当你希望某个方法或变量在同一个包中或者被子类继承时使用,就可以选择 protected。例如:

  • 类的内部状态可能需要被子类访问,但不希望公开给所有外部类。
  • 某些方法可能需要在同包中协作,同时允许子类重写。

示例代码

// 定义一个父类,其中包含 protected 方法和变量publicclassAnimal{protectedStringname;// 受保护的变量protectedvoideat(){// 受保护的方法System.out.println("Eating...");}}// 同一包中的子类可以访问 protected 成员classDogextendsAnimal{publicvoidbark(){name="Buddy";// 可以访问父类的 protected 变量eat();// 可以调用父类的 protected 方法}}// 不同包中的子类也可以访问 protected 成员packagecom.example.newPackage;importcom.example.Animal;publicclassCatextendsAnimal{publicvoidsleep(){name="Whiskers";// 可以访问父类的 protected 变量eat();// 可以调用父类的 protected 方法}}// 不同包且非子类无法访问 protected 成员packagecom.example.newPackage;publicclassTestProtected{publicstaticvoidmain(String[]args){Animalanimal=newAnimal();animal.name="Test";// 编译错误,无法访问 protected 变量animal.eat();// 编译错误,无法调用 protected 方法}}

从上面的代码可以看到:

  1. Dog 类(同一包中)可以访问父类 Animal 的 protected 成员。
  2. Cat 类(不同包中的子类)也可以访问父类 Animal 的 protected 成员。
  3. TestProtected 类(非子类且不在同一包)无法访问 protected 成员。

这展示了 protected 的灵活性和安全性。


第四部分:默认(无修饰符)

如果你在声明方法或变量时没有显式地指定任何访问修饰符,那么它将具有默认访问级别。默认访问级别也被称为“package-private”,因为它只允许同一包中的类进行访问。

默认的作用范围

  • 同一类:可以访问。
  • 同一个包中的其他类:可以访问。
  • 不同包中的类:无法访问,即使它们是子类。

默认的使用场景

当你希望某个方法或变量在同一个包中协作,但不希望公开给其他包时,可以选择默认访问级别。例如:

  • 某些工具类可能需要与同包中的类进行协作,但不需要暴露给外部。
  • 一些内部实现细节可以在同一包中共享,而不影响封装性。

示例代码

// 定义一个类,其中包含默认方法和变量publicclassUtils{Stringname;// 默认访问级别voidprint(){// 默认访问级别System.out.println("Printing...");}}// 同一包中的类可以访问默认成员classTestUtils{publicstaticvoidmain(String[]args){Utilsutils=newUtils();utils.name="Test";// 可以访问utils.print();// 可以调用}}// 不同包中的类无法访问默认成员packagecom.example.newPackage;publicclassTestDefault{publicstaticvoidmain(String[]args){Utilsutils=newUtils();utils.name="Test";// 编译错误,无法访问默认成员utils.print();// 编译错误,无法调用默认方法}}

从上面的代码可以看到:

  1. TestUtils 类(同一包中)可以访问 Utils 的默认成员。
  2. TestDefault 类(不同包中)无法访问 Utils 的默认成员。

这展示了默认访问级别的局限性和封装性。


总结

在 Java 中,访问修饰符是控制类、方法和变量可见性的关键工具。通过合理使用 public、private、protected 和默认访问级别,我们可以确保代码的安全性、灵活性和可维护性。

  • public:完全开放,任何地方都可以访问。
  • private:严格限制,只有同一类可以访问。
  • protected:受保护的,允许同包和子类访问。
  • 默认:只在同一包中可见,适合内部协作。

理解这些规则并合理应用它们,将帮助我们写出更高质量的代码。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1160574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AnimeGANv2代码实例:Python调用模型避坑指南

AnimeGANv2代码实例:Python调用模型避坑指南 1. 引言 1.1 项目背景与技术价值 随着深度学习在图像生成领域的快速发展,风格迁移(Style Transfer)技术已从早期的神经网络艺术化处理演进到如今高度精细化的动漫风格转换。其中&am…

一键部署通义千问2.5-7B-Instruct,AI应用开发从未如此简单

一键部署通义千问2.5-7B-Instruct,AI应用开发从未如此简单 1. 引言:为什么选择通义千问2.5-7B-Instruct? 随着大模型技术的快速演进,开发者对高效、轻量且可商用的本地化推理模型需求日益增长。在这一背景下,通义千问…

手把手教程:用通义千问2.5-7B和vLLM实现代码补全功能

手把手教程:用通义千问2.5-7B和vLLM实现代码补全功能 1. 学习目标与前置知识 本文将带领读者从零开始,使用 通义千问2.5-7B-Instruct 模型结合 vLLM 推理框架,搭建一个高效的本地化代码补全系统。通过本教程,您将掌握&#xff1…

Windows 10/11 优化大师 Windows Manager

一、前言:为什么 Windows 10/11 越用越卡? 相信很多朋友都有这样的体验: 新装的 Windows 10 / Windows 11 用着很流畅用了一段时间后: 开机变慢系统反应迟钝后台服务越来越多磁盘空间被莫名其妙占满 即便你不安装乱七八糟的软…

hal_uart_transmit支持多协议切换的控制系统设计方案

基于hal_uart_transmit的多协议动态切换系统设计:从理论到实战在嵌入式控制系统中,我们常常面临一个看似简单却极具挑战的现实问题:如何让一块MCU通过同一个UART接口,与使用不同通信协议的多个外设稳定“对话”?比如&a…

AnimeGANv2实战:动漫风格社交媒体广告

AnimeGANv2实战:动漫风格社交媒体广告 1. 引言 随着人工智能技术在图像生成领域的不断突破,将现实世界的照片转化为具有艺术风格的数字作品已成为可能。其中,AnimeGANv2 作为专为“照片转二次元动漫”设计的轻量级生成对抗网络(…

access数据库损坏后的修复方法

access数据库是微软Office套件里的“轻量级”关系型数据库,特别适合个人或小团队处理结构化数据。它最大的优势是‌零代码上手‌——通过可视化操作就能完成数据管理,同时支持VBA编程实现复杂功能。“轻量级”“关系型”基本上把Access的应用场景和特征说…

QProcess调用外部程序

在桌面应用开发中,调用外部程序是绑定不开的需求:执行系统命令、调用 FFmpeg 转码、启动 Git 操作……很多开发者习惯用 system("command") 一行解决,却不知道这种写法会阻塞整个线程,让 GUI 界面卡成 PPT。 Qt 提供的…

VibeThinker-1.5B值得部署吗?数学与编程双项评测教程

VibeThinker-1.5B值得部署吗?数学与编程双项评测教程 1. 引言:小参数模型的推理新星 随着大模型训练成本不断攀升,业界对高效、低成本的小参数模型关注度日益提升。微博开源的 VibeThinker-1.5B 正是在这一背景下诞生的一款实验性但极具潜力…

AnimeGANv2如何实现美颜效果?人脸优化算法深度解析

AnimeGANv2如何实现美颜效果?人脸优化算法深度解析 1. 技术背景与问题提出 近年来,AI驱动的图像风格迁移技术在艺术化图像生成领域取得了显著进展。其中,将真实人物照片转换为二次元动漫风格的应用场景尤为受欢迎,广泛应用于社交…

微博开源模型实战:VibeThinker-1.5B WEBUI界面使用详解

微博开源模型实战:VibeThinker-1.5B WEBUI界面使用详解 1. 引言 1.1 业务场景描述 随着大模型在数学推理与代码生成领域的广泛应用,如何在有限算力条件下实现高效、低成本的推理能力成为中小团队和开发者关注的核心问题。微博近期开源的 VibeThinker-…

导师推荐!8款AI论文软件测评,本科生毕业论文必备

导师推荐!8款AI论文软件测评,本科生毕业论文必备 2026年AI论文工具测评:如何选出最适合本科生的写作助手 随着人工智能技术在学术领域的深入应用,越来越多的本科生开始借助AI论文软件提升写作效率。然而,面对市场上琳琅…

VibeVoice-TTS模型更新机制:版本升级与回滚操作

VibeVoice-TTS模型更新机制:版本升级与回滚操作 1. 引言 1.1 业务场景描述 随着语音合成技术在播客、有声书、虚拟助手等长文本多角色对话场景中的广泛应用,对TTS系统在长序列生成能力、多说话人一致性以及自然对话流控制方面的要求日益提升。VibeVoi…

Keil环境下51单片机流水灯代码生成操作指南

从零开始点亮第一盏灯:Keil环境下51单片机流水灯实战全记录还记得你第一次看到LED闪烁时的兴奋吗?那种“我写的代码真的在控制物理世界”的震撼感,是每个嵌入式工程师都无法忘记的起点。今天,我们就从最经典的项目——流水灯入手&…

VibeThinker-1.5B-WEBUI权限管理:多用户场景下的配置建议

VibeThinker-1.5B-WEBUI权限管理:多用户场景下的配置建议 1. 引言 1.1 业务场景描述 随着轻量级大模型在开发者社区的广泛应用,VibeThinker-1.5B-WEBUI 因其低成本、高推理效率的特点,逐渐成为个人开发者和小型团队进行数学推导与编程辅助…

零基础玩转通义千问2.5:7B-Instruct模型保姆级部署教程

零基础玩转通义千问2.5:7B-Instruct模型保姆级部署教程 1. 引言 随着大语言模型技术的快速演进,Qwen2.5 系列在2024年9月正式发布,标志着中等体量模型在性能与实用性上的又一次飞跃。其中,通义千问2.5-7B-Instruct 作为该系列的…

【性能测试】2_JMeter _JMeter文件目录

文章目录一、Bin目录二、docs目录三、printable_docs目录四、lib目录一、Bin目录 Bin目录:存放可执行文件和配置文件。 examples:目录下包含Jmeter使用实例ApacheJMeter.jar:JMeter源码包jmeter.bat:windows下启动文件jmeter.sh&#xff1a…

AnimeGANv2技术指南:实现高质量动漫风格迁移的秘诀

AnimeGANv2技术指南:实现高质量动漫风格迁移的秘诀 1. 引言 随着深度学习在图像生成领域的快速发展,风格迁移(Style Transfer)技术已从学术研究走向大众应用。其中,将真实照片转换为具有二次元动漫风格的图像&#x…

AnimeGANv2性能测试:批量处理的效率优化方案

AnimeGANv2性能测试:批量处理的效率优化方案 1. 引言 1.1 业务场景描述 随着AI图像风格迁移技术的普及,将真实照片转换为二次元动漫风格已成为社交媒体、个性化头像生成等场景中的热门需求。AnimeGANv2作为轻量级且高效的人脸风格迁移模型&#xff0c…

深度学习毕设项目推荐-基于python-CNN训练识别夏冬季节风景

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…