当前位置: 首页 > news >正文

Java 的访问控制修饰符

        Java 的访问控制修饰符决定了类、方法和字段(成员变量)的可见性,即它们可以被哪些类访问。这些修饰符包括 public、protected、default(也称为包访问级别)和 private。下面是对每个修饰符的详细解释,以及它们在类、方法和字段中的作用、共性规律、注意事项和使用技巧。

1. 访问控制修饰符 


1.1 public 

 类: 被 public 修饰的类可以在任何地方被访问,无论是在同一个包中还是在不同包中的其他类都可以直接使用该类。

方法: 被 public 修饰的方法可以在任何地方被调用,包括类本身、同一个包中的其他类以及不同包中的其他类。

字段: 被 public 修饰的字段可以在任何地方被访问和修改。这意味着其他类可以直接操作该字段。

1.2 protected

 类: protected 不能用于修饰顶层类(即直接声明在包中的类),因此只能用于类的成员(方法或字段)。

方法: 被 protected 修饰的方法可以在同一个包中的其他类中访问,也可以在其他包中的子类中访问(即使子类和父类不在同一个包中)。这是 protected 修饰符的主要特性:提供包访问级别和跨包的继承访问。

字段: 类似于 protected 方法,protected 字段可以在同一个包中的其他类中访问,也可以在其他包中的子类中访问。

1.3 default(无修饰符)

类: 没有修饰符(即 default)的类只能在同一个包中被访问。该类不能被不同包中的类使用。

方法: default 修饰的方法只能在同一个包中的类中被访问,不同包中的类无法访问。

字段: default 修饰的字段只能在同一个包中的类中被访问。

1.4 private

类: private 不能用于修饰顶层类,因此只能用于类的成员(方法或字段)。

方法: 被 private 修饰的方法只能在定义它的类内部被访问,其他类(包括子类)不能访问它。

字段: 被 private 修饰的字段只能在定义它的类内部被访问,其他类(包括子类)不能访问或修改它。

2. 共性规律

        类的访问控制: 顶层类只能使用 public 或 default 修饰符。protected 和 private 不能用于顶层类。内部类(类中的类)可以使用所有四种修饰符。

        成员的访问控制: 所有四种修饰符均可用于类的成员(方法和字段)。访问权限从最宽松到最严格依次是:public > protected > default > private。

        包访问性: protected 和 default 修饰符都允许类的成员在同一个包中被访问。public 提供最宽松的访问权限,允许任何地方访问,而 private 提供最严格的访问权限,只允许类内部访问。

3. 特殊的注意事项和使用技巧

3.1 protected 在继承中的使用

        protected 修饰符在继承关系中尤为重要。它允许子类访问父类的 protected 成员,即使子类和父类位于不同的包中。这为实现类的扩展和代码复用提供了便利。

        使用 protected 修饰构造方法,可以使类只能被同包或子类实例化,这在设计模式(如单例模式)中非常有用。

3.2 private 方法与字段的封装

        private 修饰符强调封装性(Encapsulation),将类的实现细节隐藏起来。通过将方法和字段声明为 private,你可以确保它们不会被外部代码或子类意外修改,这有助于维护代码的完整性和安全性。

        通过提供 public 或 protected 的 getter 和 setter 方法,你可以对字段的访问进行控制,同时保持字段的私有性。

3.3 包访问级别的使用(default)

        default 访问修饰符(即无修饰符)在包内提供了友好的访问控制。它允许包内的类互相访问,而不暴露给包外部。这在实现模块化代码时特别有用,可以将实现细节封装在一个包内,同时暴露有限的接口给外部使用。

3.4 内部类的访问控制

        对于内部类(即类中定义的类),可以使用 private 修饰符将其完全封装在外部类中,只允许外部类本身访问该内部类

        使用 protected 修饰内部类,可以允许包内的类和继承该外部类的子类访问该内部类,这对于实现复杂的继承结构或辅助类非常有用。

3.5 反射与访问控制

        在Java中,使用反射(Reflection)可以绕过访问控制修饰符的限制,直接访问 private 方法或字段。这在某些场景下(如框架、测试等)可能非常有用,但应谨慎使用,以避免破坏封装性和代码的安全性。


http://www.mrgr.cn/news/2428.html

相关文章:

  • 【区块链+商贸零售】NOCO 企业数字化社区 | FISCO BCOS应用案例
  • 【PB案例学习笔记】-33 PB连接Oracle数据库查询数据
  • 如何运用独特的产业运营体系打造一流的数字媒体产业园
  • 客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型
  • 指针和引用的区别
  • MySQL常用方法速通
  • python下载b站视频
  • 大数据量实现滚动分页-vue3+element-plus实现方式
  • 后端Java秋招面试中的自我介绍需要说什么?
  • nginx核心配置示例
  • Go语言基础--switch
  • 第3章处理机调度与死锁
  • 树莓派开发笔记09-树莓派的UDP通信实验
  • 【人工智能】Transformers之Pipeline(十一):零样本图片分类(zero-shot-image-classification)
  • 内网拓扑可视化及管控技术
  • TypeScript学习笔记1---认识ts与js的异同、ts的所有数据类型详解
  • .Net插件开发开源框架
  • WPF学习(8) --Windows API函数的使用
  • 探索 HarmonyOS 的层叠布局:灵活的 Stack 容器
  • 原神4.8版本抽到角色和重点培养数据表