面向对象(Object Oriented)
面向对象主要有四个特性:抽象,封装,继承,多态。
抽象
抽象可以理解为将现实事物简化、概括,方便人们理解,进而转化为代码的过程。比如地图就是对现实地理情况的抽象。
软件开发解决的是现实问题,但是需要对信息进行提炼抽象,抓住问题的本质与重要的属性,从而能够更好更快地解决问题。
抽象包括两个方面:过程抽象与数据抽象。过程抽象,是指将一个系统按照功能分为若干个子系统,进行"自顶向下""逐步求精"的程序设计。数据抽象,以数据为中心,把数据类型和施加在对该类型对象上的操作作为一个整体来进行描述,形成抽象的数据类型。
过程抽象:动物的捕猎可以抽象为一下几步,搜寻猎物,锁定猎物,抓捕猎物,最后成功OR失败;
数据抽象:抽象动物,数据部分,可以包括头,身体,四肢,尾巴等;行为(操作)部分,可以包括奔跑,进食,叫等。
封装
封装是将数据及加在这些数据上的操作组织在一起,成为独立有意义的组件。外部无法直接访问这些被封装的数据,从而保证数据的正确性。要访问该类的代码和数据,需要通过严格的接口控制。封装将实现的细节部分包装隐藏起来,通过一个公共接口供外部调用。
封装的优点:
- 良好的封装可以减少耦合
- 类内部的结构可以自由修改
- 方便对成员变量进行更精确的控制
- 隐藏信息,实现细节
封装的实现者控制对成员的访问(private,protected,public),主要有以下两个原因。
- 防止程序员接触他们不应该接触的东西——即类内部的数据结构及方法的实现细节。类向用户提供的其实是某些服务,一个方法一般是一个服务或是功能,外部调用者想实现功能只需要调用此方法既可,内部用了哪些数据结构,具体的实现细节如何,调用者不需要也不应该考虑。
- 允许类设计者修改内部结构,而不用担心会对调用者产生什么影响。
继承
继承就是一种类的层次结构,允许和鼓励类的重用。一个新类可以从已有的类中派生,这个过程叫做类的继承。派生类继承了基类的实力变量与方法,并且派生类可以修改或者增加新的方法,使得派生类更适合特殊的需求。
继承就是子类继承父类的特征和行为,使得子类对象具有父类的特征和行为。
父类更通用,子类更具体。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是一个接口,使用不同实例而执行不同操作。
多态的优点:可以使程序有良好的扩展,并可以对所有。类的对象进行通用处理。
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
// 动物类
abstract class Animal{
abstract void eat();
}
// 羊
class Sheep extends Animal{
// 继承并重写
public void eat(){
System.out.println("羊吃草");
}
}
// 狼
class Wolf extends Animal{
// 继承并重写
public void eat(){
System.out.println("狼吃肉");
}
}
@Test
public void eatTest(){
Animal animal1 = new Sheep(); // 向上转型
animal1.eat(); // 调用的是Sheep的eat方法
Animal animal2 = new Wolf(); // 向上转型
animal2.eat(); // 调用的是Wolf的eat方法
}
//运行结果:
// 羊吃草
// 狼吃肉