java中public,private,protected,(default)关键字

本文详细介绍了在软件开发中如何合理使用public、protected、default和private等访问控制修饰符,帮助开发者更好地理解这些修饰符的作用及应用场景,并遵循阿里巴巴规范手册中的建议。

开发内部项目或者单独模块(非公共模块)时,对访问权限的修饰符的使用可能不是很注意,但在公共代码的书写或者是sdk一类的开发,访问修饰符就显得比较重要了。下面对public,protected,default,private的理解,提供方法:
1. 如果涉及到包之间的业务逻辑的调用,考虑public修饰类,属性。
2. 如果涉及到同包下类之间的调用或者需要提供继承复写扩展的业务方法,考虑使用protected修饰。
3. 如果只想在同包下使用且不想继承复写,我们考虑默认default(不写修饰符)即可。
4. 如果只想类内部调用,那就可以使用private。

alibaba的规范手册

20.【推荐】类成员与方法访问控制从严:

  • 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。
  • 工具类不允许有 public 或 default 构造方法。
  • 类非 static 成员变量并且与子类共享,必须是 protected。
  • 类非 static 成员变量并且仅在本类使用,必须是 private。
  • 类 static 成员变量如果仅在本类使用,必须是 private。
  • 若是 static 成员变量,必须考虑是否为 final。
  • 类成员方法只供类内部调用,必须是 private。
  • 类成员方法只对继承类公开,那么限制为 protected。
    说明: 任何类、方法、参数、变量,严控访问范围。过宽泛的访问范围,不利于模块解耦。思考:如果是一个 private 的方法,想删除就删除,可是一个 public 的 Service 方法,或者一个 public 的成员变量,删除一下,不得手心冒点汗吗? 变量像自己的小孩,尽量在自己的视线内,变量作用域太大,如果无限制的到处跑,那么你会担心的。
### Java 访问控制修饰符的区别与使用场景 Java 中的访问控制修饰符用于定义类、方法、变量等成员的可见性和可访问范围。这些修饰符包括 `public`、`private`、`protected` 和默认(`default`),它们分别具有同的访问权限和适用场景。 #### 1. **`public` 修饰符** `public` 是最具开放性的访问修饰符,允许任何其他类对象访问被修饰的成员。无论是同一个包内还是同包中的类,都可以自由地访问 `public` 成员[^1]。 - **特点**: - 具有最大的访问权限。 - 可以被任何位置的代码访问。 - **使用场景**: - 提供对外接口时使用。 - 当希望某个类方法可以被广泛调用时。 ```java public class PublicClass { public void publicMethod() { System.out.println("This is a public method."); } } ``` #### 2. **`private` 修饰符** `private` 是最严格的访问修饰符,限制了成员只能在定义它的类内部访问。外部类其他类无法直接访问 `private` 成员[^3]。 - **特点**: - 仅限于类的内部访问。 - 外部类即使通过实例也无法访问。 - **使用场景**: - 封装类的内部实现细节。 - 防止外部代码对类的内部状态进行直接修。 ```java class PrivateClass { private int privateField; public void setPrivateField(int value) { this.privateField = value; } public int getPrivateField() { return privateField; } } ``` #### 3. **`protected` 修饰符** `protected` 修饰符允许同一包内的类以及子类访问被修饰的成员。这意味着即使在同包中,只要存在继承关系,子类仍然可以访问父类的 `protected` 成员[^2]。 - **特点**: - 同包内所有类均可访问。 - 子类(无论是否在同一包中)也可以访问。 - **使用场景**: - 提供子类对父类成员的访问权限。 - 在继承体系中共享部分实现细节。 ```java class ProtectedClass { protected void protectedMethod() { System.out.println("This is a protected method."); } } class SubClass extends ProtectedClass { public void callProtectedMethod() { protectedMethod(); // 子类可以访问父类的 protected 方法 } } ``` #### 4. **默认(`default`)修饰符** 默认访问控制(也称为包级访问控制)是当类、方法变量没有显式指定访问修饰符时使用的访问级别。它允许同一包内的类访问,但允许跨包访问[^3]。 - **特点**: - 同一包内的类可以访问。 - 同包中的类无法访问。 - **使用场景**: - 在同一包内共享某些功能时使用。 - 避免必要的跨包依赖。 ```java class DefaultClass { void defaultMethod() { System.out.println("This is a default method."); } } ``` #### 总结表格 | 访问修饰符 | 同一类 | 同一包内其他类 | 子类(同包) | 同包非子类 | |--------------|--------|----------------|----------------|---------------| | `public` | √ | √ | √ | √ | | `protected` | √ | √ | √ | × | | `default` | √ | √ | × | × | | `private` | √ | × | × | × | #### 注意事项 - Java 的访问控制是在编译时进行检查的,运行时并会留下访问控制的痕迹。通过反射机制,可以绕过访问控制限制,访问私有成员方法[^4]。 - 内部类可以使用 `private` 修饰符,表示该内部类只能在其外部类中使用。 ### 示例代码 以下是一个综合示例,展示了同访问修饰符的使用: ```java package example; public class AccessModifiersExample { public String publicField = "Public Field"; private String privateField = "Private Field"; protected String protectedField = "Protected Field"; String defaultField = "Default Field"; public void publicMethod() { System.out.println("Public Method"); } private void privateMethod() { System.out.println("Private Method"); } protected void protectedMethod() { System.out.println("Protected Method"); } void defaultMethod() { System.out.println("Default Method"); } } ``` ```java package anotherPackage; import example.AccessModifiersExample; public class AnotherClass extends AccessModifiersExample { public static void main(String[] args) { AccessModifiersExample example = new AccessModifiersExample(); System.out.println(example.publicField); // 可以访问 // System.out.println(example.privateField); // 编译错误 System.out.println(example.protectedField); // 可以访问 // System.out.println(example.defaultField); // 编译错误 example.publicMethod(); // 可以访问 // example.privateMethod(); // 编译错误 example.protectedMethod(); // 可以访问 // example.defaultMethod(); // 编译错误 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值