1.封装的定义
数据的隐藏:禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问
程序设计要求”高内聚,低耦合“
高内聚:类的内部数据操作细节由自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用
2.封装:属性私有(Private),用get/set方法调用
1)先编写一个无封装的程序
创建一个demo04的包,包中添加一个Student.java(Student类)
1 public class Student { 2 //定义一些属性,也叫成员变量 3 public String name; 4 public int id; 5 public char sex; 6 7 8 //也可以定义一些方法,但是很少用方法的封装,所以这里不写了。 9 }
2)与demo04平行目录创建一个Application.java(Application类)
1 public class Application { 2 public static void main(String[] args) { 3 Student student = new Student(); 4 System.out.println(student.name); 5 } 6 }
这里可以运行看到,在Application中可以正常调用Student类中的属性。
3)但是如果写成封装,那么就要将Student中的属性私有(在定义的属性前添加private),代码如下
1 public class Student { 2 //定义一些属性,也叫成员变量 3 private String name; 4 private int id; 5 private char sex; 6 }
4)这样的话,在Application中可以就不能直接调用Student类中的属性,于是我们要在Student类中编写get、set方法来Application中可以调用,赋值这些属性
1 public class Student { 2 //定义一些属性,也叫成员变量 3 //一般属性都会写成私有 4 private String name; 5 private int id; 6 private char sex; 7 //获得name属性值的方法 8 public String getName(){ 9 return this.name; 10 } 11 //设置name属性值的方法 12 public void setName(String name){ 13 this.name=name; 14 } 15 }
5)这样就可以直接在main方法中利用get、set方法来调用这些属性
1 public class Application { 2 public static void main(String[] args) { 3 Student student = new Student(); 4 student.setName("小明"); 5 String xiaoming=student.getName(); 6 System.out.println(xiaoming); 7 } 8 }
6)也可以在get、set方法中做一些对程序的检查及规避一些风险,例如可以在Student中对age的值进行检查
1 public void setAge(int age) { 2 if (age<120 && age>0){ 3 this.age = age; 4 }else { 5 this.age=3; 6 }
那么如果在调用age这个属性时输入不合法的年龄如999,就会输出3
1 student.setAge(999); 2 System.out.println(student.getAge());
7)IDEA快捷键添加get、set方法
Alt+Insert
选择想要添加get、set方法的属性
程序就会自动生成了
3.封装的意义
1)提高程序安全性,保护数据
2)隐藏代码的实现细节
3)统一接口,只用get、set方法调用
4)提高程序的可维护性