Java 面向对象知识整理(二)
·
Java 面向对象核心知识总结
一、final 关键字
1. final 修饰类
被 final 修饰的类不能被继承。
适用场景:
- 工具类
- 安全类
2. final 修饰方法
被 final 修饰的方法不能被子类重写。
3. final 修饰变量
特点:
有且仅能赋值一次
final int age = 18;
赋值后不能再次修改。
4. 变量分类
成员变量
静态成员变量(类变量)
public static String school;
实例成员变量
private String name;
局部变量
定义在方法中的变量:
public void test() {
int a = 10;
}
5. 常量
final 修饰静态变量就是常量。
命名规范:
- 全部大写
- 单词之间使用下划线分隔
public static final String SCHOOL_NAME = "gaga";
适用于:
- 系统配置
- 固定参数
- 全局常量
6. final 修饰引用类型
final ArrayList<String> list = new ArrayList<>();
特点:
地址不能改变
list = new ArrayList<>(); // 报错
地址指向的内容可以改变
list.add("Java");
总结:
对象地址不可变
对象内容可变
7. final 的性能
public static final String SCHOOL_NAME = "gaga";
编译时会进行宏替换:
System.out.println("gaga");
因此:
- 不会降低性能
- 反而可能提高性能
二、单例设计模式
1. 什么是单例
一个类只能创建一个对象。
2. 实现步骤
第一步:私有化构造器
private Singleton() {
}
第二步:定义静态变量保存对象
private static Singleton instance;
第三步:提供静态方法返回对象
public static Singleton getInstance() {
return instance;
}
3. 饿汉单例
特点:
类加载时立即创建对象
优点:
- 线程安全
- 实现简单
缺点:
- 可能浪费资源
4. 懒汉单例
特点:
第一次使用时才创建对象
优点:
- 节省资源
缺点:
- 实现复杂
- 需要考虑线程安全
三、设计模式
设计模式:
解决某类问题的最佳实践方案
常见设计模式:
- 单例模式
- 工厂模式
- 代理模式
- 观察者模式
四、枚举类(Enum)
作用
用于表示固定的信息分类和状态标志。
例如:
public enum Sex {
BOY,
GIRL
}
适用于:
- 性别
- 订单状态
- 支付状态
- 权限等级
五、抽象类(Abstract)
1. 什么是抽象类
被 abstract 修饰的类。
public abstract class Animal {
}
2. 抽象方法
没有方法体的方法。
public abstract void run();
3. 特点
不能创建对象
Animal a = new Animal(); // 报错
必须被继承
class Dog extends Animal {
}
子类必须实现所有抽象方法
@Override
public void run() {
}
否则子类也必须声明为抽象类。
4. 作用
- 支持多态
- 实现模板设计模式
- 提高代码复用性
六、接口(Interface)
1. 接口中可以定义什么
常量
String SCHOOL_NAME = "gaga";
默认:
public static final
抽象方法
void run();
默认:
public abstract
JDK8 新增
default 方法
default void show() {
}
static 方法
static void test() {
}
JDK9 新增
private 方法
private void method() {
}
2. 接口实现
public class Student implements Driver {
}
必须实现全部抽象方法。
七、接口的优点
1. 弥补单继承缺陷
类只能继承一个父类:
class Student extends Person
但可以实现多个接口:
class Student extends Person
implements Driver, Teacher {
}
使角色更多、功能更强大。
2. 解耦合(核心作用)
面向接口编程:
Driver d = new Car();
如果后续需要替换:
Driver d = new Bus();
无需修改调用方代码。
八、接口注意事项
1. 一个接口可以继承多个接口
interface C extends A, B {
}
2. 父类和接口存在同名默认方法
优先使用父类方法。
3. 多个接口存在同名默认方法
实现类必须重写该方法。
@Override
public void show() {
}
九、抽象类与接口对比
相同点
1. 都属于抽象形式
- 都可以定义抽象方法
- 都不能直接创建对象
2. 都需要子类实现
- 抽象类:继承(extends)
- 接口:实现(implements)
3. 都必须实现抽象方法
否则:
- 子类声明为抽象类
- 或编译报错
4. 都支持多态
Animal a = new Dog();
Driver d = new Car();
5. 都能实现解耦合
不同点
| 对比项 | 抽象类 | 接口 |
|---|---|---|
| 成员 | 可以定义所有成员 | 主要定义规范 |
| 继承方式 | 单继承 | 多实现 |
| 代码复用 | 强 | 弱 |
| 扩展能力 | 一般 | 强 |
| 解耦能力 | 一般 | 强 |
| 最佳场景 | 模板设计 | 功能规范 |
十、最佳实践
抽象类
适合:
- 存在公共代码
- 父子关系明显
例如:
- 动物
- 员工
- 车辆
核心思想:
模板思想、代码复用
接口
适合:
- 定义功能规范
- 实现解耦
- 提高扩展性
例如:
- 支付功能
- 登录功能
- 打印功能
- 驾驶功能
核心思想:
面向接口编程,实现解耦合
面试总结
final
类不能继承
方法不能重写
变量只能赋值一次
单例
一个类只能创建一个对象
抽象类
强调是什么(模板)
提高代码复用
接口
强调能做什么(规范)
提高扩展性
实现解耦
更多推荐


所有评论(0)