面向对象与面向过程
面向对象(OOP)与面向过程
OOP: Object Oriented Programming
面向过程:procedure oriented programming
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
程序员从执行者转化成了指挥者。
完成需求时:
先去找具有所需功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。
这样简化开发并提高复用。
什么是面向对象:
Java是完全面向对象的,必须熟悉OOP才能够编写JAVA程序。在OOP中,不必关心对象的具体实现,只要对象能够满足要求,就不必关心其功能的具体实现过程。
学习面向对象的三条主线:
-
java类及类的成员
一、Java类及类的成员结构
类(class)是构造对象的模板或蓝图。现实世界中的生物不管多大、多小,都是由细胞构成的。同理,Java代码世界是由诸多个不同功能的类构成的。
现实世界中的细胞又是由什么构成的呢?细胞核、细胞质等!那么,Java中用类class来描述事物也是如此
属 性:对应类中的成员变量(例: private String name; //name即为一个属性)
行 为:对应类中的成员方法(例:public void toString(){};//toString即为一个成员方法,也叫函数)
类是对一类事物描述,是抽象的、概念上的定义
可以理解为:类 = 汽车设计图;对象 = 实实在在的汽车
面向对象程序设计的重点是类的设计
定义类其实是定义类中的成员(成员变量和成员方法)
1. 属性(Field)
1.1 语法格式:
修饰符 类型 属性名 =初值 ;
说明:修饰符private:该属性只能由该类的方法访问。
修饰符public:该属性可以被该类以外的方法访问。
类型:任何基本类型,如int、boolean或任何类。
1.2 变量的分类:成员变量与局部变量
在方法体外,类体内声明的变量称为成员变量。
实例变量(不以static修饰)
类变量(静态变量)(以static修饰)
static静态修饰符:
static关键字的中文含义是静态的意思。使用static修饰的成员变量,常量,方法和代码分别称为静态变量,静态常量,静态方法,静态代码块,它们统称为静态成员。静态成员归整个类所有,不依赖特定的实例,被类的所有实例所共享的。只要被JVM加载就可以根据类名在全局数据区内找到
在方法体内部声明的变量称为局部变量。
形参(方法签名中定义的变量)
方法局部变量(在方法内定义)
代码块局部变量(在代码块内定义)
注意:二者在初始化值方面的异同:
同:都有生命周期
异:局部变量除形参外,需显式初始化。
2. 方法
2.1 什么是方法(函数)?
方法是类或对象行为特征的抽象,也称为函数。
Java里的方法不能独立存在,所有的方法必须定义在类里。
修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2,….){
程序代码
return 返回值;
}
其中:
形式参数:在方法被调用时用于接收外部传入的数据的变量。
参数类型:就是该形式参数的数据类型。
返回值:方法在执行完毕后返还给调用它的程序的数据。
返回值类型:方法要返回的结果的数据类型。
实参:调用方法时实际传给函数形式参数的数据。
如何理解方法返回值类型为void的情况 ? void即没有返回值对象,方法不需要返回对象。
3.构造器
语法格式:
修饰符 类名 (参数列表) {
初始化语句;
}
3.1 构造器的特征
它具有与类相同的名称
它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
3.2 构造器的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(Peter,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会 自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。
l根据参数不同,构造器可以分为如下两类:
隐式无参构造器(系统默认提供)
显式定义一个或多个构造器(无参、有参)
注 意:Java语言中
1.每个类都至少有一个构造器;
2.默认构造器的修饰符与所属类的修饰符一致;
3.一旦显式定义了构造器,则系统不再提供默认构造器;
4.一个类可以创建多个重载的构造器;
5.父类的构造器不可被子类继承
4. 代码块(初始化块)
初始化块(代码块)作用:对Java对象进行初始化
一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block),当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只被执行一次。
static块通常用于初始化static (类)属性
class Person {
public static int total;
static {
total = 100;//为total赋初值
}
…… //其它属性或方法声明
}
非静态代码块:没有static修饰的代码块
1.可以有输出语句。
2.可以对类的属性、类的声明进行初始化操作。
3.可以调用静态的变量或方法。
4.若有多个非静态的代码块,那么按照从上到下的顺序依
次执行。
5.每次创建对象的时候,都会执行一次。且先于构造器执行
静态代码块:用static修饰的代码块
1.可以有输出语句。
2.可以对类的属性、类的声明进行初始化操作。
3.不可以对非静态的属性初始化。即:不可以调用非静态的属
性和方法。
4.若有多个静态的代码块,那么按照从上到下的顺序依次执行。
5.静态代码块的执行要先于非静态代码块。
6.静态代码块只执行一次
5. 内部类(innerclass)
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
lnner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner class的名字不能与包含它的类名相同;
Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。
分类:成员内部类(static成员内部类和非static成员内部类)
局部内部类(不谈修饰符)
匿名内部类
面向对象的三大基本特征和五大基本原则:
三大特性是:
- 封装
- 继承
- 多态
五大基本原则
- 单一职责原则SRP(Single Responsibility Principle)
- 开放封闭原则OCP(Open-Close Principle)
- 替换原则(the Liskov Substitution Principle LSP)
- 依赖原则(the Dependency Inversion Principle DIP)
- 接口分离原则(the Interface Segregation Principle ISP)
五大基本原则
单一职责原则SRP(Single Responsibility Principle)
-
一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿。
开放封闭原则OCP(Open-Close Principle)
-
对象或实体应该对扩展开放,对修改封闭。
更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
里氏替换原则(the Liskov Substitution Principle LSP)
- 子类应当可以替换父类并出现在父类能够出现的任何地方。
比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
依赖倒置原则(the Dependency Inversion Principle DIP)
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
接口分离原则(the Interface Segregation Principle ISP)
- 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
"多个专用接口优于一个单一的通用接口。"本原则是单一职责原则用于接口设计的自然结果。一个接口应该保证,实现该接口的实例对象可以只呈现为单一的角色;这样,当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能生性小。