Java 访问权限控制符详解

发布时间:2026/9/12 16:46:21

Java 访问权限控制符详解 1. 访问权限控制符概述在 Java 中访问权限控制符Access Modifiers是用于控制类、接口、变量、方法等成员可见性的关键字。它们决定了其他类是否可以访问某个成员是实现面向对象编程中“封装”特性的重要手段。Java 提供了四种访问权限级别从最宽松到最严格依次为public、protected、default包访问权限无关键字和private。2. 四种访问权限详解2.1 public公共的public是限制最宽松的访问级别。被public修饰的成员可以被任何其他类访问无论这些类是否在同一个包中或者是否是子类。// 示例public 类和方法 public class PublicDemo { public String publicField 这是一个公共字段; public void publicMethod() { System.out.println(这是一个公共方法); } } // 在其他任何类中都可以访问 class AnotherClass { public void test() { PublicDemo demo new PublicDemo(); System.out.println(demo.publicField); // 可以访问 demo.publicMethod(); // 可以调用 } }使用场景对外提供的 API 接口、工具类方法、常量等。2.2 protected受保护的protected修饰的成员可以被同一包内的其他类访问也可以被不同包中的子类访问。// 父类在包 com.example package com.example; public class Parent { protected String protectedField 受保护字段; protected void protectedMethod() { System.out.println(受保护方法); } } // 子类在另一个包 com.test package com.test; import com.example.Parent; public class Child extends Parent { public void accessProtected() { System.out.println(protectedField); // 可以访问通过继承 protectedMethod(); // 可以调用 } } // 非子类即使在同一个包也不能直接访问 protected 成员除非通过子类实例 class UnrelatedClass { public void test() { Parent parent new Parent(); // System.out.println(parent.protectedField); // 编译错误 // parent.protectedMethod(); // 编译错误 } }使用场景希望子类能够继承和覆盖但不希望对外完全公开的成员。2.3 default包访问权限当不使用任何访问修饰符时成员具有包访问权限也称为默认访问权限。这意味着它只能被同一个包内的其他类访问。// 在包 com.example 中 package com.example; class DefaultClass { // 默认访问权限的类 String defaultField 默认字段; // 默认访问权限的字段 void defaultMethod() { // 默认访问权限的方法 System.out.println(默认方法); } } // 同一个包内的其他类可以访问 class SamePackageClass { public void test() { DefaultDemo demo new DefaultDemo(); System.out.println(demo.defaultField); // 可以访问 demo.defaultMethod(); // 可以调用 } } // 不同包中的类无法访问 package com.other; import com.example.DefaultDemo; class DifferentPackageClass { public void test() { // DefaultDemo demo new DefaultDemo(); // 编译错误类不可见 // 即使能创建实例也无法访问 default 成员 } }使用场景包内工具类、内部实现细节不希望被包外访问。2.4 private私有的private是限制最严格的访问级别。被private 修饰的成员只能在其定义的类内部访问即使是子类也不能直接访问。public class PrivateDemo { private String privateField 私有字段; private void privateMethod() { System.out.println(私有方法); } // 通过公共方法提供访问封装 public String getPrivateField() { return privateField; } public void setPrivateField(String value) { this.privateField value; } public void callPrivateMethod() { privateMethod(); // 类内部可以调用 } } class TestClass { public void test() { PrivateDemo demo new PrivateDemo(); // System.out.println(demo.privateField); // 编译错误 // demo.privateMethod(); // 编译错误 // 只能通过公共方法访问 System.out.println(demo.getPrivateField()); demo.callPrivateMethod(); } }使用场景类的内部状态、实现细节需要完全隐藏的数据。3. 访问权限总结表访问修饰符同一类中同一包中不同包子类不同包非子类public✅✅✅✅protected✅✅✅❌default✅✅❌❌private✅❌❌❌4. 使用原则与最佳实践4.1 最小权限原则为成员分配尽可能严格的访问权限。如果不确定应该使用哪种权限从private开始然后根据需要逐步放宽。4.2 封装与数据隐藏使用private修饰字段通过公共的 getter 和 setter 方法提供受控的访问这是实现封装的标准做法。public class Student { private String name; private int age; // Getter 和 Setter public String getName() { return name; } public void setName(String name) { if (name ! null !name.trim().isEmpty()) { this.name name; } } public int getAge() { return age; } public void setAge(int age) { if (age 0 age 150) { this.age age; } } }4.3 继承设计如果希望方法被子类覆盖但不希望对外公开使用protected。这为子类提供了扩展点同时隐藏了实现细节。4.4 包设计将功能相关的类放在同一个包中使用default访问权限保护包内实现细节对外只暴露必要的publicAPI。5. 常见问题与注意事项5.1 外部类只能使用 public 或 default顶层类非内部类只能使用public或default访问修饰符不能使用protected或private。5.2 接口成员默认为 public接口中的方法默认是public abstract字段默认是public static final。虽然可以显式指定public但通常省略。5.3 构造函数的访问权限构造函数也可以使用访问修饰符控制对象的创建public任何类都可以创建实例protected同一包或子类可以创建实例default同一包内可以创建实例private常用于单例模式或工具类防止外部实例化5.4 访问权限与继承子类覆盖父类方法时不能降低访问权限可以保持或提高父类public→ 子类必须public父类protected→ 子类可以是protected或public父类default→ 子类可以是default、protected或public但只能在同包中继承父类private→ 不能继承因此也不存在覆盖6. 总结Java 的访问权限控制符是构建健壮、可维护面向对象系统的基石。正确使用这些修饰符可以实现良好的封装、清晰的 API 边界和安全的继承体系。记住从最严格的权限开始只在必要时放宽这是编写高质量 Java 代码的重要原则。
延伸阅读

