0
点赞
收藏
分享

微信扫一扫

JavaSE面向对象_访问权限修饰符

何晓杰Dev 2022-04-25 阅读 104
java

文章目录

在Java语言中,一切事物(类和类的所有成员)都具有(显式定义或隐式定义的)访问权限,而这种语言层面的访问权限控制,是由访问权限修饰符实现的。

 

分级

访问权限是分级别的,Java的访问权限级别,是依赖包来实现的。

Java的访问权限共分为以下四个级别,从严格到宽松顺序为:

  1. private(私有的):它是最严格的,只能在同类中访问,外面谁都不能用。
  2. 默认(包私有):同包中都可以使用,同一包中的子类或其他类能够访问。也称为“默认的、缺省的”访问权限。
  3. protected(受保护的):在不同包下的子类中可以访问。
  4. public(公共的):不同包下也能够任意访问,相当于没有做访问权限控制,同一个module下都能够任意访问(但是不同包下需要导包)。

 

在修饰不同的结构时,可用的访问权限修饰符不同

  1. 类的访问权限级别:只有public和默认的包私有。
  2. 类中成员(包括普通成员、静态成员、构造器)的访问权限级别:四种都可以。
  3. 局部变量:已经被大括号限制死了作用域,所以它不需要访问权限控制。

 

类的访问权限级别

只要public和默认的包私有。

  • public表示不同包下都能够任意访问(需要导包)
  • 默认访问权限表示仅在同包下访问(即使导包也不能跨包访问)

为什么class类仅有两种访问级别呢

因为单独定义的class是一个独立的概念,它没有对谁私有、受谁保护的概念,所以一般的class的访问权限修饰符只有两种。

但是类是可以嵌套定义的,一旦在一个类的内部定义类,称之为内部类,就有了私有、受保护的概念。(成员位置的)内部类具有四种访问权限。

 

类中成员和构造器的访问权限级别

四种访问级别都可以用。

注意事项

  1. 如果不具有类的访问权限,那么类中成员即便是public也访问不到。类的访问权限控制要大于类中成员,先能访问类,才能访问类中成员。
  2. 构造器和类中成员一样,也有四种访问权限。不过要注意的是,当构造器被私有化后,在外部一般情况下是不能new它的对象的。
  3. 假如一个类中有一个方法需要传入自身对象,那么这个传入的自身对象同样也可以访问它的私有成员。私有成员只要在自身类中都可以访问,不管这个对象是this自身对象还是外部传入的自身对象。

 

访问权限修饰符的作用和使用

作用

访问权限最基本的作用是控制访问权限的(但是可以被反射打破)。另外,也隐含警告和暗示的作用,告诉代码使用者,哪些地方应该使用,哪些地方不能触碰,起到警告、约束、指导代码使用者的功能。

具体表现为:

  1. 对于明确提供给外界使用的,推荐使用的,用public修饰。告诉别人:这里是你需要关注、了解、使用的地方。
  2. 对于明确不需要外界触碰,不需要外界了解的,应该用private修饰。告诉别人:这里不需要你关注。

 

实际的使用场景举例:

  1. 中间方法私有化

    比如一个类的对象需要对外提供功能服务,那么这样一个对外服务的方法就应该是public修饰的。而实现这个对外public方法的一些中间过程方法,不需要提供给外界使用,只在该类内部调用提供服务,那么就应该私有化它,称之为“中间方法私有化”。

  2. 工具类

    当类中的方法全部都是static修饰的静态方法时,只需要类名就可以调用其中的所有方法,不需要依赖于创建对象。此时干脆私有化构造器,禁止创建该类的对象,告诉使用者不要尝试创建对象来使用工具类。Java中的所有工具类都应该私有化无参构造。

  3. 工厂的设计模式和单例的设计模式

    指的是不通过自身构造器创建对象,而是通过“其他手段”去创建对象,这时类的构造器应该私有化,阻止在外界正常new对象。

    • 工厂设计模式往往需要借助反射在一个工厂类中生产对象。

    • 单例设计模式私有化构造器后,需要在自身类中提供一个方法来提供单例对象。

 

使用访问权限修饰符的好处

当我们合理的使用访问权限修饰符时,显而易见的好处是,把代码的开发者和代码的使用者区分开来了。

  1. 代码的使用者,无需关心没有访问权限的代码,只需要关心具有访问权限的部分就可以了。
  2. 代码的开发者,可以自由的开发对外界没有访问权限的代码,这些私有的,或者对外界不可见部分的代码,叫做隐藏代码的具体实现细节,可以很方便地进行修改。而如果是一个public修饰的方法,在外界多处被使用,那肯定不能随便修改。

 

使用类中结构的访问权限修饰符的原则

对于权限,能少给尽量少给,能吝啬,不要大方。

  1. 尽量私有化,方便隐藏实现细节,修改代码。
  2. 如果不能私有化,也应该尽量少地给予访问权限,先从默认包私有权限开始考虑。
  3. 只有确定这个结构,一定需要在外部(尤其是不同包下)被访问时,才考虑给public,尽量少给public。
举报

相关推荐

0 条评论