面向对象
问题
- 面向对象的好处
- 学一门技术是否需要趣味性、通俗性的指导
面向对象
什么是对象
世间任何事物都可以定义为对象。
什么是类
类就是把对象的公共属性和方法抽离出来形成集合的抽象,也就是说,类是一种抽象,用来描述对象特征的抽象。
什么是实例
实例就是对象,就好比我们,就是人这种抽象的一个实例。
什么是构造方法
从字面上来看,构造方法是用来构造对象,当对象正在创建时,会通过构造方法对对象进行初始化。
构造方法的特征:
- 与类同名
- 无返回值
- 未定义时,会创建一个默认构造方法
什么是方法重载
方法重载就是同一个方法,在使用的时候能够根据你参数的类型,从而表现出不同的行为
public class person {
public void eat(){
System.out.println("没东西可以给我吃");
}
public void eat(Fruit fruit){
System.out.println("我正在吃水果");
}
...
}
方法重载提供了函数可扩展的能力,使用时仅需:
- 方法名相同
- 参数类型或参数个数不同
面向对象三大特性
封装
优点:
- 松耦合
- 隐藏类的内部实现
- 对外部只暴露必要的接口,避免使用者使用非法的操作来改变类对象的内部结构
通常,我们在设计一个功能时,总是会把与该功能类似的所有属性和行为都封装在一个类中,这样就可以避免功能内部的行为与别的类产生依赖性,别人使用你的功能时,仅仅需要知道如何调用你的接口来获取想要的信息,不需要理会内部实现到底是怎么做。
对于类的内部,一般开发者只提供必要的接口来访问它的内部属性,不会允许你直接操作它的内部,这样做有利于保证使用者是按照设计者的设计逻辑控制使用,避免因为非法使用而导致错误的发生。
继承
特点:
- 子类拥有父类非 private 的属性和方法
- 子类具有自己的属性和方法,可以扩展新的行为
- 子类还可以重写从父类的行为
优点
- 实现代码复用
- 方便设计严密的类登记结构体系(树状)
对象的继承是一种 'is-a' 的关系,如果两个对象 A 和 B ,可以描述为 ‘B 是 A’,则表明 B 可以继承 A。
继承关系不能简单地理解为父亲和儿子的关系,继承关系实际上是一种特殊关系,就好比猫和哺乳动物,猫是哺乳动物的一种特殊抽象,因为它除了具备哺乳动物的特性外,还具备自己独有的个性;比如它会抓老鼠、抓鱼,这些并不是哺乳动物的共同特性。
当然,在设计类的时候,千万不要为了继承而继承,过多的使用继承会使得整个类层次结构变得十分复杂,使得类与类之间的耦合性变强,所以在使用继承的时候千万要理清对象与对象之间的关系;在没有必要选择继承的情况下推荐使用组装。
当然是否要使用继承,这也得看具体情况,当两个类拥有 ‘is-a’ 的关系,可以使用继承;当两个类拥有 'has-a' 的关系,可以使用组装。
多态
多态也叫动态绑定,即是系统在运行时会根据对象的运行时类型,从而表现出不同的行为
特点:
- 子类以父类的身份出现
- 子类在工作时以自己的方式去实现
- 子类以父类的身份出现时,特有的属性和行为不可以使用
与动态绑定相对的则是静态绑定,C语言编程采用的就是静态绑定。静态绑定是在 编译期进行,也就是说,你的程序在编译的时候,他已经对各个方法的调用的地址已经做了绑定,所以在运行的时候,程序会直接根据你的方法地址去调用具体的方法。
而向面向对象编程多态采用的则是动态绑定,那么动态绑定他到底是如何做的呢?程序运行的时候又是如何确定它的运行时类型从而调用对应的方法的呢?
之后再详解。
抽象类
特点:
- 抽象类不能实例化
- 抽象方法是必须被子类重写的方法
-
如果类中包含抽象方法,那个该类必须要被定义为抽象类
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是要用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点应当是抽象类
接口
特点:
- 接口不能实例化
- 字段默认都是public static final 类型
- 只能定义抽象方法
接口和抽象类的区别
对于初学者来说,很多人在学习的时候,肯定都会有这么一个疑问,接口和抽象类的区别到底是什么,我们在设计程序的时候,什么时候应该用抽象类,什么时候用接口呢?
那么先来说说这两者的使用特点的区别:
- 抽象类可以定义抽象方法,也可以定义基本方法(即自己方法给方法做出实现),而接口只能定义抽象方法
- 一个类只能继承一个抽象类,但可实现多个接口
- 子类可以选择只实现部分抽象类的成员(这样子类也是一个抽象类),但必须对接口所有成员进行实现
那么现在就来说说它们在设计思想上的区别:
- 类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象
- 如果行为跨越不同类型的对象(例如飞机、鸟,不是同一类对象,但都有飞行这种行为),可考虑使用接口;如果是对于一些相似的对象(例如猫、狗都属于动物),则考虑抽象出抽象类,让其继承
- 从设计角度讲,抽象类是对子类公共部分的抽象,而接口根本不知子类的存在,而是预先定义了一套行为
也就是说,不论是接口、抽象类、类甚至对象,都是在不同层次、不同角度进行抽象的结果,它们的共性就是抽象。通常抽象类是对目前一类存在共性的子类的一种泛化,通过抽离出子类间的共同属性和行为,从而进行抽象的一种泛化;而接口则是预先定义了一套有关联的行为,至于谁会实现这套行为,开发者自行决定,而我要做的只是告诉接口的实现类你拥有哪些行为而已。