更多相关文章

2026/9/10 4:05:08

书法老师线上转型:不用租场地,轻资产做线上课程的方法

对于很多深耕线下的书法老师来说,近几年的办学压力越来越明显:场地租金逐年上涨,生源受社区周边范围限制,旺季淡季收入差距大,单靠线下授课的收入天花板清晰可见。也正因如此,越来越多书法老师开始转向线上…

2026/9/7 12:28:45

信息学奥赛递推算法 1313 题:3步构建偶数个3数字计数模型

信息学奥赛递推算法精解:构建偶数个3数字计数模型的实战指南1. 递推算法基础与问题建模递推算法是信息学竞赛中解决计数问题的利器,其核心思想是通过已知的小规模问题解来推导大规模问题的解。在解决"统计n位数中偶数个3的数字数量"这类问题时…

2026/9/12 21:21:04

ProxyPin 请求阻塞实战:3 步快速拦掉广告与追踪请求

ProxyPin 请求阻塞实战:3 步快速拦掉广告与追踪请求 【免费下载链接】network_proxy_flutter Open source free capture HTTP(S) traffic software ProxyPin, supporting full platform systems 项目地址: https://gitcode.com/GitHub_Trending/ne/network_proxy_…

2026/9/12 21:21:04

晶振设计十大陷阱:从起振失败到EMC超标的工程真相

1. 晶振不是“插上就能用”的标准件:从一个烧掉三块PCB的故障说起去年帮一家做工业温控模块的客户做EMC整改,连续三块新打样的PCB在高温老化测试中出现通信丢包——不是偶发,是每次升温到65℃以上就稳定复现。示波器抓晶振输出波形&#xff0…

2026/9/12 21:21:04

ZLUDA完整配置指南:AMD显卡跑通CUDA应用

ZLUDA完整配置指南:AMD显卡跑通CUDA应用 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 如果你的应用只提供 CUDA 版本,你不必非得买 NVIDIA 显卡。ZLUDA 是面向非 NVIDIA GPU 的开源 …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

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

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

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

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码