这是我参与更文挑战的第4天,活动详情查看: 更文挑战
封装是在抽象基础上决定信息是否公开,以及公开等级,核心问题是以什么样的方式暴露哪些信息。
抽象是要找到成员和行为的共性,成员是行为的基本生产资料,具有一定的敏感性,不能直接对外暴露。封装的主要任务是对成员、数据、部分内部敏感行为实现隐藏。
对成员的访问与修改必须通过定义公共的接口来进行,另外某些敏感方法或者外部不需要感知的复杂逻辑处理,一般也会进行封装。
像智能音箱,与用户交互的唯一接口就是语音输入,封装了内部的实现细节和相关数据。
设计模式七大原则之一的迪米特法则也说明了封装的要求,A 接口使用 B 接口,对 B 知道的要尽可能少。
包
包(package)这个名称就很明显体现了封装的含义,它能起到把一个模块封装到一起,并由几个接口开放给使用方。使用方只能看到接口信息,而看不到接口实现。另外包解决重名问题,相同类名在相同路径下是不允许的,切换包路径就可以起相同的类名。
访问权限控制
我们编写的程序要想让使用方,能看到一些信息,又不能看到另外一些信息,这就涉及到信息隐藏了。
信息隐藏是面向对象程序设计的重要特点之一,它可以防止类的使用者意外损坏数据,对任何实现细节所作的修改不会影响到使用该类的其它代码,也使类更易于使用。
那在 Java 里,实现信息隐藏的就是访问权限控制机制了。Java 的访问权限控制有 4 个访问修饰符:public
、protected
、private
和缺省。可以使用这四个访问修饰符修饰类的成员,它们在不同位置的可访问性如下表所示。
位置\访问修饰符 | public | protected | 缺省 | private |
---|---|---|---|---|
本类 | 可以 | 可以 | 可以 | 可以 |
本包 | 可以 | 可以 | 可以 | 不可以 |
子类 | 可以 | 可以 | 不可以 | 不可以 |
所有 | 可以 | 不可以 | 不可以 | 不可以 |
你会发现 public
不受任何限制,本类和非本类都可以随意访问(全局友好)。protected
本类及其子类可以访问(父子友好),同一个包中的其它类也可以访问(包内友好)。而缺省的时候,只有相同包中的类可以访问(包内友好)。private
只有本类可以访问,其余都不可以(类内友好)。
除了为类成员添加访问权限控制外,也可以在定义类的时候,为类添加访问修饰符,对类进行访问权限控制。不过对类使用的访问修饰符只有 public
和缺省两种,访问范围也分别是全局友好和包内友好。
getter 与 setter
为了让类成员不对外直接暴露,我们经常把成员变量的访问权限设置成 private
,而成员值的访问与修改使用相应的 getter/setter 方法。而不是对 public
的成员进行读取和修改。
package cn.java4u.oo.packagedemo;
/**
* getter 和 setter 演示
* @author 蜗牛
* @from 公众号:蜗牛互联网
*/
public class GetterSetterDemo {
/**
* 成员变量私有化
*/
private String name;
/**
* 公开方法获取成员变量值
*
* @return 名称
*/
public String getName() {
return name;
}
/**
* 公开方法设置成员变量值
*
* @param name 名称
*/
public void setName(String name) {
this.name = name;
}
}
复制代码