一 前言
这篇文章是很基础的一文, 没多大深度, 对于开发人员必然是熟练于心. 本篇文章的主题是为什么 java 要设置类成员访问级别? 其原因也很简单, 就是为了面向对象的封装特性; 将类成员使用不同的访问级别控制, 在数据封装后, 其他的类成员想要访问当前类成员, 就必须要有足够的权限才能访问; 这样做的目的就是我可以随意修改不想让其他类成员没有权限访问的数据, 只要约定好相关的协议, 不影响其他类成员访问即可;
二 权限修饰词介绍
public 意指公有的意思, 其修饰的成员权限最低, 表示任何成员都可以访问; 注意点是一个 java 源文件中只能有一个类被声明为 public;
defaut 默认级别, 成员没有修饰符号, 在同一个包内能被其他成员访问;
protected 受保护的意思; 表示子类能够继承父类的方法; 在同一个包内被其修饰的成员, 其子类能够访问; 注意点是不可以修饰外部类;
private 私有的意思; 权限最高, 表示只允许类内部成员可以访问; 注意点是不可以修饰外部类;
修饰符 | 同一个类中 | 同一个包中的其他类 | 不同包的子类中 | 不同包的非子类中 |
---|---|---|---|---|
public | true | true | true | true |
protected | true | true | true | |
default | true | true | ||
private | true |
三 具体实施
3.1 public
在 com.youku1327.base.authority2 包中创建了一个星球类, 有个成员是 shine 表示光线, 对应的 getShine 方法使用 public 修改, 方法意思是获得光线;
- package com.youku1327.base.authority2;
- /**
- * @Author lsc
- * <p> 星球类 </p>
- */
- public class Planet {
- private String shine = "好耀眼";
- public String getShine(){
- return shine;
- }
- }
在 com.youku1327.base.authority1 包中创建类 ZSZXZ, 使用 import com.youku1327.base.authority2.Planet; 导入 Planet 星球类; 在 main 方法中创建星球类, 调用获得光线的方法, 得到输出结果是 好耀眼; 验证了 public 权限最低, 不同包之间得非子类就可以访问;
- package com.youku1327.base.authority1;
- import com.youku1327.base.authority2.Planet;
- /**
- * @Author lsc
- * <p> </p>
- */
- public class ZSZXZ {
- public static void main(String[] args) {
- // 创建星球实体
- Planet planet = new Planet();
- // 访问公有成员
- String shine = planet.getShine();
- // 好耀眼
- System.out.println(shine);
- }
- }
- 3.2 protected
将 星球类的 getShine 方法修饰符号改为 protected;
- package com.youku1327.base.authority2;
- /**
- * @Author lsc
- * <p> 星球类 </p>
- */
- public class Planet {
- private String shine = "好耀眼";
- protected String getShine(){
- return shine;
- }
- }
在 com.youku1327.base.authority1 中创建 Earth 类继承星球类 Planet(初学者只要理解 extends 关键字表示继承的意思), 继承的方法是 getShine 方法, 然后在主类中创建地球实例, 调用 getShine 方法, 实际上是调用 Planet 的 getShine 方法 (super.getShine(),super 意指高级, 表示父类 ); 验证了不同包的子类可以调用父类被 protected 修饰的成员;
- package com.youku1327.base.authority1;
- import com.youku1327.base.authority2.Planet;
- /**
- * @Author lsc
- * <p> 地球类 </p>
- */
- public class Earth extends Planet {
- @Override
- protected String getShine() {
- // 调用了父类的 getShine 方法
- return super.getShine();
- }
- // 执行前注释掉 ZSZXZ 中的 main 方法
- public static void main(String[] args) {
- // 创建地球
- Earth earth = new Earth();
- // 好耀眼
- System.out.println(earth.getShine());
- }
- }
在回去看看原来的 ZSZXZ 类的 getShine 发现报错了; 验证了不同包的非子类, 使用 protected 修饰无法访问;
3.3 default
将 Planet 星球类 的 getShine 方法的修饰符去掉, 代码如下
- package com.youku1327.base.authority2;
- /**
- * @Author lsc
- * <p> 星球类 </p>
- */
- public class Planet {
- private String shine = "好耀眼";
- String getShine(){
- return shine;
- }
- }
随着发现 之前的地球类报错了, 我们把整个地球类注释掉; 验证了 default 修饰的成员不能夸包访问;
我们在 Planet 的同级包下创建 Moon 类, 调用 Planet 的 getShine 方法, 成功执行; 验证了 default 修饰的成员能在同一个包中被访问;
- package com.youku1327.base.authority2;
- /**
- * @Author lsc
- * <p> </p>
- */
- public class Moon {
- public static void main(String[] args) {
- // 创建星球实体
- Planet planet = new Planet();
- // 访问公有成员
- String shine = planet.getShine();
- // 好耀眼
- System.out.println(shine);
- }
- }
- 3.4 private
将 Planet 星球类 的 getShine 方法的修饰符改为 private;
- package com.youku1327.base.authority2;
- /**
- * @Author lsc
- * <p> 星球类 </p>
- */
- public class Planet {
- private String shine = "好耀眼";
- private String getShine(){
- return shine;
- }
- }
发现 之前的 的 Moon 类主方法中的 getShine 方法报错了, 验证了 private 在同包不同类中不可以被访问; getShine() 中可以使用 shine 字段, 验证了同一个类中可以使用 private 修饰的成员;
- private String shine = "好耀眼";
- private String getShine(){
- return shine;
- }
- }
发现 之前的 的 Moon 类主方法中的 getShine 方法报错了, 验证了 private 在同包不同类中不可以被访问; getShine() 中可以使用 shine 字段, 验证了同一个类中可以使用 private 修饰的成员;
来源: https://www.cnblogs.com/zszxz/p/12076695.html