一、封装
1. 面向对象的三大特征
- 封装、继承、多态
2. 它是什么
-
封装:告诉我们,如何正确设计对象的属性和方法。
-
封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
4. 结合生活实际,理解封装思想
-
需求一:
-
请设计一个:人对象,且要求这个对象有:名称、年龄,能吃饭、睡觉
-
相信这个大家都会设计
-
-
需求二:
-
请针对这个需要面向对象设计
-
分析:
- 涉及到2个对象:人、圆;
- 因为需求是人画圆,这属于一种行为,因此需要在圆对象里封装画圆的数据以及画圆的行为方法,提供给人使用,完成人画圆;
- 圆对象的成员变量:圆半径;成员方法:画圆。
-
实现:
-
-
需求三:
-
请针对这个需求面向对象设计
-
分析:
- 涉及到2个对象:人、门;
- 因为需求人关门,这属于一种行为,因此需要在门对象里封装关门的行为方法,提供给人使用,完成人关门
- 门对象:成员方法:关门
-
实现:
-
-
如果以上还不能理解的话,那就再举一个例子:
-
需求:
-
请根据这个需求面向对象设计:
-
就问张三砍死了李四,是张三死亡,还是李四死亡?
答:肯定是李四死亡。
-
那么死亡的方法是定义在张三,还是定义在李四?
答:肯定是定义在李四。
-
那么用程序员的思想怎么理解这个杀人案件?
答:是张三 调用了 李四的死亡方法,致使李四死亡。
-
-
5、理解封装思想的好处
-
sum公司在开发Java编程语言的时候,已经写了各种各样的对象,这些对象,方便我们程序员用来解决实际开发中的业务问题
-
举个例子:sum公司知道对字符串的操作是很常见的,所以,就给我们程序员提供了一个代表字符串的对象
-
有啥事?找对象,调用方法就行,传参数就行,编程变得很简单。
-
降低我们的学习成本,可以少学、少记一点,用的时候,看一下文档就好了。
重点总结
1、什么是封装?
- 告诉我们,如何正确的设计对象的属性和方法。
- 对象代表什么,就得封装对应的数据,并提供数据对应的行为。
2、理解封装思想有哪些好处?
- 有啥事,直接找对象,调用对象方法、传参就行,编程变得很简单。
- 大大降低我们的学习成本,可以少学、少记一点,用的时候,找一下对象就行了。
二、优化封装
1. 如何进行更好的封装
-
一般建议对成员变量使用private(私有、隐藏)关键字修饰进(private修饰的成员只能在当前类中访问)。
-
这种写法,在实际开发中,非常的不好,不推荐使用
-
使用private关键字修饰的成员只能在当前类中访问
-
就好比,你现实中刚认识一个妹子,她不可能一下子就给你暴露她的年龄或者隐私吧!
-
-
合理暴露:为每个成员变量提供配套public修饰的getter、setter方法,暴露其取值和赋值。
- 像这样,通过getAge方法给我们取值;通过setAge方法给我们赋值,并且对所赋值进行一些合法判断。
- 像这样,通过getAge方法给我们取值;通过setAge方法给我们赋值,并且对所赋值进行一些合法判断。
2. 优化封装小案例
-
需求:录入学生年龄并判断年龄是否正常
-
学生类
package com.app.encapsulation; // 学生类 public class Student { // 1.成员变量: 姓名、年龄,使用private修饰——只能在本类中访问 private String name; private int age; /** 2.定义成套的getter、setter方法暴露其取值和赋值 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { // 判断年龄是否正常 if (age >= 0 && age <= 200) { // 年龄正常 this.age = age; }else { System.out.println(this.name + "的年龄不正常!!"); } } }
-
实现类
package com.app.encapsulation; /** 目标:学习如何进行更好的封装 */ public class StudentTest { public static void main(String[] args) { // 创建学生对象,录入学生信息 Student stu1 = new Student(); stu1.setName("赵云"); stu1.setAge(99); // 查看学生年龄 System.out.println(stu1.getName() + "的年龄是" + stu1.getAge()); System.out.println("-------------------------"); Student stu2 = new Student(); stu2.setName("关羽"); stu2.setAge(999); System.out.println(stu2.getName() + "的年龄是" + stu2.getAge()); } }
-
控制台
赵云的年龄是99 ------------------------- 关羽的年龄不正常!! 关羽的年龄是0 Process finished with exit code 0
-
可以看到,赵云的年龄经过setAge方法的判断是正常范围,所以可以正常赋值,输出是赋值后的数据
-
关羽的年龄经过setAge方法的判断不是正常范围,所以不可以进行赋值,输出的是默认值
-
重点总结
1、如何进行更好的封装?
- 一般会把成员变量使用private隐藏起来,对外就不能直接访问了。
- 为每个成员变量提供public修饰的getter、setter方法,暴露其取值和赋值。