面向过程的优点是性能比面向对象高,不需要面向对象的实例化;缺点是不容易维护、复用和扩展。面向对象的优点是具有封装、继承、多态的特性,因而容易维护、复用和扩展,可以设计出低耦合的系统;缺点是由于需要实例化对象,因此性能比面向过程低。
~
本篇主要记录内容包括:面向对象的概念、封装、继承、多态
面向过程的优点是性能比面向对象高,不需要面向对象的实例化;缺点是不容易维护、复用和扩展。
面向对象的优点是具有封装、继承、多态的特性,因而容易维护、复用和扩展,可以设计出低耦合的系统;缺点是由于需要实例化对象,因此性能比面向过程低。
Java面向对象的三大特性:封装,继承,多态
new
的方式,创建该事物的具体对象(对象实例化)封装(Encapsulation
)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法,也可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问,要访问该类的代码和数据,必须通过严格的接口控制。
外部调用者无需修改或者关心内部实现,内部细节对外部调用透明,外部调用无需修改或关心内部实现
封装的优点: 隐藏细节、减少耦合、便于理解与维护、加强了代码的安全性等
Java 提供了三种访问权限,准确的说还有一种是默认的访问权限,加上它一共四种。
private
: 在当前类中可访问,使用对象:变量、方法。 注意:不能修饰类(外部类);default
:在当前包内和访问,不使用任何修饰符。使用对象:类、接口、变量、方法;protected
: 在当前类和它派生的类中可访问,使用对象:变量、方法。 注意:不能修饰类(外部类);public
: 公众的访问权限,谁都能访问,使用对象:类、接口、变量、方法修饰符 | 访问级别 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|---|
public | 公开 | O | O | O | O |
protect | 受保护 | O | O | O | X |
default | 默认 | O | O | X | X |
private | 私有 | O | X | X | X |
继承: 从一个已知的类中派生出一个新的类,新类可以拥有已知类的行为和属性,并且可以通过覆盖/重写来增强已知类的能力,子类共性的方法或者属性直接采用父类的,而不需要自己定义,只需要扩展自己的个性化
通过 extends 关键字,可以声明一个子类继承另外一个父类,子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.方法()
,
继承的优点:提高代码的复用性、提供了多态的前提、为多态做铺垫等
继承的初始化顺序:父类的静态代码块 -> 子类的静态代码块 -> 父类的构造代码块 -> 父类的无参构造方法 -> 子类的构造代码块 -> 子类的无参构造方法
private
修饰的成员,也可以调用父类的非private
修饰的成员super
关键字override
重写、复写或者覆盖有继承关系的子类 中, 子类覆盖父类的方法
方法覆盖的前提是,参数列表、方法名必须相同,返回值类型如果是基本数据类型则必须相同,如果是引用数据类型,则可以时返回值父类方法的返回值的子类类型
注意:
多态: 是指对象的多种形态,封装和继承几乎都是为多态而准备的。
Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值,最终多态体现为 父类引用变量可以指向子类对象
多态调用的三种格式:
父类 变量名 = new 子类();
抽象类 变量名 = new 抽象类子类();
接口 变量名 = new 接口实现类();
多态的优点:提高代码的可维护行、提高代码的扩展性
overload
)与方法签名因为对于方法重载而言,虽然多个方法的方法名相同,但是我们的编译器,可以根据方法调用代码推断出,所要调用的那个方法的方法签名,从而根据方法签名(jvm
唯一的),确定要调用的方法
注:方法签名: 方法名+方法参数列表
因为在编译器编译的时候,无法知道,具体调用的是哪个方法的代码,只有当jvm
具体真正执行到调用代码的地方,jvm
才能知道调用的究竟是哪个方法
实现运行时多态:继承、方法覆盖/重写(override)、父类引用指向子类对象
# 向上转型
父类类型 变量名 = new 子类类型();;
# 向下转型
子类类型 变量名 = (子类类型) 父类类型的变量;
;ClassCastException
类型转换异常。在转换之前必须做类型判断# instanceof 关键字
instanceof
关键字来判断是否能够对象转化。也就是,一个引用型的变量,是不是这个类型的对象,提高向下转型的安全性;boolean b = 对象 instanceof 数据类型;
,返回 true / false
注意:
null instanceof <类名>
结果永远是false