【Java SE】Java访问修饰符总结
Java访问修饰符详解全面掌握public、private、protected和默认修饰符访问修饰符概述修饰类的规则顶级类非内部类内部类嵌套类修饰成员变量⭐同一包中访问级别对比不同包中的访问修饰方法普通方法方法重写的访问规则修饰构造函数修饰接口成员最佳实践总结选择原则常用场景在Java中访问修饰符Access Modifiers是控制类、方法、变量和构造函数的可见性和访问权限的关键工具。合理使用访问修饰符是实现封装、提高代码安全性和可维护性的基础。本文将全面解析四种访问修饰符的使用规则和最佳实践。访问修饰符概述Java提供了四种访问级别从严格到开放依次为修饰符本类内部同一包内不同包子类不同包非子类private✓✗✗✗默认无修饰符✓✓✗✗protected✓✓✓✗public✓✓✓✓修饰类的规则顶级类非内部类顶级类只能使用public或默认修饰符// 正确示例publicclassPublicClass{}// 任何地方都可以访问classDefaultClass{}// 同一包内可以访问// 错误示例// private class PrivateClass { } // 编译错误// protected class ProtectedClass { } // 编译错误内部类嵌套类内部类可以使用所有四种访问修饰符publicclassOuterClass{publicclassPublicInner{}protectedclassProtectedInner{}privateclassPrivateInner{}// 只能在OuterClass内部访问classDefaultInner{}}修饰成员变量⭐同一包中访问级别对比publicclassVariableExample{publicintpublicVar;// 任何地方可访问protectedintprotectedVar;// 同一包内和子类可访问intdefaultVar;// 同一包内可访问privateintprivateVar;// 仅本类可访问publicvoidtestAccess(){this.publicVar1;// ✓ 可访问this.protectedVar2;// ✓ 可访问this.defaultVar3;// ✓ 可访问this.privateVar4;// ✓ 可访问}}不同包中的访问// 在不同包的子类中publicclassSubClassextendsVariableExample{publicvoidaccessInSubclass(){publicVar1;// ✓ 可访问protectedVar2;// ✓ 可访问通过继承// defaultVar 3; // ✗ 编译错误不同包// privateVar 4; // ✗ 编译错误}}// 在不同包的非子类中publicclassOtherClass{publicvoidaccessInOther(){VariableExampleexamplenewVariableExample();example.publicVar1;// ✓ 可访问// example.protectedVar 2; // ✗ 编译错误// example.defaultVar 3; // ✗ 编译错误// example.privateVar 4; // ✗ 编译错误}}修饰方法普通方法publicclassMethodExample{publicvoidpublicMethod(){}protectedvoidprotectedMethod(){}voiddefaultMethod(){}privatevoidprivateMethod(){}// 调用本类方法publicvoidcallAllMethods(){publicMethod();// ✓protectedMethod();// ✓defaultMethod();// ✓privateMethod();// ✓}}方法重写的访问规则重写方法的访问级别不能比原方法更严格publicclassParent{publicvoidpublicMethod(){}protectedvoidprotectedMethod(){}voiddefaultMethod(){}}classChildextendsParent{OverridepublicvoidpublicMethod(){}// ✓ 可以保持publicOverrideprotectedvoidprotectedMethod(){}// ✓ 可以保持protectedOverridepublicvoidprotectedMethod(){}// ✓ 可以提升为public// Override// private void protectedMethod() { } // ✗ 编译错误不能降级为privateOverridevoiddefaultMethod(){}// ✓ 在同一包中可以}修饰构造函数packageuniversity;// 学生类 - 展示各种访问级别的构造函数publicclassStudent{privateStringid;privateStringname;privateStringmajor;// 1. public构造函数 - 任何人都能创建普通学生publicStudent(Stringname){this.idgenerateId();this.namename;this.major未定;System.out.println(新生入学name);}// 2. protected构造函数 - 专门给子类研究生使用protectedStudent(Stringname,Stringmajor){this.idgenerateId();this.namename;this.majormajor;System.out.println(研究生入学name专业major);}// 3. 默认构造函数 - 只能在本包内使用用于快速创建测试对象Student(Stringname,Stringid,Stringmajor){this.idid;this.namename;this.majormajor;System.out.println(内部使用学生name);}// 4. private构造函数 - 只在类内部使用用于特殊初始化privateStudent(){this.id000000;this.name系统保留;this.major管理员;System.out.println(系统内部创建管理员学生);}// 静态工厂方法 - 外部通过这个获取特殊实例publicstaticStudentcreateAdminStudent(){returnnewStudent();// 调用private构造函数}privateStringgenerateId(){returnSSystem.currentTimeMillis();}publicvoidshowInfo(){System.out.println(学号id姓名name专业major);}}packageuniversity;// 研究生类 - 继承StudentpublicclassGraduateStudentextendsStudent{publicGraduateStudent(Stringname,Stringmajor){super(name,major);// 调用父类的protected构造函数 ✅System.out.println(研究生详细信息已创建);}}packageuniversity;// 测试类 - 同一个包内publicclassTestSamePackage{publicstaticvoidmain(String[]args){// 测试public构造函数Students1newStudent(张三);// ✅ 可以s1.showInfo();// 测试protected构造函数注意在同一个包内也可以直接调用protectedStudents2newStudent(李四,计算机);// ✅ 可以在同一包内调用protecteds2.showInfo();// 测试默认构造函数Students3newStudent(王五,S001,数学);// ✅ 可以同一包内s3.showInfo();// 测试private构造函数不能直接调用// Student s4 new Student(); // ❌ 编译错误// 通过静态方法获取private构造的对象Students4Student.createAdminStudent();// ✅ 可以s4.showInfo();// 测试子类GraduateStudentgsnewGraduateStudent(赵六,物理);// ✅ 可以gs.showInfo();}}packagecompany;// 不同包importuniversity.Student;publicclassTestDifferentPackage{publicstaticvoidmain(String[]args){// public构造函数 - 任何地方都能用Students1newStudent(小明);// ✅ 可以s1.showInfo();// protected构造函数 - 在不同包的非子类中不能调用// Student s2 new Student(小红, 英语); // ❌ 编译错误// 默认构造函数 - 在不同包中不能调用// Student s3 new Student(小刚, S002, 化学); // ❌ 编译错误// private构造函数 - 只能通过静态方法Students4Student.createAdminStudent();// ✅ 可以静态方法是publics4.showInfo();}}构造函数修饰符使用场景典型例子public普通的、任何人都能创建的类DTO、实体类、工具类protected抽象类、基类主要给子类用框架中的基类默认包内协作不对外公开的类内部实现类、辅助类private严格控制创建方式单例、工厂模式、工具类修饰接口成员接口成员有特殊的访问规则publicinterfaceMyInterface{// 接口中的变量默认是 public static finalintPUBLIC_CONSTANT100;// 实际上是 public static final// 接口中的方法默认是 public abstractvoidpublicMethod();// 实际上是 public abstract// Java 9 可以有private方法privatevoidprivateMethod(){System.out.println(Private method in interface);}// default方法默认是publicdefaultvoiddefaultMethod(){privateMethod();// 可以调用private方法}}最佳实践总结选择原则最小权限原则尽可能使用最严格的访问级别封装性将实现细节隐藏起来只暴露必要的API常用场景场景推荐修饰符原因API公开方法public需要对外提供服务工具类常量public需要全局访问内部实现细节private隐藏实现便于修改子类需要的方法protected平衡封装和继承同一包协作的类默认包级封装publicclassBankAccount{// 私有成员变量 - 封装数据privateStringaccountNumber;privatedoublebalance;// 公共构造函数publicBankAccount(StringaccountNumber){this.accountNumberaccountNumber;this.balance0;}// 公共APIpublicvoiddeposit(doubleamount){if(amount0){balanceamount;logTransaction(Deposit,amount);// 调用私有方法}}publicdoublegetBalance(){returnbalance;}// 保护方法 - 子类可以扩展protectedvoidlogTransaction(Stringtype,doubleamount){System.out.println(type: $amount);}// 私有方法 - 内部实现privatebooleanvalidateAmount(doubleamount){returnamount0amount10000;}}

