面向对象编程"/>
OOP面向对象编程
OO面向对象
- 类和对象
- this关键字
- 构造方法
- 继承 extends
- super
- 方法的重写(override /overriding)
- final
- 抽象 abstract
- 接口
- 多态
- 补充
- 面向过程:
- 面向对象:
- 默认值规则:
- 内存管理:
- 泛化
- 内部类
- 封装
- 访问控制修饰符
- 静态
- 静态变量
- 静态块
- 静态方法
- 枚举
类和对象
什么是类?什么是对象?
- 类,变量和方法组成的一种新的数据类型——引用类型
- 现实生活是由很多对象组成的,基于对象抽象了类
类中可以包含:
- 对象的属性、特征、数据,设计为成员变量
- 对象的行为、动作、功能,设计为方法
对象: 软件中真实存在的单个的个体、东西
类: 类型 / 类别,代表一类个体
- 类是对象的类别 / 模板 / 图纸
- 对象是类的具体的实例
- 类是一种引用数据类型
类中包含:
成员变量 ------- 对象的属性
方法 ------------- 对象的行为、功能
声明类型的引用变量,指向对象
this关键字
this:指代当前对象,
只能用在方法中,方法中访问成员变量之前默认有个this
this指代当前对象,哪个对象调用方法,this指的就是哪个对象
- this.成员变量名 —— 访问成员变量
- this.方法名() —— 调用方法
- this() ———— 调用构造方法
当成员变量与局部变量同名时,若想访问成员变量,则this不能省略
构造方法
构造函数、构造器、构建器、
好处: 复用给成员变量赋初始值的代码
作用: 给成员变量赋初始值
语法: 与类同名,没有返回值类型(连void都没有)
调用: 在创建new对象时被自动调用
- 若自己不写构造方法,则编译器默认提供一个无参构造方法,若自己写了构造方法,则不再默认提供无参构造,无参构造会被覆盖
- 构造方法可以重载
继承 extends
- 通过extends实现继承
- 作用:实现代码复用
超类、父类、基类 -> 共有属性和行为
派生类、子类 -> 特有的属性和行为 - 派生类可以访问超类的和派生类的,但超类不能访问派生类的
- 一个超类可以有多个派生类,但一个派生类只能有一个超类,称为单一继承
- 继承具有传递性
super
指代超类的成员变量
super . 成员变量名 -> 访问超类的成员变量
super . 方法名() -> 调用超类的方法
super()-> 不写且默认有该关键字调用超类的无参构造方法
- 当超类成员变量和派生类成员变量同名时,super指超类的,this指派生类的
- 若没有同名现象,则写super和this是一样的
Java规定: 构造派生类之前必须先构造超类
为了保证这个规则,Java做了两种操作
- 在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
注:super()调用超类构造方法必须位于派生类构造方法的第一行 - 在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
方法的重写(override /overriding)
- 发生在父子类中,方法名相同,参数列表相同
- 重写方法被调用时,看对象的类型执行方法,即new谁就调用谁的方法
final
表示最终的,不可改变的
修饰变量:表示变量不能被改变
修饰方法:表示方法不能被重写
修饰类:表示类不能被继承
抽象 abstract
只有方法的定义,没有具体的实现(连{}都没有)
包含抽象方法的类必须是抽象类
由abstract修饰
抽象类不能被实例化(new对象)
抽象类是需要被继承的,派生类有两种处理方法
- 也声明为抽象类
- 必须重写所有抽象方法
抽象类的意义
- 封装共有的属性和行为,实现代码复用
- 可以包含抽象方法,为所有派生类统一入口(名字统一),强制必须重写
接口
是一种引用数据类型
由interface定义
只能包含抽象方法(常量、默认方法、静态方法、私有方法)
接口不能被实例化(new对象)
接口是需要被实现的,实现类:必须重写接口中的所有抽象方法
注意:重写接口中的抽象方法时,必须加public
一个类可以实现多个接口。若又继承又实现,先继承再实现
接口可以继承接口
接口的应用:
- 接口是对继承单根性的扩展 实现多继承
- 接口是一种标准、规范,表述具备某种功能
实现了某接口就具备某个功能,不实现接口就不具备那个功能
类间关系
类和类 -> 继承+
接口和接口 -> 继承
类和接口 -> 实现
多态
向上造型/自动类型转换
- 超类型的引用指向派生类的对象
- 属性看引用类型的
Animal o new Animal();
Dog o = new Dog();
Animal o = new Dog(); 把子类造成父类
Dog o new Animal //编译错误
应用1:
将超类型(Animal)作为参数类型
传递派生类(Dog Chick Fish) 对象
以扩大方法的应用范围
实现代码服用
应用2:
将不同对象(Dog chick Fish)
统一封装到超累数组 (Animal数组) 中来访问
实现代码服用
向下转型
向下转型/强制类型转换,成功的条件只有如下两种
1 引用所指向的对象,该类型
2 引用所指向的对象,实现了该接口或继承了该类
强转是若不符合如上条件,则发生 ClassCastException 类型转换异常
何时需要强转:若想访问的属性/行为在超类中没有,则需要强转
建议:在强转之前通过 instanceof关键字 判断引用指向的对象是否是该类型
引用类型数组
数组元素引用类型的数组,即为引用类型数组
补充
高质量代码
复用
扩展
维护
移植
健壮
可读
性能
面向过程:
以方法为单位来解决问题,比较合适简单的业务(大象装冰箱、银行取钱)
面向对象:
以对象为单位来解决问题,比较合适复杂的业务(造汽车,造航母)
OO: (Object Oriented)面向对象
OOA: (Object Oriented Analysis)面向对象分析
OOD: (Object Oriented Design)面向对象设计
OOAD:面向对象分析与设计
OOP: (Object Oriented programming)面向对象编程
默认值规则:
byte、short、int、long、char -> 0
float、double -> 0.0
boolean -> false
引用类型 -> null
内存管理:
由JVM来管理
堆: new出来的对象(包括实例(成员)变量、数组的元素、方法的地址)
栈: 局部变量(包括方法的参数)
方法区: .class字节码文件(包括所有方法、静态变量)
泛化
- 泛化:从程序设计角度而言叫泛化,从代码实现角度而言叫继承,泛化就是继承
- 继承要符合is(是)的关系
- 继承的是父类的成员变量和普通方法,不包括构造方法,父类的构造方法是被子类通过super()来调用的
内部类
特点
内部类中可以直接访问外部类的成员
内部类中有个隐式的引用指向了创建它的外部类对象 外部类名.this
成员内部类
- 类中套类,外面的称为外部类,里面的称为内部类
- 内部类通常只服务于外部类,对外不具备可见性
- 内部类对象通常在外部类中创建
- 内部类可以直接访问外部类的成员,在内部类中有个隐式的引用指向创建它的外部类对象。隐式的引用:外部类名.this
- 何时用:若A类(Baby)只让B类(Mama)用,并且A类(Baby)还想访问B类(Mama)的成员时,可以设计成员内部类
匿名内部类
- 若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以简化代码
- 注意:匿名内部类中不能修改外面局部变量的值
- 内部类有独立的class吗? 有
package
用于声明包
作用:避免类的命名冲突
规则:同包中的类不能同名,但不同包的类可以同名
类的全称:包名.类名
建议:包名常常有层次结构,所有字母都小写
import
用于导入类
同包中的类可以直接访问,但不同包中的类不能直接访问,
若想访问:
先import导入类,再访问类
或者类的全称,但不建议过于麻烦
封装
访问控制修饰符
作用:保护数据的安全(隐藏数据、暴露行为)
设计:数据(成员变量)私有化 private
行为(方法)大部分公开化 public
public 公开、任何类
private 私有的,本类
protected 受保护的,本类,子类、同包类
默认的:什么也不写,本类、同包类(Java不建议)
访问权限由低到高依次为:
private < 默认的 < protected < public
-
类的访问权限只能是public或默认的类中成员的访问权限如上四种都可以
-
成员内部类充当成员不是类
由static 修饰的成员变量即为静态变量
成员变量分两种:
1、 实例变量:没有static修饰,属于对象,存储在堆中,有几个对象就有几份由对象/引用访问
2、静态变量:有static修饰,属于类,存储在方法区中,只有一份由类名访问
静态
静态变量
- 由static修饰的成员变量
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
- 何时用:对象所共享的数据
静态块
- 由static修饰的语句块
- 属于类,在类被加载期间自动执行,因类只被加载一次
所以静态块也只执行一次 - 何时用:初始化/加载静态资源/静态变量
静态方法
- 由static修饰的方法
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
静态方法中没有隐式this传递, - 所以静态方法中不能直接访问实例成员(实例变量/实例方法)
- 何时用:方法的操作与对象无关(不需要访问对象的属性/行为)
由static和final共同修饰的成员变量,即为常量
常量名所有字母都大写,多个单词之间用分隔
NAME
CLASS_NAME
常常通过类名来访问,不能被改变
常量
- 必须声明相同初始化;
- 常常通过类名点来访问,不能被改变
- 建议:常量名
枚举
是一种引用数据类型
枚举类型的对象数目是固定的,常常用于定义一组常量
例如:季节、星期、月份、订单状态等
枚举的构造方法都是私有的
枚举的第一行默认都是罗列枚举对象名称
更多推荐
OOP面向对象编程
发布评论