面向对象三大特性-封装特性
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装起来,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其它对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互,用户无须知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。
- 良好的封装能够减少耦合,类内部的结构可以自由修改
- 可以对成员进行更精确的控制
- 隐藏信息,实现细节
public class Husband { /* * 使用private修饰符对属性修饰 */ private String name ; private String sex ; private int age ; private Wife wife; /* * setter()、getter()是该对象对外提供的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void setWife(Wife wife) { this.wife = wife; } }
public class Wife { /* * 使用private修饰符对属性修饰 */ private String name; private int age; private String sex; private Husband husband; /* * setter()、getter()是该对象对外提供的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public void setHusband(Husband husband) { this.husband = husband; } public Husband getHusband() { return husband; } }
上面两个封装实例中Husband里Wife引用没有getter()方法,同时Wife的age没有getter()方法。封装其实就是把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,那么就不提供方法给外界访问;可是如果一个类没有提供给外界访问的方法,那么这个类本身也没有存在的意义。
减少耦合
如果我们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样定义和使用:
public String name ; public String sex ; public int age ; public Wife wife;
Husband husband = new Husband(); husband.age = 30; husband.name = "张三"; husband.sex = "男";
如果哪天需要修改Husband,例如将age修改为String类型?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,不是要改到崩溃。如果使用了封装,完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。
public class Husband { /* * 使用private修饰符对属性修饰 */ private String name ; private String sex ; private String age ; private Wife wife; /* * setter()、getter()是该对象对外提供的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(int age) { this.age = String.valueOf(age); } public void setWife(Wife wife) { this.wife = wife; } }