相关新闻

MySQL 日志全解:谁在默默守护你的数据安全?

MySQL 日志全解:谁在默默守护你的数据安全?

刚才聊完了 MySQL 的索引,很多兄弟可能会觉得:“只要索引建好了,数据库不就稳了吗?”其实不然。索引决定了你查得快不快,而日志(Log)则决定了你的数据稳不稳,尤其是在断电、宕机这种…

2026/7/3 1:45:27 阅读更多 →
IDEA 常用快捷键

IDEA 常用快捷键

alt ins 可以自动补全构造函数 (两次tab选择none)ctrl / 单行注释,两次单行注释等于取消单行注释ctrl p 查看括号中参数

2026/5/17 12:55:46 阅读更多 →
IFN-γ Surpass ELISA试剂盒如何揭示剂量依赖性干扰素-γ对肿瘤干细胞的双重调控?

IFN-γ Surpass ELISA试剂盒如何揭示剂量依赖性干扰素-γ对肿瘤干细胞的双重调控?

一、干扰素-γ在肿瘤微环境中为何呈现剂量依赖性的双重作用?干扰素-γ(IFN-γ)主要由活化的T细胞、自然杀伤细胞等免疫细胞产生,传统上被视为抗肿瘤免疫的核心细胞因子。其通过与细胞表面的异源二聚体受体(IFNGR1/IFNG…

2026/7/2 22:59:47 阅读更多 →

最新新闻

Anthropic Claude Code 被指用文本隐写术标记用户,失去的信任能否回滚?

Anthropic Claude Code 被指用文本隐写术标记用户,失去的信任能否回滚?

Anthropic 又翻车,Claude Code 暗藏隐写术我们发现,Anthropic 这次又翻车了。6 月 30 日,一名 Reddit 用户发布逆向分析,拆解 Claude Code 2.1.196 的二进制文件,发现一段触发条件具体、行为隐蔽的函数。当使用代理连接…

2026/7/4 3:17:48 阅读更多 →
三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取?

三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取?

三星固件下载难题:如何用Kotlin跨平台技术5分钟搞定官方固件获取? 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 在安卓设备维护和开发领…

2026/7/4 3:17:48 阅读更多 →
python-LangGraph框架(3-32-LangGraph 并行验证)

python-LangGraph框架(3-32-LangGraph 并行验证)

一、LangGraph 并行执行核心优势相比其他工作流框架,LangGraph 的并行能力具备三大核心亮点:极简定义,无冗余代码:无需手动管理线程、协程,框架底层自动处理任务并发,专注业务逻辑即可;状态自动…

2026/7/4 3:15:48 阅读更多 →
Claude Code拆解:提示词工程的36:1省钱密码

Claude Code拆解:提示词工程的36:1省钱密码

架构剖析:Claude Code 的提示词工程——从模块拆解到动态组装的全链路解析 引言:为什么要把提示词拆成一块一块的? 大多数人写 System Prompt 的方式是打开一个文本框,从头写到尾,越写越长,最后变成一坨谁都…

2026/7/4 3:13:47 阅读更多 →
如何高效解决夸克网盘存储空间瓶颈:Quark-Auto-Save智能转存系统实战指南

如何高效解决夸克网盘存储空间瓶颈:Quark-Auto-Save智能转存系统实战指南

如何高效解决夸克网盘存储空间瓶颈:Quark-Auto-Save智能转存系统实战指南 【免费下载链接】quark_auto_save 夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙 项目地址: https://gitcode.com/gh_mirrors/qu/quark_auto_save 夸克网盘自动转…

2026/7/4 3:13:47 阅读更多 →
RevokeMsgPatcher防撤回补丁原理与使用指南:逆向工程实战

RevokeMsgPatcher防撤回补丁原理与使用指南:逆向工程实战

1. 项目概述:为什么我们需要一个“防撤回补丁”?在即时通讯软件成为工作与生活核心工具的今天,微信、QQ、TIM的“消息撤回”功能,时常会带来一些微妙的困扰。无论是同事发错后撤回的关键工作指示,还是朋友撤回的一句“…

2026/7/4 3:13:47 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