public、private、protected、默认的区别一文搞定Java访问控制符1. 先看结论速记版2. 流程图访问权限判断规则3. 四种访问权限详解3.1 private类的私密空间3.2 默认package-private包级私有3.3 protected继承的桥梁3.4 public完全公开4. 横向对比同一个类中能否访问5. 类级别的访问限制6. 继承与方法重写时的规则7. 总结对比表包含继承关系8. 记忆口诀9. 思考题检验是否真的懂了The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇在 Java 中访问控制符Access Modifiers是面向对象封装特性的核心体现。很多初学者甚至工作一段时间的开发者对这四个级别的权限区分仍然模糊。本文将通过表格、流程图、代码示例帮你彻底理清public、private、protected和默认包级私有的区别。1. 先看结论速记版访问修饰符同类同包子类不同包任何位置private✅❌❌❌默认无修饰符✅✅❌❌protected✅✅✅❌public✅✅✅✅一句话总结private 默认 protectedpublic权限依次放宽private 最严public 最宽。2. 流程图访问权限判断规则是否是private默认/protected/public否是protected/public默认/private否public其他尝试访问成员是否在同一个类中✅ 均可访问是否在同一个包中修饰符是什么❌ 不可访问✅ 可访问是否是子类修饰符是什么✅ 可访问❌ 不可访问修饰符是什么✅ 可访问❌ 不可访问3. 四种访问权限详解3.1 private类的私密空间只能在当前类内部访问这是封装性最强的级别。publicclassPerson{privateintage;// 私有成员privatevoidsecret(){// 私有方法System.out.println(这是秘密);}publicvoidshow(){System.out.println(age);// ✅ 同类中可访问secret();// ✅ 同类中可访问}}publicclassTest{publicstaticvoidmain(String[]args){PersonpnewPerson();// p.age 10; ❌ 编译错误// p.secret(); ❌ 编译错误}}使用场景隐藏内部实现细节如成员变量、工具方法。3.2 默认package-private包级私有不加任何修饰符只能在同一个包内访问。// 文件com/example/Person.javapackagecom.example;classPerson{// 默认修饰符Stringname;// 默认修饰符voidsayHello(){// 默认修饰符System.out.println(Hello);}}// 文件com/example/TestSamePackage.javapackagecom.example;publicclassTestSamePackage{publicstaticvoidmain(String[]args){PersonpnewPerson();// ✅ 同包可访问p.nameAlice;// ✅ 同包可访问p.sayHello();// ✅ 同包可访问}}// 文件com/other/TestDifferentPackage.javapackagecom.other;importcom.example.Person;publicclassTestDifferentPackage{publicstaticvoidmain(String[]args){PersonpnewPerson();// ❌ 编译错误类不可见}}使用场景包内部协作的工具类或辅助类。3.3 protected继承的桥梁同包可访问 不同包的子类可访问注意不同包的非子类不能访问。// 文件com/example/Animal.javapackagecom.example;publicclassAnimal{protectedStringname;protectedvoideat(){System.out.println(吃东西);}}// 文件com/example/TestSamePackage.javapackagecom.example;publicclassTestSamePackage{publicstaticvoidmain(String[]args){AnimalanewAnimal();a.nameTom;// ✅ 同包可访问a.eat();// ✅ 同包可访问}}// 文件com/other/Dog.java不同包但继承 Animalpackagecom.other;importcom.example.Animal;publicclassDogextendsAnimal{publicvoidtest(){name旺财;// ✅ 子类可访问 protected 成员eat();// ✅ 子类可访问 protected 方法}}// 文件com/other/TestNotSubclass.javapackagecom.other;importcom.example.Animal;publicclassTestNotSubclass{publicstaticvoidmain(String[]args){AnimalanewAnimal();// a.name Jerry; ❌ 不同包且非子类不可访问// a.eat(); ❌ 编译错误}}关键点protected允许不同包的子类访问继承来的protected 成员但不能通过父类实例直接访问。// 不同包子类中的特殊规则packagecom.other;importcom.example.Animal;publicclassCatextendsAnimal{publicvoidtest(){nameKitty;// ✅ 自己的继承成员eat();// ✅ 自己的继承成员AnimalanewAnimal();// a.name Test; ❌ 不能通过父类对象访问}}使用场景父类允许子类重写或使用的核心方法/属性。3.4 public完全公开任何地方都可以访问。publicclassUtils{publicstaticfinaldoublePI3.14159;publicvoidprintMessage(){System.out.println(公开方法);}}// 任何包、任何类中都可以访问使用场景对外暴露的 API、常量、工具方法。4. 横向对比同一个类中能否访问publicclassDemo{privateinta1;intb2;// 默认protectedintc3;publicintd4;publicvoidtest(){System.out.println(a);// ✅ private 可访问System.out.println(b);// ✅ 默认可访问System.out.println(c);// ✅ protected 可访问System.out.println(d);// ✅ public 可访问}}5. 类级别的访问限制注意顶层类非内部类只能用public或默认修饰符不能用private或protected。publicclassPublicClass{}// ✅ 正确classDefaultClass{}// ✅ 正确// private class PrivateClass {} ❌ 编译错误// protected class ProtectedClass {} ❌ 编译错误内部类则可以使用所有四种修饰符。6. 继承与方法重写时的规则子类重写父类方法时访问权限不能比父类更严格。classFather{protectedvoidmethod1(){}publicvoidmethod2(){}}classSonextendsFather{Overridepublicvoidmethod1(){}// ✅ protected → public 放宽权限Override// protected void method2() {} ❌ public → protected 收窄权限编译错误}原则只能放大不能缩小父类public→ 子类public父类protected→ 子类public或protected7. 总结对比表包含继承关系修饰符同类同包子类同包子类不同包全局private✅❌❌❌❌默认✅✅✅❌❌protected✅✅✅✅❌public✅✅✅✅✅注意默认权限下同包的子类可以访问但不同包的子类不能访问。8. 记忆口诀私有一个类默认一个包保护包加子公开全世界继承重写要注意权限只能放不能缩9. 思考题检验是否真的懂了packagepackageA;publicclassA{privatevoidm1(){}voidm2(){}protectedvoidm3(){}publicvoidm4(){}}packagepackageA;publicclassBextendsA{// 问B 中可以访问 A 的哪些方法}packagepackageB;importpackageA.A;publicclassCextendsA{// 问C 中可以访问 A 的哪些方法}packagepackageB;publicclassD{AanewA();// 问D 中可以访问 A 的哪些方法}答案B同包继承m2、m3、m4C不同包继承m3、m4注意不能通过super或this访问 m2D不同包非继承只有 m4希望这篇文章能让你彻底掌握 Java 访问控制符。如果觉得有用欢迎点赞、收藏、转发 关注我更多 Java 干货持续更新中。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆
public、private、protected、默认的区别?一文搞定Java访问控制符
发布时间:2026/6/7 21:22:42
public、private、protected、默认的区别一文搞定Java访问控制符1. 先看结论速记版2. 流程图访问权限判断规则3. 四种访问权限详解3.1 private类的私密空间3.2 默认package-private包级私有3.3 protected继承的桥梁3.4 public完全公开4. 横向对比同一个类中能否访问5. 类级别的访问限制6. 继承与方法重写时的规则7. 总结对比表包含继承关系8. 记忆口诀9. 思考题检验是否真的懂了The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇在 Java 中访问控制符Access Modifiers是面向对象封装特性的核心体现。很多初学者甚至工作一段时间的开发者对这四个级别的权限区分仍然模糊。本文将通过表格、流程图、代码示例帮你彻底理清public、private、protected和默认包级私有的区别。1. 先看结论速记版访问修饰符同类同包子类不同包任何位置private✅❌❌❌默认无修饰符✅✅❌❌protected✅✅✅❌public✅✅✅✅一句话总结private 默认 protectedpublic权限依次放宽private 最严public 最宽。2. 流程图访问权限判断规则是否是private默认/protected/public否是protected/public默认/private否public其他尝试访问成员是否在同一个类中✅ 均可访问是否在同一个包中修饰符是什么❌ 不可访问✅ 可访问是否是子类修饰符是什么✅ 可访问❌ 不可访问修饰符是什么✅ 可访问❌ 不可访问3. 四种访问权限详解3.1 private类的私密空间只能在当前类内部访问这是封装性最强的级别。publicclassPerson{privateintage;// 私有成员privatevoidsecret(){// 私有方法System.out.println(这是秘密);}publicvoidshow(){System.out.println(age);// ✅ 同类中可访问secret();// ✅ 同类中可访问}}publicclassTest{publicstaticvoidmain(String[]args){PersonpnewPerson();// p.age 10; ❌ 编译错误// p.secret(); ❌ 编译错误}}使用场景隐藏内部实现细节如成员变量、工具方法。3.2 默认package-private包级私有不加任何修饰符只能在同一个包内访问。// 文件com/example/Person.javapackagecom.example;classPerson{// 默认修饰符Stringname;// 默认修饰符voidsayHello(){// 默认修饰符System.out.println(Hello);}}// 文件com/example/TestSamePackage.javapackagecom.example;publicclassTestSamePackage{publicstaticvoidmain(String[]args){PersonpnewPerson();// ✅ 同包可访问p.nameAlice;// ✅ 同包可访问p.sayHello();// ✅ 同包可访问}}// 文件com/other/TestDifferentPackage.javapackagecom.other;importcom.example.Person;publicclassTestDifferentPackage{publicstaticvoidmain(String[]args){PersonpnewPerson();// ❌ 编译错误类不可见}}使用场景包内部协作的工具类或辅助类。3.3 protected继承的桥梁同包可访问 不同包的子类可访问注意不同包的非子类不能访问。// 文件com/example/Animal.javapackagecom.example;publicclassAnimal{protectedStringname;protectedvoideat(){System.out.println(吃东西);}}// 文件com/example/TestSamePackage.javapackagecom.example;publicclassTestSamePackage{publicstaticvoidmain(String[]args){AnimalanewAnimal();a.nameTom;// ✅ 同包可访问a.eat();// ✅ 同包可访问}}// 文件com/other/Dog.java不同包但继承 Animalpackagecom.other;importcom.example.Animal;publicclassDogextendsAnimal{publicvoidtest(){name旺财;// ✅ 子类可访问 protected 成员eat();// ✅ 子类可访问 protected 方法}}// 文件com/other/TestNotSubclass.javapackagecom.other;importcom.example.Animal;publicclassTestNotSubclass{publicstaticvoidmain(String[]args){AnimalanewAnimal();// a.name Jerry; ❌ 不同包且非子类不可访问// a.eat(); ❌ 编译错误}}关键点protected允许不同包的子类访问继承来的protected 成员但不能通过父类实例直接访问。// 不同包子类中的特殊规则packagecom.other;importcom.example.Animal;publicclassCatextendsAnimal{publicvoidtest(){nameKitty;// ✅ 自己的继承成员eat();// ✅ 自己的继承成员AnimalanewAnimal();// a.name Test; ❌ 不能通过父类对象访问}}使用场景父类允许子类重写或使用的核心方法/属性。3.4 public完全公开任何地方都可以访问。publicclassUtils{publicstaticfinaldoublePI3.14159;publicvoidprintMessage(){System.out.println(公开方法);}}// 任何包、任何类中都可以访问使用场景对外暴露的 API、常量、工具方法。4. 横向对比同一个类中能否访问publicclassDemo{privateinta1;intb2;// 默认protectedintc3;publicintd4;publicvoidtest(){System.out.println(a);// ✅ private 可访问System.out.println(b);// ✅ 默认可访问System.out.println(c);// ✅ protected 可访问System.out.println(d);// ✅ public 可访问}}5. 类级别的访问限制注意顶层类非内部类只能用public或默认修饰符不能用private或protected。publicclassPublicClass{}// ✅ 正确classDefaultClass{}// ✅ 正确// private class PrivateClass {} ❌ 编译错误// protected class ProtectedClass {} ❌ 编译错误内部类则可以使用所有四种修饰符。6. 继承与方法重写时的规则子类重写父类方法时访问权限不能比父类更严格。classFather{protectedvoidmethod1(){}publicvoidmethod2(){}}classSonextendsFather{Overridepublicvoidmethod1(){}// ✅ protected → public 放宽权限Override// protected void method2() {} ❌ public → protected 收窄权限编译错误}原则只能放大不能缩小父类public→ 子类public父类protected→ 子类public或protected7. 总结对比表包含继承关系修饰符同类同包子类同包子类不同包全局private✅❌❌❌❌默认✅✅✅❌❌protected✅✅✅✅❌public✅✅✅✅✅注意默认权限下同包的子类可以访问但不同包的子类不能访问。8. 记忆口诀私有一个类默认一个包保护包加子公开全世界继承重写要注意权限只能放不能缩9. 思考题检验是否真的懂了packagepackageA;publicclassA{privatevoidm1(){}voidm2(){}protectedvoidm3(){}publicvoidm4(){}}packagepackageA;publicclassBextendsA{// 问B 中可以访问 A 的哪些方法}packagepackageB;importpackageA.A;publicclassCextendsA{// 问C 中可以访问 A 的哪些方法}packagepackageB;publicclassD{AanewA();// 问D 中可以访问 A 的哪些方法}答案B同包继承m2、m3、m4C不同包继承m3、m4注意不能通过super或this访问 m2D不同包非继承只有 m4希望这篇文章能让你彻底掌握 Java 访问控制符。如果觉得有用欢迎点赞、收藏、转发 关注我更多 Java 干货持续更新中。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