一封装
定义
封装是指将基本数据和对基本数据的操作放在一起并尽可能的隐藏起来,使其成为一个整体,只向外界尽可能少的暴露信息。而外界想要访问时,只能通过被暴露出来的信息或接口进行访问操作。
比如我们来简单的封装一个女性同胞,她有最基本的个人属性(名字,年龄,身高...),对于女性来说身高和年龄都算是隐私信息吧, 所以我们应该将这些信息都隐藏起来,但名字并不是隐私信息,所有我们可以采取某种方式将其暴露出去。对应的代码可能是这样:
只向外暴露一个访问名字的方法
class Woman{
private String name;
private int age;
private int height;
public String getName() {
return name;
}
}
为什么要封装
万事万物皆对象,我们人类也不例外,所以我们自己也会对自己加以封装,我们会把自己想暴露的信息暴露给别人,不想让别人知道的我们会加以隐藏。封装的目的就是为了隐藏信息,不让别人窥探内部细节。
- 单一性原则,减少耦合
自己的事情自己干,不要多管闲事,否则可能会造成不必要的麻烦。 - 对于不同的访问者可以暴露不同的信息
比如我们会对朋友暴露很多的个人信息和一些技能,但对于陌生人我们可能只会暴露自己的姓名,从而很好的隐藏自己的信息。 - 隐藏具体的实现
比如我们去食堂吃饭,我们不会去关注饭店老板是怎么把饭做出来的(我们也不应该去关注),因为这是饭店老板的看家手艺,他只会告诉(暴露)给我们他会做某某菜,不会告诉我们具体是怎么做的。
二 继承
定义
继承是一个在已存在的类(父类/超类)的基础上建立新类(子类/派生类)的技术,子类可以继承父类的属性和方法的同时增加新的属性和方法,但不能选择性的继承父类的方法。
为什么要使用继承
- 减少不必要的重复代码
- 向上转型(在多态中非常重要)即父类的引用变量可以指向任意一个子类。
特性
- 子类可以拥有父类中非
private
的属性和方法 - 子类可以重新实现父类的方法(重写父类方法)
- 子类可以拥有自己的属性和方法,即对父类的扩充
注意
- 子类并不能继承父类的构造器方法,但是可以调用父类的构造器(
super()
)。子类一般会默认的调用父类的构造器,但如果父类不存在默认构造器(无参构造器),那么子类就必须显示的调用父类构造器。 - 继承其实已经违背了封装这一特性(隐藏属性和方法),但为了不过多的暴露内部信息,又想让子类得到继承,那么我们就可以使用
protected
来修饰需要让子类访问的属性或方法。 - 向上转型即将子类转换成父类,也就是说我们可以定义一个父类的引用来接收任意一个继承该父类的子类。
三 多态
定义
多态指在程序中定义的引用变量所指向的具体类型和通过该引用变量所调用的方法在代码编译期间是无法确定的,而是在程序运行期间才确定下来的(后期绑定/动态绑定)。这样我们就可以不修改代码就可以让引用变量绑定在不同的具体类上,调用不同的方法。
好处
- 可替换性:对于现存的代码具有可替换性。
(Person person = new Man() ==> Person person = new Woman())
- 可拓展性
- 接口性:父类向子类暴露接口,子类来实现或重写。
多态的前提条件
- 需要继承
- 需要重写
- 父类引用指向子类
特性
- 由于我们是使用父类的引用去指向具体的子类对象,所以我们只可以调用父类的属性和方法,不可以调用子类所拓展的属性和方法。
- 如果子类重写或实现了父类的属性/方法,那么在运行期所调用的是子类重写或实现后的属性/方法.
- 被
private
、static
、final
修饰的属性和方法是无法被重写的,即不存在多态 - 构造器的调用顺序:
- 调用基类构造器,这个步骤会不断的反复递归下去
- 按声明顺序调用成员的初始化方法