前言
李刚老师《JAVA疯狂讲义》第5版,第5章学习笔记。
1.什么是封装
JAVA的类中可以定义成员变量,在不做任何处理的情况下,成员变量可以让对象直接访问与修改。这可能产生一系列问题,比如NBAplayer类的"球员位置"这个成员变量被改成了守门员,从语法上分析并无错误,但是不符合实际意义。
借助封装就可以解决这一问题,封装可以将细节隐藏在类的内部,外界只通过类提供的方法来实现对成员变量的操作。比如上述提到的问题,就可以设置一个setPosition()方法,保证该变量的值必须是"控球后卫",“得分后卫”,“小前锋”,“大前锋”,"中锋"中的某一个。
具体来说,封装可以实现以下目的:
- 隐藏类的实现细节
- 对象通过方法修改成员变量,可以在方法中加入控制逻辑,防止不合理的修改
- 可以进行数据检查,保证对象信息的完整性
- 便于修改,提高代码的可维护性
实现一个良好的封装,则需要从以下两个方面考虑:
- 隐藏类内部的实现细节
- 提供良好的访问方法
2.JAVA中的访问修饰符
为了实现良好的封装,JAVA中提供了3个访问修饰符(private、protected、public)来控制访问级别,加上无访问修饰符,一共是四个访问级别,具体如下(访问修饰符都是控制类的成员或者类的访问级别,不会控制局部变量,因为局部变量只能在其作用域内被访问):
- private修饰符:当前类访问权限,当类中的某个成员(成员变量、方法、构造器)使用private修饰时,这个成员只能在类的内部被访问。
- 无访问修饰符:包访问权限,当类中的某个成员,或者一个外部类不使用任何访问修饰符修饰时,这个成员或外部类可以被同一个包下的其他类访问。
- protected修饰符:子类访问权限,当类中的某个成员使用protected修饰时,这个成员可以被同一个包中的其他类访问,也可以被不同包中的,这个类的子类访问。
- public修饰符:公共访问权限,当类中的某个成员,或者一个外部类使用public修饰时,这个成员或者外部类可以被所有类访问,无论是否在同一个包中,无论是否存在父子继承关系。
不同修饰符的访问控制级别可总结为下表:
访问控制级别 | private | 无 | protected | public |
---|---|---|---|---|
同一个类内 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
同一个包内 | 可以访问 | 可以访问 | 可以访问 | |
子类 | 可以访问 | 可以访问 | ||
全局范围(整个project) | 可以访问 |
注意:
对于一个外部类,只能使用public或者无访问修饰符,因为外部类不在任何类的内部,也就没有同一个类内,子类这个范围,所以private、protected修饰外部类没有意义。
对于访问修饰符的使用,应遵守以下几条原则:
- 类中绝大多数成员变量,都应使用private修饰,除非一些static修饰的,类似全局变量的成员变量,才考虑使用public修饰。
- 类中的工具方法,也就是只用于辅助类的其他方法实现的方法,应使用private修饰
- 若某个类主要用于做其他类的父类,其中的大部分方法希望子类重写,但不想被外界调用,则应使用protected修饰
- 类的构造器一般使用public修饰
- 外部类一般使用public修饰