【Java面向对象】java的学习之旅11-封装

本文介绍了面向对象编程中的封装概念,强调了其提高代码安全性、复用性和维护性的优点。通过Java实例展示了如何实现属性私有化、使用getters/setters方法,并提出了对属性值的合法性校验。此外,还提及了Lombok插件的使用,它能自动生成getter、setter等方法,简化编码工作。示例中包括了Dog和Teacher类的封装实现,并给出了单元测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

实现:

  1. 私有化属性,使用private关键字修饰类的属性。
  2. 对外提供公开操作属性的方法,提供public修饰的getters/setters方法

好处:

  1. 提高代码的安全性
  2. 提高代码的复用性
  3. “高内聚”:封装细节,便于修改内部代码,提高可维护性
  4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和写作。

例:

/**
 * 	需求:
 * 		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插件

  1. 在eclipse所在的文件夹内找eclipse.ini文件打开并添加-javaagent:lombok.jar
  2. 将lombok的jar拷贝进eclipse所在的文件夹中
  3. 将lombok带版本号的jar包拷贝进项目的lib文件夹中(如果没有自己新建一个文件夹,jar包可以百度搜索maven respository进行下载)
  4. 右键-> 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 + "]";
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值