访问控制符的好处
信息隐藏是 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) {
}
}
参考链接: