一、什么是封装,为什么要封装
对面向对象而言:封装就是将方法和属性包装到一个程序单元中,并且这个单元以类的形式实现。
简单讲:封闭就是将属性私有化,提供公有方法来访问私有属性
封装的作用:
- 封装反映和事物的相对独立性,封装在编程中的作用就是:使对象以外的部分不能随意更改对象的属性,从而有效避免了外部错误操作对此对象的影响
- 提高松耦合性,代码重用性
松耦合:把对象想象成一个电池,这个电池不仅可以在相机中使用,也可以在遥控器,吹风机和剃须发等中使用, 我们说电池的松耦合性是非常好,而实现如此好的松耦合的前提就是对象有很好的封装性
二、封装的实现
- 属性私有化private
- 设置get/set方法
- 对属性设置必要的限制
package com.pb.demo3;public class Person { private String name; //姓名 private String sex; //性别 private int age;//年龄 //设置getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { if(sex.equals("男") || sex.equals("女")){ //设置性别限制,不合法的值将提示错误 this.sex = sex; }else{ System.out.println("性别不合法,性别只能是:男或者女"); } } public int getAge() { return age; } public void setAge(int age) { if(age>0 && age<=150){ //设置年龄限制 this.age = age; }else{ System.out.println("年龄只能在1-150岁之间"); } } public Person() { } public Person(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public void say(){ System.out.println("自我介绍:"); System.out.println("姓名:"+this.name); System.out.println("性别:"+this.sex); System.out.println("年龄:"+this.age); }}
测试类:
package com.pb.demo3;public class PersonTest { public static void main(String[] args) { Person person=new Person(); person.setName("韩冰"); //传入不合法的值 person.setSex("中性"); //传入不合法的值 person.setAge(200); //调用普通方法输出 person.say(); }}
结果:将提示错误
性别不合法,性别只能是:男或者女
年龄只能在1-150岁之间自我介绍:姓名:韩冰性别:null年龄:0从结果可以看出,不合法的值,将为该数据类型的初始值String 为null,int 为0
也可以在构造方法中为值进行初始化,这样,设置值为不合法时,就会使用初始化的值
public Person() { this.name = "无名氏"; this.sex = "男"; this.age = 22; }
再执行错误的值传入时
package com.pb.demo3;public class PersonTest { public static void main(String[] args) { Person person=new Person(); person.setName("韩冰"); //传入不合法的值 person.setSex("中性"); //传入不合法的值 person.setAge(200); //调用普通方法输出 person.say(); }}
结果:
性别不合法,性别只能是:男或者女
年龄只能在1-150岁之间自我介绍:姓名:韩冰性别:男年龄:22