面对对象
面对对象
概念
面对
- 基本意:面对、朝向
- 引申义:注重、关注
对象
- 世间一切的事物
面对对象思想特点
- 是一种更符合人们思考习惯的思想
- 把复杂的事情简单化
- 把人们从执行者变成了指挥者
类的定义与使用
成员变量与局部变量的区别
定义位置
- 成员变量:类中,方法外
- 局部变量:方法中,或形参
初始化值
- 成员变量:有默认初始化值
- 局部变量:无默认初始化值,必须先赋值再使用
作用范围
- 成员变量:在类中
- 局部变量:在方法中
内存中的位置
- 成员变量:堆内存
- 局部变量:栈内存
生命周期
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法调用完毕而消失
注意事项
- 局部变量和成员变量重名时,采用就近原则
封装
封装好处
- 提高安全性
- 提高复用性
- 将复杂的事情简单化
体现封装
- 方法或类
- 安全性:不知道具体实现
- 复用性:可以反复使用
- 简单化:实现了很多功能,提高代码的维护性
private
- 特点:别修饰的成员只在本类中被访问
- 用法:
- private 数据类型 变量名
- private 返回值类型 方法名(参数列表){}
this
-
概念:引用本类对象
-
特点:每一个普通的方法都有一个this,谁调用该方法,this就只向谁
-
用法:
- this 属性名
- this 方法名(参数)
构造方法
要求
- 方法必须与类名相同
- 没有返回值
- 没有返回类型
注意事项
- 没提供构造方法,默认给出无参构造
- 提供构造方法,不默认给无参构造
- 构造方法可以重载
继承
基本概念
- 让类与类之间产生父子关系
- 让子类继承父类的非私有成员(成员变量,成员方法)
特点
- 单继承
- Java只支持类的单继承,但支持多层继承
- Java支持接口的多继承,语法为
- 接口A extends 接口B,接口C,接口D
- 私有成员不能继承
- 构造方法不能被继承
- 构造方法用于初始化本类对象
- 创建子类对象时,需要调用父类构造初始化
- 该对象的父类内容,若父类构造可以被继承,该操作会造成调用混乱
- 继承体现了“is a” 的关系
- 子类符合“is a(是一个)”父类的情况下,才使用继承,其他情况不建议使用
继承的好处
- 功能复用
- 便于扩展功能
- 结构清晰,简化认识
- 易维护性
继承的缺点
- 打破了封装性
- 高耦合性
ps:程序设计的追求:低耦合,高内聚
- 耦合:两个或多个模块相互依赖于对方
- 内聚:模块内部结构紧密,独立性强
子父类的成员变量调用
- this.变量名:调用本类对象
- super.变量名:调用父类对象
this
- 本质:对象
- 从本类之中开始找
super
- 本质:父类内存空间的标识
- 从父类之中开始找
继承中类成员的使用
- 创建子类对象时,优先父类构造方法
- 子类构造方法的第一行,隐含语句super(),用于调用父类默认的无参构造
- 因为默认有一个super()访问父,因此会优先访问父类的无参构造
方法重写
定义
- 子类中出现和父类方法定义相同的方法现象
要求
- 方法名,参数列表,返回值类型都相同
注意
- 父类的私有方法无法重写
- 子类方法访问权限不能小于父类方法
- 子类不能比父类方法抛出更大的异常
重载和重写的区别
重载
- 方法名:相同
- 参数列表:不同(个数或对应位置类型)
- 返回值类型:无关
- 修饰符:无关
- 定义位置:同一个类
重写
- 方法名:相同
- 参数列表:相同
- 返回值类型:相同
- 修饰符:访问权限不小于被重写方法
- 定义位置:子父类中
访问权限修饰符
- private:本类
- default(默认):本类,本包
- protected:本类,本包,子类
- public:本类,本包,子类,其他类
多态
概述
- 多种状态,同一对象在不同情况下表现出不同的状态或行为
要求
- 要有继承(或实现 )关系
- 要有方法重写
- 父类引用指向子类对象(is a 关系)
Ps:成员变量,遵循“编译看左,运行看左”
好处弊端
- 可维护性
- 可扩展性
- 父类不能使用子类特有成员
- 类型转型可以使用
- 向上转型(自动类型转换)
- 子类型转换成父类型
- Animal animal = new Dog()
- 向下转型(强制类型转换)
- 父类型转换成子类型
- Dog dog = (Dog)animal
- Ps:
- 只能在继承层次内进行转换
- 将父类对象转换成子类之前,使用instanceof进行检查
- 向上转型(自动类型转换)
- 类型转型可以使用
抽象类和抽象方法
抽象类概念
- 包含抽象方法的类,用abstract修饰
抽象方法概念
- 只有方法声明,没有方法体的方法,用abstract修饰
特点
- 必须用abstract修饰
- 不能被实例化
- 抽象类子类只有两种方法
- 重写父类所有抽象方法
- 定义成抽象类
抽象类的成员特点
成员变量
- 可以是普通的成员变量
- 也可以有成员常量
成员方法
- 可以有普通方法,也可以有抽象方法
- 抽象类不一定有抽象方法
- 有抽象方法的类一定时抽象类(或接口)
构造方法
- 有构造方法,可以重载
final关键字
- 作用
- 修饰类:该类不能被继承
- 修饰方法:不能被重写,不能与abstract共存
- 修饰变量:只能赋值一次
static关键字
- 作用
- 修饰类的成员
- 成员变量:类变量
- 特点
- 被本类所有对象共享
- 特点
- 成员方法:类方法/静态方法
- 没有对象this,所以不能访问非静态成员
- 成员变量:类变量
- 修饰类的成员
- 调用方式
- 类名.成员变量
- 类名.成员方法名(参数)
接口
定义
- interface 接口名{}
- 类和接口时实现关系,用implements表示
- class 类名 implements 接口
接口创建对象的特点
- 接口不能实例化
- 通过多态的方式实例化子类对象
- 接口的子类(实现类)
- 可以时抽象类,也可以是普通类
接口继承关系的特点
- 接口与接口之间的关系
- 继承关系,可以多继承
- 接口 extends 接口1,接口2~~
- 继承关系,可以多继承
继承和实现的区别
- 继承体现的是“is a”的关系,父类中定义共性内容
- 实现体现的是“like a”的关系,接口中定义扩展功能
接口成员变量的特点
-
接口没有成员变量,只有公有的、静态的常量
public static final 常量名 = 常量值
接口成员方法的特点
-
JDK7及以前,公有的、抽象方法:
public abstract 方法值类型 方法名();
-
JDK8以后,可以有默认方法和静态方法:
public default 方法值类型 方法名(){}
static 方法值类型 方法名() {}
-
JDK9以后,可以有私有方法
private 方法值类型 方法名(){}
接口构造方法的特点
- 构造方法
- 接口不能被实例化,也没有需要参数的成员,所以接口没有构造方法