7.8 封装详解
就是把东西装进箱子里,只留一个口,比如我们看电视的时候我们只用遥控器换一个台就行了,不需要知道电视里面是怎么构造的,电视机使用的厂家为了使用方便就把电视机内部的组件全部封装在了壳子里,只给我们暴露出一个开关和换台。
- 该露的露,该藏得藏:
- 我们程序设计要追求高内聚,低耦合。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,比如银行里面的总钱数是由银行人员操作的不需要每个人都去操作,而每个个人都只操作自己的账户即可;低耦合:仅暴露少量的方法给外部使用,比如都是去取钱,能取钱的都是银行的一些普通用户就可以,而这些人是不能去操作那些钱的,不能把银行的钱借给别人,只能操作自己卡上的钱,也就是说方法是有限的。
- 封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中的数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
- 记住这句话就够了:属性私有,get/set
封装大多数是针对属性的,对于方法用的比较少
封装的核心就是私有,也就是关键字Private
get,set方法就是提供一些可以操作这个属性的方法,由于这些属性变得私有了,外部的人即使是new了这个对象,也不能去用这些属性。所以就需要提供一些public的get或者set方法。
get:就是获得这个数据或者属性
set:就是给这个属性设置值
这里不直接操作属性,而是通过一些外部可以调用的方法进行操作。
注意:
-
属性私有的时候一般都是用Private关键字进行修饰。
-
在IDEA中使用alt+insert可以自动生成get/set方法
-
属性私有的意义在于
- **提高程序的安全性,**可以对属性进行数据赋值合法性进行安全性检查,可以利用封装的set方法进行一些安全性的检查,也就是可以通过内部的封装让我们的程序变得更安全。可以避免有些人破坏程序系统
- 可以隐藏代码的实现细节,如示例中用户只能设置年龄,而里面的合法性判断实现用户是看不到的,作为一个调用者,根本不知道类里面是如何实现的。
- 可以统一接口
- 提高了系统的可维护性,良好的封装便于我们修改内部代码,提高程序的可维护性
-
也就是只用记住封装就是属性私有、get/set方法,我们可以在set方法中增加安全性判断。
-
一般情况下get/set很少用重载,大部分的重载都是在构造器中使用的
-
在平时看源码的时候,可以多看一些重载的方法,在Java中判断一个类的两个方法是否相同,主要就参考1.方法名,2.参数列表
封装实例
package com.baidu.www.oop.demo04;
public class Student {
//属性私有,也就是加上一个private关键字
//名字
private String name;
//学号
private int id;
//性别
private char sex;
//年龄
private int age;
//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 int getAge() {
return age;
}
//属性私有的意义在于可以对属性进行数据赋值合法性进行安全性检查,可以利用封装的set方法进行一些安全性的检查
public void setAge(int age) {
if(age>120 || age <0){
this.age=3;
}else {
this.age = age;
}
}
//学习()
//睡觉()
}
主程序实例
package com.baidu.www.oop;
import com.baidu.www.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
String name = s1.getName();
System.out.println(name);
System.out.println(s1.getName());
s1.setName("肆悟先生");
System.out.println(name);
System.out.println(s1.getName());
s1.setAge(35);
System.out.println(s1.getAge());
}
}