定义:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
实现:
- 私有化属性,使用private关键字修饰类的属性。
- 对外提供公开操作属性的方法,提供public修饰的getters/setters方法
好处:
- 提高代码的安全性
- 提高代码的复用性
- “高内聚”:封装细节,便于修改内部代码,提高可维护性
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和写作。
例:
/**
* 需求:
* 1.Dog类,age属性不可能为负值。
* 2.nickname不能是吴青山
*
*/
public class Dog {
//1.private修饰的变量,只能在本类中使用
//在外部无法随意修改变量值
private String nickname;
private String type;
private char sex;
private byte age;
public Dog() {
}
public Dog(String nickname, String type, char sex, byte age) {
//2.在有参构造内部做参数的合法校验
this.nickname = nickname.equals("吴青山") ? "吴绿山" : nickname;
this.type = type;
this.sex = sex;
this.age = age < 0 ? 0 : age;
}
public void setAge(byte age) {
this.age = age < 0 ? 0 : age;
}
public byte getAge() {
return age;
}
public void setNickname(String nickname) {
this.nickname = nickname.equals("吴青山") ? "吴绿山" : nickname;
}
public String getNickname() {
return nickname;
}
public void eat() {
System.out.println("吃狗粮");
}
public void wang() {
System.out.println("狗叫");
}
}
拓展知识lombok插件
- 在eclipse所在的文件夹内找eclipse.ini文件打开并添加-javaagent:lombok.jar
- 将lombok的jar拷贝进eclipse所在的文件夹中
- 将lombok带版本号的jar包拷贝进项目的lib文件夹中(如果没有自己新建一个文件夹,jar包可以百度搜索maven respository进行下载)
- 右键-> build path 即可使用
idea中导入jar包:
File -> Project Structure -> Modules -> 选中Dependencies -> 点击右边的+号 -> 选中JARs or directories -> 找到要导入的jar包地址 -> 勾选之后 -> apply
例:
/**
* 教师类
* @author junki
* @date 2019年11月23日
*/
@Data // getters和setters方法、toString()方法等等
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 有参构造
@Builder // 启用建造者模式
public class Teacher {
private String name;
private int age;
private char sex;
}
public class Demo05 {
//junit单元测试类,输入该代码,自动添加jar包即可
@Test
public void test1() {
Teacher teacher = new Teacher("吴老师", 30, '男');
teacher.getName();
teacher.setAge(40);
System.out.println(teacher.toString());
}
//建造者模式
@Test
public void test2() {
Teacher teacher = Teacher.builder()
.name("郭老师")
.sex('女')
.build();
System.out.println(teacher.toString());
}
}
封装的习题:
/**
* 创建一个程序员类
* 属性:姓名、性别、年龄
* 方法:吃饭、睡觉、敲代码
* 要求:
* 1.提供无参和有参构造方法
* 2.使用封装
* 3.姓名不能超过四个字
* 4.性别只能是男或者女
* 5.年龄只能在0到100之间
*
*/
public class Programmer {
private String name;
private char sex;
private int age;
public Programmer() {
}
public Programmer(String name, char sex, int age) {
//判断字符串长度大于4
if (name.length() > 4) {
//王子玉吴青山
//包前不包后
name = name.substring(0, 4);
}
this.name = name;
this.sex = (sex == '男' || sex == '女') ? sex : '男';
this.age = (age >= 0 && age <= 100) ? age : 0;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name.length() > 4 ? name.substring(0, 4) : name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = (sex == '男' || sex == '女') ? sex : '男';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = (age >= 0 && age <= 100) ? age : 0;
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void coding() {
System.out.println("敲代码");
}
@Override
public String toString() {
return "Programmer [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}