当前位置:   article > 正文

JAVA访问修饰符

java访问修饰符

概述

首先我们在学习一个知识点时我们一定要清楚需求是什么,也就是这个知识点是为了解决什么问题而出现的。

在Java中访问修饰符就是为了限制不同场景下其他类访问本类的属性和方法的权限。不同场景一般指本类、同一个包下的类,不同包下的类。

OOP 中对象之间要相互配合,相互调用来解决问题,但是有时候我们希望其他类在调用本类时各个属性和方法时权限是受控制的。比如我们在设计类的时候不希望某个属性值被直接访问和修改,这个属性只能在本类中被使用,我们可以在方法中对属性进行封装后,将方法设为公有的,然后提供给外部调用(字段私有化,提供 getter 访问字段,setter 设置字段)我们可以在方法中添加一些业务逻辑的处理。这样的设计更加灵活和安全,可以提升代码的可读性、可维护性。

这样的设计很好的体现了面相对象三大特性之一 => 封装,通过访问修饰符隐藏成员,让使用者使用时无法察觉到有这个属性或者方法的存在,只需要使用我们提供的公共方法,即使以后的类中的数据结构或者代码逻辑发生了改变,对使用者来说功能还是和以前一样没有变化。

然后我们来了解一些类之间是如何相互访问调用的,我目前知道的方式主要有以下几种

1.创建对象,new 一个对象然后访问对象的方法或者属性。

2.静态访问,通过类名直接访问静态的属性和方法。

3.继承,上面都是调用其他类的方法或者属性,而继承是在定义类的时候访问父类的属性和方法。

上面调用发生的场景只有两种:同包,不同包

四种访问修饰符

public

通过 public 修饰的类、属性或者方法可以被任何类调用,包括本类,同一个包下的类,其他包的类,尽量把访问修饰符写在最前面,提高代码的可读性。

protected

通过 protected 修饰的属性和方法,可以在本类、在同一个包中的类或者其他包中继承这个类的子类使用。意思就是说如果其他包的类要想使用这个属性只能继承它使用或者通过使用它的子类间接访问。

默认

默认指的就是什么都不写,不写访问修饰符的话表示这个类、属性或者方法只能在本类或者这个包下的其他类访问,注意如果这个包下面还有一个子包,那么子包中的类也是不能访问的。

从编译器的角度来看,嵌套的包之间没有任何关系。例如,java.util 包与 java.util.jar 包毫无关系。每一个包都是独立的类集合。                                                                                                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​ ​​                         -引用java核心基础卷1

private

使用 private 修饰的方法和属性只能在本类中调用。这个没什么需要特别注意的点,就相当于你的隐私一样除了自己谁都看不了,具体的应用场景可以参考单例设计模式,通过 private 修饰构造方法来实现构造器私有化,这样其他类就无法创建本类的对象,只有通过提供的公共方法来获取对象。

note:一个类的方法可以访问这个类的所有对象的私有数据。

代码验证

我们通过案例展现效果:

498fd23dcb0943c28b8bea58c37d7e38.png

我们可以看到在同一个包下面的类可以查看public、默认、protected修饰的属性(成员方法类似)。如果我们访问 private 修饰的属性话idea会报错:0f4050b207a44726ab874c5c1f0ee245.png 

 报错信息是:“privacyInf” 在 “access.a.A” 中具有私有访问权限。就是说 privaInf 这个属性在 A 类中是私有的,不能访问。

我们再来看看在其他包下情况怎么样

c337466f27024c0f9056260b896d9437.png

 可以看到在别的包我们只能访问 public 修饰的属性了,如果再访问的话就会提示权限不够,比如我们访问 protected 修饰的属性

6910374dd2f6417aa415f879b81201e7.png

接下来我们再来验证 protected 修饰的属性,因为 protected 修饰符要在继承中来体现,所以我们就要用到 extend 和 super 关键字来验证,如果没学到继承的小伙伴可以先去了解一下这方面知识。注意,当我们使用 protected 修饰父类的属性或者方法时在子类访问就不能通过创建对象的方式来访问了,否则还是不能访问的。具体看以下例子:

9c3108ae993f493bb6c49424752eb095.png

6e9206de19b34bcbac3b0e3370f8a9be.png

可以看到我们在同一个包下的子类使用 super 的形式访问父类成员和直接创建对象访问效果是一样的。

接下来我们看不同包

de17ec50b2214bf18947a1f82f5df9ce.png

我们可以看到 B 类继承了 A 类,但是通过在 B 类下创建 A 类的对象还是无法访问 protected 属性的方法。让我们再看看使用 super。

a4711d646abf4426b4fdba3ecc5386c0.png

 在使用 super(其实不写 super 直接写属性名也可以访问,这样是为了看到效果)就可以清楚的看到能够访问父类使用 protected 修饰的属性了。

通过上面的案例我们可以感受到不同权限修饰符带来的不同效果。只要记住同一个包下的类如果要相互访问成员的话通过创建对象的方式就能访问到除了 private 修饰的成员。不同包下的话通过创建对象的方式只能访问 public 修饰的成员。protected 和默认修饰符最大的区别就是在不同包下的子类是否可以通过 supper 方式访问到父类的属性。

总结

按照访问权限从大到小排序的话 public > protected > 默认 > private,需要注意修饰类的访问权限修饰符只能是 public 和默认,如果是成员内部类的话另当别论。

因为如果一个类使用 private 修饰的话那么其他类都不能调用,那么这个类的存在是没有意义的。我们之前说了使用 protected 修饰符表示子类可以访问,而类要么在本包中被调用要么在其他包被调用,如果使用 protected 修饰类的话,其他包要先继承它才能访问它,但是我要继承的它的时候已经是访问它了所以就矛盾了,这样的设计是混乱且不合理的。

在实际使用中除了 protected 外都比较常见,主要掌握 public 和 private 的使用就行了。

以上仅个人理解,如有误望指正!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/194237
推荐阅读
相关标签
  

闽ICP备14008679号