11. 类的封装
在Java中,**封装(Encapsulation)**是面向对象编程中的重要概念,它指的是将类的数据(属性)和行为(方法)绑定在一起,并对外部隐藏数据的具体实现细节,只通过公共方法来访问和操作数据。这有助于提高代码的安全性、可维护性和灵活性。
11.1 为什要封装
java编程思想中,封装被认为是一种保护屏障,防止本类代码和数据被外部程序随机访问,从而造成数据不安全。
public class Student {
public String name;
public int age;
public void read() {
System.out.println("我是" + name + ",今年" + age);
}
}
public class StudentTest {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "tom";
stu.age = -18;
stu.read(); // 我是tom,今年-18
}
}
在上面的程序中,输出信息是: ”我是tom,今年-18“。 虽然程序编译执行没有任何问题,但是在现实生活中,age值是负数,显然不符合逻辑。为了避免这种错误,设计类时,应该对成员属性进行限定,不允许外界随意访问,这就需要实现类的封装。
11.2 如何实现封装
java中类的封装步骤主要有以下几步:
1. 私有化类属性,不允许外部进行访问和操作。
2. 提供公共的setter 和 getter 方法,便于对属性进行赋值和获取。
3. 在方法内部对属性的赋值过程进行判断是否合法。
public class Student {
// 1. 私有化属性
private String name;
private int age;
// 2. 提供公共的setter 和 getter方法,用于操作属性
public void setAge(int age) {
// 3. 判断赋值给属性的参数是否合法
if (age <= 0) {
System.out.println("学生的年龄是大于0的整数!");
this.age = 18; // 可以设置一个默认值
} else {
this.age = age;
}
}
public int getAge() {
return this.age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void read() {
System.out.println("我是" + this.name + ",今年" + this.age);
}
}
public class StudentTest {
public static void main(String[] args) {
Student student = new Student();
// 1. 通过setter方法设置对象的属性值
student.setAge(-18); // 学生的年龄是大于0的整数!
student.setName("tom");
student.read(); // 我是tom,今年18
// 2. 使用getter方法获取对象的属性值
String name = student.getName();
System.out.println("name=" + name);
}
}
11.3 封装的好处
Java中的封装提供了一些好处,有助于更好的代码组织、安全性和可维护性。以下是封装的主要优点:
11.3.1 数据隐藏
- 封装对外部世界隐藏了对象的内部状态,允许通过方法进行受控访问。
- 通过将数据设为私有并提供公共方法(getter和setter),可以保持数据的完整性。
11.3.2 提高安全性
- 通过封装,关键数据只能通过定义的方法隐藏和访问。
- 防止未经授权的访问或操作数据,增强安全性。
11.3.3 增强可重用性
- 封装通过分离关注点和促进结构的清晰,使代码更干净、更易读。
- 封装的类在应用程序的不同部分更容易理解和重用。
11.4 访问控制
针对类、成员方法和属性,java提供了4中访问控制权限,分别是private、default、protected、public。下面的图是这4种访问权限按级别由小到大依次列出:
通过一张表可以比较各种访问权限的区别:
访问范围 | private | default | protected | public |
---|---|---|---|---|
同类中 | √ | √ | √ | √ |
同包中 | √ | √ | √ | |
不同包子类 | √ | √ | ||
全局范围 | √ |
package cn.bdqn;
public class Person {
private String name;// private 权限
public int age;//public 权限
protected String gender;// protected 权限
String color; // default 权限
public Person(String name, int age, String gender, String color) {
this.name = name;
this.age = age;
this.gender = gender;
this.color = color;
}
private void displayDetails() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Gender: " + gender);
}
public void introduce() {
System.out.println("Hello, my name is " + name + ".");
}
protected void displayGender() {
System.out.println("Gender: " + gender);
}<