啥叫面向过程?就是自顶向下,逐层分解(巴拉巴拉.....)。
面向过程vs面向对象:
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源
;
比如单片
机、嵌入式开发、
Linux/Unix
等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低
耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
面向过程会让一个类越来越全能,就像一个管家一样做了所有的事
。面向对象的编程方式使得每一个类都只做一件事,
像是雇佣了一群职员,每个人做一件小事,各司其职,最终合作共赢!
面向过程
(OP)
和面向对象
(OO)
本质的区别在于分析方式的不同,最终导致了编码方式的不同。
软件工程追求的目标之一就是可维护性,可维护性主要表现在
3
个方面:可理解性、可测试性和可修改
性。面向对象的好处之一就是显著的改善了软件系统的可维护性。
面向对象的四大特性:
抽象、
封装、
继承、
多态。
- 抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对
象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式
和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶
段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在
Java
中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
在
Java
语言中使用
abstract class
来定义抽象类。
- 封装
在面向对象程式设计方法中,封装(英语:
Encapsulation
)是指一种将抽象性函式接口的实现细节部
分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
继承格式: class 子类 extends 父类 { }
封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
采用
this
关键字是为了解决实例变量(
private String name
)和局部变量(
setName(String name)
中的name
变量)之间发生的同名的冲突。
- 继承
继承是
java
面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类
继承方法,使得子类具有父类相同的行为。
继承格式: class 子类 extends 父类 { }
需要注意的是
Java
不支持多继承,但支持多重继承。
继承的特性
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
继承可以使用
extends
和
implements
这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承
object
(这个类在
java.lang
包中,所以不需要 import
)祖先类。
extends
关键字
在
Java
中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以
extends
只能继承一个类。
implements
关键字
使用 implements
关键字可以变相的使
java
具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
super
与
this
关键字
super关键字:我们可以通过
super
关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
final
关键字
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。
注
:
实例变量也可以被定义为
final
,被定义为
fifinal
的变量不能被修改。被声明为
final
类的方法自动地声明为final
,但是实例变量并不是
final。
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super
关键字调用父类构造器,系统会自动调用父类的无参构造器。
- 多态
多态是同一个行为具有多个不同表现形式或形态的能力。常见的多态有重载和重写。
多态的优点
消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
多态的机制
Java
提供了编译时多态和运行时多态两种多态机制。前者是通过方法重载实现的,后者是通过方法的覆盖实现的。在方法覆盖中,子类可以覆盖父类的方法,因此同类的方法会在父类与子类中有着不同的表现形式。
在Java
语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类中的实例对象。同样,接口中的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行时期才动态绑定(绑定是指将一个方法调用和一个方法主体联系在一起),绑定的是引用变量所指向的具体实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态
绑定实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态。