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);}<