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

类不能继承
方法不能重写
变量只能赋值一次

单例

一个类只能创建一个对象

抽象类

强调是什么(模板)
提高代码复用

接口

强调能做什么(规范)
提高扩展性
实现解耦

更多推荐