🔥封装
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装最主要的功能在于能修改自己的实现代码,而不用修改那些调用代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
🔥优点:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
🔥1.访问控制符
Java的访问控制符:private、protected、public,还有一个不加任何访问控制符的访问控制级别。
四个控制级别由小到大:private、default、protected、public
- private:当前类访问权限
- default:包访问权限,可以被相同包下的其他类访问
- protected:子类访问权限,既可以被同一个包中的其他类访问,也可以被不同包中的子类访问
- public:公共访问权限
对于局部变量而言,其作用于就是它所在的方法,不能被其他类访问,所以不能使用访问控制符修饰。
🔥2.封装:将对象的状态信息对外部隐藏起来,不允许外部直接访问,而是由该类提供方法来实现对信息的访问。
良好的封装应该是,对象的Field和实现细节隐藏起来,外界无法直接访问,提供方法来对Field进行访问和操作。
如果一个Java类的每个Field都被使用private修饰,并为每个Field都提供了public修饰的setter和getter方法,那么这个类就是一个符合JavaBean规范的类。JavaBean是一个封装良好的类。
🔥3.实现Java封装的步骤
1.修改属性的可见性来限制对属性的访问(一般限制为private)
- 将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了
public class Person {
private String name;
private int age;
}
2.对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
- this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
🔥4.案例分析:
- 将属性私有化,使用private关键字修饰。
- 为使用private关键字修饰的属性添加getter和setter方法。通过get和set方法来操作属性。
- 在setter方法中,添加数据的逻辑校验。
public class Student {
//属性私有
private String name;
private int id;
private char sex;
private int age;
//提供一些 “public 的get set方法”
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age>120||age<0){//不合法
this.age = 3;
}else {
this.age = age;
}
}
}
注意:get和set方法的快捷键:Alt+Insert
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("小飞侠");
System.out.println(s1.getName());
s1.setAge(1000);
System.out.println(s1.getAge());
}
}