Java 面向对象 思维导图
中心主题:Java 面向对象编程
核心三大特性
-
1 封装

- 定义:将数据(属性)和操作数据的方法(行为)捆绑到一个单元中(即类),并对外部隐藏对象的内部实现细节。
- 目的:
- 隐藏实现细节:使用者只需知道如何通过公共接口与对象交互,无需关心内部复杂逻辑。
- 提高安全性:防止外部代码随意修改对象内部状态,保证数据的有效性和完整性。
- 降低耦合度:模块之间通过稳定的接口通信,内部实现可以独立修改而不影响其他模块。
- 实现方式:
- 访问修饰符:使用
private将成员变量(属性)设为私有,使其只能在类内部访问。 - 公共方法:提供
public的getter(获取方法)和setter(设置方法)作为与私有成员变量交互的公共接口。getter:用于读取私有属性的值。setter:用于修改私有属性的值,并在方法内部加入数据校验逻辑,确保赋值的有效性。
- 访问修饰符:使用
-
2 继承
- 定义:允许一个类(子类/派生类)继承另一个类(父类/超类)的属性和方法,这是一种“is-a”(是一个)的关系。
- 目的:
- 代码复用:子类可以复用父类的代码,避免重复编写。
- 建立类层次结构:形成清晰的逻辑关系,便于管理和扩展。
- 关键字:
extends - 特点:
- 单继承:Java 中一个类只能有一个直接父类(但可以通过接口实现多重继承的效果)。
- 传递性:C 继承 B,B 继承 A,C 也拥有 A 的所有非私有成员。
- 方法重写:
- 子类可以提供一个与父类方法具有相同方法签名(方法名、参数列表)的实现。
- 目的是为了实现子类特有的行为,覆盖掉父类的默认行为。
- 需要
@Override注解来标记,增强代码可读性,并让编译器检查是否满足重写规则。
-
3 多态
- 定义:指同一个接口,使用不同的实例而执行不同操作的能力,核心思想是“同一操作,作用于不同的对象,产生不同的执行结果”,这是一种“has-a”(有一个)或“can-do”(能做)的关系。
- 前提条件:
- 继承:必须有类之间的继承关系。
- 重写:子类必须重写父类的方法。
- 父类引用指向子类对象:
Parent p = new Child();这是多态最典型的写法。
- 优点:
- 灵活性和可扩展性:可以编写通用的代码,来处理不同类型的对象,降低代码的耦合度。
- 可替换性:允许子类对象替换父类对象,而不影响程序的正确性。
- 多态的体现:
- 方法重写:最常见的形式。
- 方法重载:在同一个类中,编译时多态。
关键概念
-
1 类
- 定义:创建对象的模板或蓝图,它定义了一组属性(成员变量)和方法(成员方法)。
- 组成:
- 成员变量
- 成员方法
- 构造器
- 示例:
class Dog { ... }
-
2 对象
- 定义:类的实例,是真实世界事物的具体实体,占用内存空间。
- 创建:使用
new关键字调用构造器来创建。 - 示例:
Dog myDog = new Dog();
-
3 抽象
- 定义:与封装紧密相关,指忽略与当前目标无关的细节,只关注与当前目标相关的核心特征,抽象是封装的逻辑基础。
- 实现方式:
- 抽象类:使用
abstract关键字修饰的类,可以包含抽象方法(只有声明,没有实现)和具体方法。 - 接口:一种特殊的抽象类型,它只包含方法的声明(Java 8+ 后可以有
default和static方法实现),没有成员变量(除了public static final常量)。
- 抽象类:使用
-
4 接口
- 定义:对行为的抽象,定义了一套规范,一个类可以实现一个或多个接口,表示该类具备接口所描述的行为。
- 关键字:
interface - 特点:
- 方法默认为
public abstract。 - 变量默认为
public static final。 - 支持多重实现:
class MyClass implements InterfaceA, InterfaceB { ... }。
- 方法默认为
- 作用:实现解耦,定义能力标准。
-
5 抽象类
- 定义:一种不能被实例化的类,通常作为父类,用于被继承。
- 关键字:
abstract - 特点:
- 可以包含抽象方法(无实现)和具体方法(有实现)。
- 可以包含构造器,供子类调用。
- 不能与
final、private、static一起修饰抽象方法(static可以,但很少用)。
- 与接口的区别:
| 特性 | 抽象类 | 接口 |
| :--- | :--- | :--- |
| 继承 | 单继承 | 多实现 |
| 成员变量 | 无特殊限制 | 默认
public static final| | 方法 | 可包含抽象方法和具体方法 | Java 7 前:只有抽象方法;Java 8+:可包含default和static方法 | | 构造器 | 有 | 无 | | 目的 | 代码复用,表达 "is-a" 关系 | 定义规范,表达 "can-do" 关系 |
高级特性
-
1 关键字
this- 定义:一个引用变量,指向当前对象。
- 用途:
- 区分成员变量和局部变量:
this.name = name; - 调用本类的构造器:
this()或this(args),必须在构造器第一行。 - 作为方法的参数传递:将当前对象传递给其他方法。
- 区分成员变量和局部变量:
-
2 关键字
super- 定义:一个引用变量,指向当前对象的父类对象。
- 用途:
- 调用父类的成员变量:
super.name; - 调用父类的成员方法:
super.parentMethod(); - 调用父类的构造器:
super(args);,必须在子类构造器的第一行。
- 调用父类的成员变量:
-
3 构造器
- 定义:用于创建和初始化对象的方法。
- 特点:
- 方法名与类名相同。
- 没有返回值类型(连
void都没有)。 - 在创建对象时由
new关键字自动调用。
- 重载:一个类可以有多个构造器,只要它们的参数列表不同(参数个数、类型或顺序不同)。
- 构造器链:子类构造器默认会调用父类的无参构造器(
super()),如果父类没有无参构造器,子类必须显式调用super(args)。
-
4 静态
- 定义:使用
static关键字修饰的成员(变量、方法、代码块、内部类)属于类本身,而不是类的某个实例。 - 特点:
- 类级别:所有实例共享一份静态成员。
- 无需创建对象即可访问:通过
ClassName.staticMember访问。 - 生命周期:随类的加载而加载,随类的卸载而卸载,生命周期比对象长。
- 用途:
- 静态变量:被所有对象共享的数据,如计数器。
- 静态方法:不依赖于任何对象实例的方法,通常用于工具类(如
Math类)。 - 静态代码块:在类加载时执行,且只执行一次,用于进行静态资源的初始化。
- 定义:使用
-
5 内部类
- 定义:定义在另一个类内部的类。
- 类型:
- 成员内部类:非
static,可以无条件访问外部类的所有成员。 - 静态内部类:
static,只能访问外部类的静态成员。 - 局部内部类:定义在方法或作用块内,作用域仅限于该方法或块内。
- 匿名内部类:没有类名的局部内部类,常用于实现接口或继承类的实例化,语法简洁。
- 成员内部类:非
访问修饰符
| 修饰符 | 同一类中 | 同一包中 | 不同包子类 | 不同包非子类 |
|---|---|---|---|---|
public |
✔️ | ✔️ | ✔️ | ✔️ |
protected |
✔️ | ✔️ | ✔️ | ❌ |
default (无修饰符) |
✔️ | ✔️ | ❌ | ❌ |
private |
✔️ | ❌ | ❌ | ❌ |
最佳实践
-
1 组合优于继承
- 原因:继承会破坏封装性,子类与父类高度耦合,父类的任何修改都可能影响子类,组合通过持有其他类的引用来实现功能,耦合度更低,更灵活。
- 何时用继承:当两个类之间确实存在 "is-a" 的强关系,并且子类是父类的一种特化时。
-
2 面向接口编程
- 思想:依赖于抽象(接口),而不是具体实现。
- 好处:降低模块间的耦合度,提高系统的可扩展性和可维护性,可以轻松地替换具体实现类,而无需修改调用方代码。
-
3 不可变对象
- 定义:对象一旦创建,其状态(属性)就不能被改变。
- 如何创建:
- 将类声明为
final,防止被继承。 - 将所有成员变量设为
private和final。 - 不提供
setter方法。 - 如果成员变量是可变对象,在 getter 方法中返回其防御性拷贝。
- 将类声明为
- 优点:线程安全、简单可靠,是构建复杂系统的基础。
