JAVA OOP学习笔记
前言
java作为高级程序设计语言最为基础的特性就是OOP(面向对象编程/面向对象程序设计)
本质是以建立模型体现出来的抽象思维过程和面向对象的方法。 即 一切都是对象
与之区别的是POP(面向过程编程/面向过程程序设计)
OOP | POP | |
---|---|---|
语言 | C++、JAVA、C# | C |
概念 | 把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 | 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用 |
特性 | 抽象 封装 继承 多态 | 模块化 流程化 |
优点 | 易维护、易复用、易扩展 | 性能比面向对象高,多用于开销较小的程序 |
例子(吃饭) | 分解为对象,如吃饭的人等,每个对象负责一个行为,再完成整个事务 | 分解出吃饭的各个步骤,再依次调用实现 |
概念
对象(Object)
- 对象作为程序的基本单元。
- 一个对象包含了数据和操作数据的函数。
- 一个对象有状态、行为和标识三种属性。
类(Class)
- 一个共享相同结构和行为的对象的集合。
- 定义了一件事物的抽象特点。
- 类定义了事物的属性和它的方法。
三大特性(封装、继承、多态)
封装
把客观事物封装成抽象的类,隐藏对象的属性和实现细节,控制在程序中属性的读取和修改的访问级别。
java中的封装访问修饰符 public, protected, <default>, private
,这四个属性的访问权限依次降低。
//时钟类
class Clock
{
private int Hour;//私有成员,外部无法访问
private int Minute;
private int Second;
public void SetTime(int NewH,int NewM,int NewS);//共有成员,外部接口
public void ShowTime();
}
继承
- 继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等
- 通过继承创建的新类称为“子类”或“派生类”。
- 被继承的类称为“基类”、“父类”或“超类”。
- 子类拥有父类的特征,而父类没有,父类更通用,子类更具体
- 子类中通过
super
关键字来调用父构造方法
public A {
//父类 通用方法
}
public B extends A{
//子类 私有方法
}
重写(不同类中)
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
要求
- 方法名、参数个数和参数类型 都必须相同
- 派生类重写的方法的访问权限不能低于基类的权限
- 派生类抛出的异常应该和基类相等或比基类更小
public class Parent {
public void ovel(int i){
/*do something...*/
}
public String ovef(){
/*do something...*/
return "***";
}
}
public class Child extends Parent{
public void ovel(int i){
/*do other something...*/
}
public String ovef(){
/*do other something...*/
return "XXX";
}
}
多态
允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
覆盖
- 是指子类重新定义父类的虚函数的做法。
- 当子类声明了与基类相同名字的方法,而且使用了相同的签名时,就称派生类的成员隐藏(hide)了基类的成员
public interface Parent{//父类接口
public void simpleCall();
}
public class Child_A implements Parent{
public void simpleCall(){
//具体的实现细节;
}
}
public class Child_B implements Parent{
public void simpleCall(){
//具体的实现细节;
}
}
重载(同一个类中)
与多态不相关,但能实现多态,重载属于静态多态,是一种语言特性,是一种语法规则
函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
public class A
{
public void simpleCall(int x){
//具体的实现细节;
return xxxx;
}
public void simpleCall(String x){
//具体的实现细节;
return "xxx";
}
public void simpleCall(bool x,int x){
//具体的实现细节;
}
}
//函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。
总结
面向对象特点
- 数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰
- 通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度
- 结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程
- 通过对对象的辨别、划分可以将软件系统分割为若干相对为独立的部分,在一定程度上更便于控制软件复杂度
- 以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统
- 通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级
面向对象更多是一种计算机编程架构,是一种解决问题的方法,是一种思想。