Java面向对象笔记整理
基本概念
面向对象的三大特征:封装、继承、多态
面向对象:软件领域中的一种哲学思想,
OOA:面向对象分析,使用OO的思想分析需求
OOD:面向对象设计,使用OO 的思想设计程序结构
OOP:面向对象编程,使用OO 的思想开发代码
类与对象
类
类:一种数据类型,是对象的模板
寻找类
寻找类:从需求描述中发现名词,若改名词无法用已知类型描述,则新建类
语法
代码:
访问修饰符 class 类名{
//属性
//方法
//构造函数
}
访问修饰符
访问权限 | 类 | 包 | 子类 | 其他包 | 可修饰 |
---|---|---|---|---|---|
public | ∨ | ∨ | ∨ | ∨ | 类、属性、方法 |
protect | ∨ | ∨ | ∨ | × | 类、属性、方法 |
default | ∨ | ∨ | × | × | 类、属性、方法 |
private | ∨ | × | × | × | 属性、方法 |
类成员
类成员:属性 方法
在一个类中可以书写:属性、方法、构造函数
属性
- 属性:类型的特征,通常为名词,其数据会跟随对象产生,跟随对象消亡
- 寻找属性:A有B(A包含B),则A是类,B是A的属性
- Has a 关系
A和B是两个类 A拥有B 或A拥有多个B 该关系在代码中表现为 B是A的属性 或B的数组是A的属性 - 定义语法
访问修饰符 数据类型 属性名
- 封装
封装:狭义封装 将属性私有化,使用get和set方法访问
广义:将零散的数据组装成类,提供公开的访问入口,隐藏内部实现
属性必须私有
全部使用get和set方法使用(快捷方式)
只有在get和set方法中可以直接访问属性,其他位置必须使用get和set方法
方法
- 方法:是指一种动作,往往是动词,若A能B 或A可以则A是类 B是方法 方法的生命期比对象短 它有开始也有结束
- Use a 关系
A和B是两个类 当A实施某种行为时,会与B的对象产生交互 代码表现为A的方法中会有B的对象作为参数或返回类型 - 声明语法
访问修饰符 返回类型 函数名(参数列表){
函数体
}
- This关键词:表示当前对象(我)
当前对象 执行改代码的对象
This写在哪个类里面就是哪个类型
在方法中,若需要使用自身成员,使用this.成员名
构造函数
- 构造函数:在创建对象时运行的函数
当一个类没有书写构造函数时,会有默认构造函数(无参数) - 作用:构造函数通常给属性赋值
- 声明语法
访问修饰符 类名 (参数列表){
函数体
}
- 构造函数重载
一个类可以拥有多个构造函数,只要参数列表不同
对象
对象:
某一个类的数据,一个类的一个实体
创建对象
代码:
new 类名();
new 类名 (参数列表);
- 在创建对象时,会对属性进行初始化,给其赋值为类型默认值。
访问属性的语法
代码:
对象变量名.属性名
//表达式的类型为属性类型
调用方法的语法
对象变量名.方法(参数列表)
- 值类型和引用类型
- 所有的基本类型(8種)都是值类型,所有的类都是引用類型
- 值类型:存放的是具体的数据
- 引用类型:存放的是对象的地址
- == 比较的是变量中储存的内容是否相等
- 所有引用类型的默认值都是NULL,表示沒有地址
- NullpointerException:空指针错误,一个对象为NULL,但是在使用他的成员時引发该错误
- 函数调用复制的是引用参数的地址
继承
- Is a 关系:
继承:如果A和B都是类,B是A - 子类父类
如果B是A
A是B的父类
B是A的子类
A派生B
B继承与A
继承语法
代码:
Class B extends A{
}
- 类B中将继承A中的所有公共成员
- 当运行子类构造函数时,会先运行父类构造函数
Super关键词
表示父类
Super():调用父类构造函数
使用super可以使用父类方法
继承的特性
- 单根性:一个类有且仅有一个父类
- 传递性:若A是B的父类,B是C的父类 可以认为A是C的父类
Object
- Object: 是所有的类的父类
- HashCode:返回int,当前对象的内存地址计算出来的整数
- Equals(Object obj):返回boolean 比较当前对象和另一个对象是否相等 默认比较hashCode是否相等
- ToString:返回 String 将当前对象转换为字符串格式返回,默认的结果是 类型名全称@hashCode的16进制格式
重写
重写(override)子类可以重写实现父类的公共方法
多态
- 多态:将子类对象看作父类类型,一个子类对象可以赋值给父类类型的变量
在使用一个变量时,只需要关系其声明类型,不需要关心真实类型
例如:
A是B的父类
代码:
A a = new B();
a的声明类型 A
a的实际类型 B
- 当调用一个对象的方法的时,运行的是真实类型的方法
转型
向上转型原则 子类对象赋值给父类类型
里氏替换原则:向上自动转型向下转型,父类对象赋值给子类对象,必须强制转换
instanceof
instanceof关键字 用于语法判断
语法:
对象 instanceof 类型
读作 是不是 类型 返回值boolean
抽象
Abstract关键字
- 用于修饰类,表示该类是抽象类,不允许创建该类的对象
- 用于修饰方法,表示该方法是抽象方法,
- 抽象方法无方法体,子类必须实现抽象方法
- 抽象方法必须放置在抽象类中,抽象方法不能是private。
作用:父类中有一个方法,父类必须要写,但是不知道如何实现,子类必须重写该方法
Final关键字
- 用于修饰变量或者属性时,表示常量,不可以更改
- 用于修饰方法时,表示该方法不能被重写
- 用于修饰类时,表示该类不能被继承
接口
接口:是对行为的抽象
抽象类:对类型的抽象
定义语法:
代码:
访问修饰符 interface 接口名{
任意多个抽象方法
}
- 一个类可以实现任意多个接口,实现一个接口就必须实现接口中的所有方法
- 接口在使用上,可以当作父类,仍然满足多态原则
- 接口是不能创建对象的
静态
static关键字:
Static:静态的,可以用于修饰属性或者方法(类成员),其修饰的成员成为静态成员,不用该关键字修饰的成员,成为实例成员。
访问
静态成员的访问:类名.成员名
实例成员的访问:对象.成员名
场景
使用静态成员的场景:
* 某些属性希望被所有对象共享,该属性应被设置为静态
* 某个类没有属性全是方法,并且无继承关系,建议将方法设置为静态
属性初始化的顺序:
- 第一次使用该类型时,初始化其所有的静态属性
- 创建对象,运行构造函数之前,初始化其实例属性
- 创建一个对象时完整的执行顺序
初始化静态属性(一次)->执行静态初始化块(一次)->执行实例初始化块->构造函数
调用
在一个类中,若调用自身的静态成员,可以省略类名
直接调用自身成员时,
1.静态方法中不能使用实例成员
2.实例方法中可以使用静态成员
初始化块
静态初始化块
代码:
static{
}
实例初始化块
代码:
{
}
堆(heap)和栈(stack)
栈(stack)
Stack:一块内存,大小固定,用于存放变量和参数的数据,存取速度快
* 释放
当一个变量作用域结束后,立即释放其栈上面的空间
堆(heap)
Heap:一块内存,理论上空间无限,用于存放对象数据,存取速度慢
* 回收
无法通过栈中的地址找到的堆中的对象为垃圾对象,一定时间后,会被垃圾回收器(GC)回收
内部类
概念
在一个类里面再编写一个类
种类
- 静态内部类
- 成员内部类
- 局部内部类
- 匿名内部类