访问控制符的好处
信息隐藏是 OOP 最重要功能之一,而访问控制修饰符可以实现信息隐藏。
通过使用访问控制修饰符来限定对对象私有属性的访问 ,可以获得 3 个重要的好处。
- 防止对封装数据的未授权访问。
 - 有助于保证数据的完整性。
 - 当类的私有实现细节必须改变时,可以限制发生在整个应用程序中的“连锁反应”。
 
规则
访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。它们分别是 public、private、protected 和 default(默认),其中 default 是一种没有定义专门的访问控制符的默认情况。
可访问性表
| 访问范围 | private | default(默认) | protected | public | 
|---|---|---|---|---|
| 同一个类 | 可访问 | 可访问 | 可访问 | 可访问 | 
| 同一个包中的其他类 | 不可访问 | 可访问 | 可访问 | 可访问 | 
| 不同包中的类 | 不可访问 | 不可访问 | 可访问 | 可访问 | 
| 不同包中的非子类 | 不可访问 | 不可访问 | 不可访问 | 可访问 | 
解释
- private
 
用 private 修饰的类成员,只能被该类自身的方法访问和修改 ,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。
- default(默认)
 
如果一个类没有访问修饰符,说明它具有默认的访问控制特性。该类只能被同一个包中的类访问和
引用 ,而不能被其他包中的使用,即使其他包中有该类的子类。这种访问特性又称为包访问性     
(package private)。
- protected
 
用 protected 修饰的类成员可以被三种类所访问:该类自身、与它在用一个包中的其他类以及在其
他包中的该类的子类。使用 protected 修饰符的主要作用是允许其他包中它的子类来访问父类的特
定属性和方法。
- public
 
当一个类被声明为 public 时,它就具有了被其他的类访问的可能性,只要包中的其他类在程序中
使用 import 语句引入 public 类,就可以访问和引这个类。
例子
在 Test1 包中新建三个类:Person、PersonTest、Student 。
package Demo.Test1;public class Person {String name;private String idNumber;protected int age;public String sex;public Person(String name, String idNumber, int age, String sex ) {this.name = name;this.idNumber = idNumber;this.age = age;this.sex = sex;}public String info() {return "姓名:" + name + ",身份证号码:" + idNumber + ",年龄:" + age + ",性别:" + sex;}public void reSetId(String id) {this.idNumber = id;}public String getIdNumber() {return idNumber;}}
package Demo.Test1;public class PersonTest {public static void main(String[] args) {Person per = new Person("陈贤相", "123456789", 23, "man");// 包访问性,可以访问。per.name = "bitSeaChan";// 受保护,可以访问。per.age = 24;// 私有,不能访问// per.idNumber = "1234556789";// 必须使用 reSetId 方法修改per.reSetId("123");per.sex = "gail";System.out.println(per.info());Student stu = new Student("bitSea", "123456", 24, "gail", "1234");System.out.println(stu.info());}}
在 Test2 包中新建 Employee 类。
package Demo.Test2;import Demo.Test1.Person;public class Employee extends Person {public Employee(String name, String idNumber, int age, String sex) {super(name, idNumber, age, sex);}public void printName() {// name 是 default(默认) 修饰,在不同包中子类不能访问。// System.out.println(this.name);}public void printAge() {// age 是 protected 修饰,在不同包中子类可以访问。System.out.println(this.age);}public static void main(String[] args) {}}
参考链接:
