访问控制符的好处

信息隐藏是 OOP 最重要功能之一,而访问控制修饰符可以实现信息隐藏。

通过使用访问控制修饰符来限定对对象私有属性的访问 ,可以获得 3 个重要的好处。

  • 防止对封装数据的未授权访问。
  • 有助于保证数据的完整性。
  • 当类的私有实现细节必须改变时,可以限制发生在整个应用程序中的“连锁反应”。

规则

访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。它们分别是 public、private、protected 和 default(默认),其中 default 是一种没有定义专门的访问控制符的默认情况。

可访问性表

访问范围 private default(默认) protected public
同一个类 可访问 可访问 可访问 可访问
同一个包中的其他类 不可访问 可访问 可访问 可访问
不同包中的类 不可访问 不可访问 可访问 可访问
不同包中的非子类 不可访问 不可访问 不可访问 可访问

解释

  1. private

用 private 修饰的类成员,只能被该类自身的方法访问和修改 ,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。

  1. default(默认)

如果一个类没有访问修饰符,说明它具有默认的访问控制特性。该类只能被同一个包中的类访问和
引用 ,而不能被其他包中的使用,即使其他包中有该类的子类。这种访问特性又称为包访问性
(package private)。

  1. protected

用 protected 修饰的类成员可以被三种类所访问:该类自身、与它在用一个包中的其他类以及在其
他包中的该类的子类。使用 protected 修饰符的主要作用是允许其他包中它的子类来访问父类的特
定属性和方法。

  1. public

当一个类被声明为 public 时,它就具有了被其他的类访问的可能性,只要包中的其他类在程序中
使用 import 语句引入 public 类,就可以访问和引这个类。

例子

在 Test1 包中新建三个类:Person、PersonTest、Student 。

  1. package Demo.Test1;
  2. public class Person {
  3. String name;
  4. private String idNumber;
  5. protected int age;
  6. public String sex;
  7. public Person(String name, String idNumber, int age, String sex ) {
  8. this.name = name;
  9. this.idNumber = idNumber;
  10. this.age = age;
  11. this.sex = sex;
  12. }
  13. public String info() {
  14. return "姓名:" + name + ",身份证号码:" + idNumber + ",年龄:" + age + ",性别:" + sex;
  15. }
  16. public void reSetId(String id) {
  17. this.idNumber = id;
  18. }
  19. public String getIdNumber() {
  20. return idNumber;
  21. }
  22. }
  1. package Demo.Test1;
  2. public class PersonTest {
  3. public static void main(String[] args) {
  4. Person per = new Person("陈贤相", "123456789", 23, "man");
  5. // 包访问性,可以访问。
  6. per.name = "bitSeaChan";
  7. // 受保护,可以访问。
  8. per.age = 24;
  9. // 私有,不能访问
  10. // per.idNumber = "1234556789";
  11. // 必须使用 reSetId 方法修改
  12. per.reSetId("123");
  13. per.sex = "gail";
  14. System.out.println(per.info());
  15. Student stu = new Student("bitSea", "123456", 24, "gail", "1234");
  16. System.out.println(stu.info());
  17. }
  18. }

在 Test2 包中新建 Employee 类。

  1. package Demo.Test2;
  2. import Demo.Test1.Person;
  3. public class Employee extends Person {
  4. public Employee(String name, String idNumber, int age, String sex) {
  5. super(name, idNumber, age, sex);
  6. }
  7. public void printName() {
  8. // name 是 default(默认) 修饰,在不同包中子类不能访问。
  9. // System.out.println(this.name);
  10. }
  11. public void printAge() {
  12. // age 是 protected 修饰,在不同包中子类可以访问。
  13. System.out.println(this.age);
  14. }
  15. public static void main(String[] args) {
  16. }
  17. }

参考链接: