1.面向过程和面向对象的区别
面向过程:
是一种编程思想,关注的是操作 事物的功能/对象的功能 来实现(将功能通过对象来实现),关注的是操作的过程。
面向对象:(面向对象编程OOP,Object Oriented Programming)
也是一种编程思想,基于面向过程而言,即将功能通过对象来实现,将功能封装进对象,让对象实现细节。
优点:易维护、易复用、易扩展,便于框架设计出低耦合的系统,使系统更加灵活
缺点:性能比面向过程差
2.类和对象
1.什么是类
类是对现实生活中一类具有共同属性和行为的事物的抽象(确定对象将会拥有的属性和行为)。类在现实世界并不存在,它只是一种对象的数据类型。特点: ①类是对象的数据类型;
②类是具有相同属性和行为的一组对象的集合。
2.什么是对象
万物皆对象,客观存在的事物皆为对象。理解为能够看得到摸的着的真实存在的实体。
对象的属性:对象具有的各种特征,每个对象的每个属性都拥有特定的值。
对象的行为:对象能够执行的操作。对象的标识:指每个对象在内存中都有一个唯一的地址值用于与其他对象进行区分,类似于我们的身份证号。
属性:在类中通过成员变量来体现(成员变量:类中方法外的变量)
行为:在类中通过成员方法来体现(成员方法:不含static的方法-->public 返回值类型 方法名(形参){...})3.类和对象的关系
先创建类,再通过类创建出对象;可以通过一个类创建出多个对象;
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。
3.类是Java程序的基本组成单位
类的定义
- 定义类:就是定义类的成员,包括成员变量和成员方法。
- 成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
- 成员方法:和以前定义方法几乎是一样的。只不过把 static 去掉,static 的作用在面向对象后面课程中再详细讲解。
格式:
修饰符 class 类名{
1.成员变量(属性)
2.构造器(也指构造方法,初始化类的对象数据)
3.成员方法(行为)
4.内部类
5.代码块
}
4.面向对象的五大原则三大特性
4.1.面向对象的五大原则
1 | 单一职责原则SRP | Single-Resposibility Principle | 类的功能要单一,不能包罗万象,跟杂货铺似的 |
2 | 开放封闭原则OCP | Open-Closed principle | 一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,一万个不乐意 |
3 | 里式替换原则LSP | Liskov-Substitution Principle | 子类可以替换父类出现在父类能够出现的任何地方 |
4 | 依赖倒置原则DIP | Dependecy-Inversion Principle | 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象 |
5 | 接口分离原则ISP | Interface-Segregation Principle | 设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好 |
4.2.面向对象的三大特性
封装:解决了数据的安全性问题
继承:解决了代码的重用问题
多态:解决了程序的扩展问题
4.2.1.封装(Encapsulation)
封装,是隐藏对象的属性和实现细节,若需要访问某个属性,仅仅对外提供公共的访问方式,防止该类的代码和数据被其他类随意访问。
封装原则:
- 使用
private
关键字来修饰成员变量。- 对需要访问的成员变量,提供对应的一对
getXxx
方法和setXxx
方法- 属性的封装只是封装的一种表现形式,方法 、类等都是封装的表现形式
封装的优点:
(1)提高了数据的安全性
别人不能够通过 变量名来修改某个私有的成员属性
(2)操作简单
封装后,类的调用者在使用的时候,只需调用方法即可。
(3)隐藏信息实现细节
实现过程对类的调用者是不可见的,类的调用者只需调用方法即可,不知道具体实现。
4.2.2.继承(Inheritance)
继承,就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承的特性
Java中一个子类只能继承一个父类(单继承)。
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法,即重写父类方法。
继承的优点:
(1)提高类代码的复用性(Java是单继承)
(2)提高了代码的维护性
(3)使得类和类产生了关系,是多态的前提(它也是继承的一个弊端,提高了类的耦合性)
4.2.3.多态(Polymorphism)
多态,是指对于同一行为,对于不同的对象,具有不同的表现形式。在程序中,表示对同一方法,不同的对象有不同实现。同一操作,作用于不同的对象,可以产生不同的结果,这就是「多态」。通常说的多态 都是指运行期的多态,也叫动态绑定。
多态分为:编译时多态 和 运行时多态。
方法重载(Overload) 是 编译时的多态性,而方法重写(Override) 是 运行时的多态性。
实现多态存在的三个必要条件:继承关系,重写(Override),父类引用指向子类对象。
多态的访问方式:
(1)成员变量:编译看左边,运行看左边。
(2)成员方法:编译看左边,运行看右边。
(3)静态方法:编译看左边,运行看左边。多态的实现方式:1.普通父类多态;2.抽象父类多态;3.父接口多态。
Java语言中含有方法重载与对象多态两种形式的多态:
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行转换,而且根据其使用的子类不同完成的功能也不同(重写父类的方法)。
方法的多态性:重载与重写
重载:同一个方法名称,根据不同的参数类型及个数可以完成不同的功能。
重写:同一个方法,根据操作的子类不同,所完成的功能也不同。
对象的多态:父子类对象的转换。
向上转型:子类对象变为父类对象,格式:父类 父类对象 = 子类实例,自动;
向下转型:父类对象变为子类对象,格式:子类 子类对象 = (子类)父类实例,强制。多态的弊端以及解决方案
类型转换的异常问题:类型转换异常(ClassCastException)
原因:子类对引用指向父类对象 或 不存在子父类继承/实现关系
解决办法:1.变量名 instanceof 数据类型---->(父类类型的变量名 instanceof 子类类型 )
2.如果变量属于该数据类型,返回true。
3.如果变量不属于该数据类型,返回false。多态的优点
(1)类调用者对类的使用成本进一步降低(消除类型之间的耦合关系,使程序编写的更简单)
封装是让类的调用者不需要知道类的实现细节。
多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可。
(2)可扩展能力更强
如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低。
对于类的调用者来说(drawShapes方法), 只要创建一个新类的实例就可以了, 改动成本很低。
总结
①封装
隐藏对象的属性和实现细节,若需要访问某个属性,仅仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
②继承
提高代码复用性;继承是多态的前提。
③多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。Java类和类之间关系,耦合度从高到低:(追求的是:高内聚、低耦合)
- is 。 继承、实现
- has 。 组合、聚合、关联
- use 。 依赖
耦合度:依赖 < 关联 < 聚合 < 组合
类与类之间主要有6种关系,分别是:依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强