第20.1篇Java面向对象易混淆概念对比集2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第20篇Java初始化、构造器、对象创建的过程 |➡️ 下一篇第21篇Java Object类️ 本文阅读地图2 分钟速览面向对象是 Java 的核心也是面试的“深水区”。本文汇总 14 组面向对象高频易混淆概念每组配一句话总结 详细对比 代码示例编号对比组一句话区分1重载 vs 重写重载同类异参编译绑定重写子类复写运行绑定2抽象类 vs 接口抽象类有状态接口只能有常量Java 8 可有 default3封装 vs 继承 vs 多态隐藏实现、复用代码、统一调用4组合 vs 继承组合是“有一个”继承是“是一个”5finalvsfinallyvsfinalize关键字 vs 异常块 vs 已废弃的垃圾回收方法6staticvs 实例成员属于类 vs 属于对象7thisvssuper本类引用 vs 父类引用8四种权限修饰符private default protected public9值传递 vs 引用传递传副本 vs 传地址引用10构造方法 vs 普通方法创建对象调用 vs 普通调用11检查型异常 vs 运行时异常 vs Error必须处理 vs 可改代码 vs JVM 内部错误12抽象方法 vs 普通方法无方法体 vs 有方法体13类变量 vs 实例变量共享一份 vs 各自独立14equals()vshashCode()比较内容 vs 计算哈希值必须一起重写文章目录第20.1篇Java面向对象易混淆概念对比集2026版️ 本文阅读地图2 分钟速览一、核心知识点概览二、逐组对比详解对比1重载Overload vs 重写Override对比2抽象类 vs 接口Java 8对比3封装 vs 继承 vs 多态对比4组合 vs 继承对比5final vs finally vs finalize对比6static vs 实例成员对比7this vs super对比8四种权限修饰符对比9值传递 vs 引用传递对比10构造方法 vs 普通方法对比11检查型异常 vs 运行时异常 vs Error对比12抽象方法 vs 普通方法对比13类变量 vs 实例变量对比14equals() vs hashCode()三、避坑要点四、练习题 你的学习进度 下一篇文章预告一、核心知识点概览本篇文章涵盖 Java 面向对象中 14 组最高频的易混淆概念来源于第5~20篇的全部内容篇号涉及对比数量第5篇前置基本类型 vs 引用类型已在第4.1篇覆盖—第7篇面向对象三大特征、面向过程 vs 面向对象1组第12篇类 vs 对象、抽象类 vs 普通类、构造方法 vs 普通方法2组第13篇staticvs 实例成员、finalvsfinallyvsfinalize、堆 vs 栈3组第14篇final修饰类/方法/变量区别1组第16篇Lombok 原理扩展—第18篇抽象类 vs 接口1组第19篇接口的作用扩展—第20篇初始化顺序父 vs 子—第21篇equals()vshashCode()1组背诵建议面向对象是面试必考内容这 14 组对比建议全部背下来面试时张口就来。二、逐组对比详解对比1重载Overload vs 重写Override对比维度方法重载Overload方法重写Override定义同类中多个方法名相同参数列表不同子类重新实现父类的非私有、非final方法发生范围同一类内继承关系的子类与父类之间参数列表必须不同个数/类型/顺序必须完全相同返回值类型无关可以相同也可以不同必须相同或是其子类协变返回访问修饰符无限制子类方法的访问权限≥父类不能更严格异常无限制子类抛出的异常≤父类更少或更小静态方法✅ 可以重载❌ 不能重写只能隐藏绑定时机编译期多态静态绑定运行期多态动态绑定注解标记无专用注解推荐使用Override口诀同类异参是重载子类复写是重写编译绑定看参数运行绑定看对象。对比2抽象类 vs 接口Java 8对比维度抽象类Abstract Class接口Interface构造方法✅ 可以有❌ 不能有成员变量可以是任意类型只能是public static final常量非抽象方法✅ 可以有具体方法Java 8 通过default/static提供访问修饰符任意方法默认publicJava 9 允许 private 方法多继承❌ 单继承✅ 可多实现设计理念is-a关系是什么can-do关系能做什么代码示例// 抽象类abstractclassAnimal{protectedStringname;publicAnimal(Stringname){this.namename;}publicabstractvoidmakeSound();// 抽象方法publicvoideat(){System.out.println(name吃东西);}// 普通方法}// 接口interfaceFlyable{voidfly();// 抽象方法defaultvoidtakeOff(){System.out.println(起飞);}// 默认方法}// 多实现classBirdextendsAnimalimplementsFlyable{publicBird(Stringname){super(name);}OverridepublicvoidmakeSound(){System.out.println(name叽叽);}Overridepublicvoidfly(){System.out.println(name飞);}}对比3封装 vs 继承 vs 多态对比维度封装继承多态核心目的隐藏实现细节复用代码统一调用接口实现方式private getter/setterextends关键字父类引用指向子类对象 方法重写好处安全、易维护减少冗余扩展性强、灵活典型场景实体类POJO代码复用接口统一调用、框架设计口诀藏实现、复代码、父指子。对比4组合 vs 继承对比维度组合Composition继承Inheritance关系has-a有一个is-a是一个耦合度低松耦合高紧耦合复用方式通过引用其他对象通过继承父类灵活性高可动态替换低继承关系固定设计原则优先使用组合谨慎使用“组合优于继承”代码示例// 继承Car is-a VehicleclassCarextendsVehicle{}// 组合Car has-a EngineclassCar{privateEngineengine;// 组合publicCar(){this.enginenewEngine();}}对比5finalvsfinallyvsfinalize对比维度finalfinallyfinalize()类型关键字关键字异常处理块Object 方法作用限制类/方法/变量确保代码无论是否抛异常都会执行GC 前调用已弃用典型用法final class、final void method()、final int MAX10try-catch-finallyOverride protected void finalize()推荐✅ 日常使用✅ 日常使用❌已弃用Java 9 一句话总结final是限制finally是保障finalize是古董已弃用。对比6staticvs 实例成员对比维度静态成员static实例成员非 static归属属于类类变量/类方法属于对象实例变量/实例方法存储位置方法区JDK 8 元空间堆随对象共享性所有实例共享一份每个实例独立拥有访问方式类名直接调用如Math.sqrt()对象调用如person.getName()是否可用this❌ 不可用✅ 可用生命周期类加载时初始化对象创建时初始化 一句话总结static 是“公共的”实例成员是“私有的”——所有对象共享 static各自拥有实例变量。对比7thisvssuper对比维度thissuper指向当前对象的引用父类对象的引用用途1区分成员变量和局部变量访问父类成员变量用途2调用本类的其他构造方法this(参数)调用父类构造方法super(参数)用途3返回当前对象return this访问父类被重写的方法位置限制this(参数)必须在构造方法第一行super(参数)必须在构造方法第一行代码示例classParent{privateStringname;publicParent(Stringname){this.namename;}publicvoidshow(){System.out.println(Parent:name);}}classChildextendsParent{publicChild(Stringname){super(name);// 调用父类构造方法}Overridepublicvoidshow(){super.show();// 调用父类方法System.out.println(Child);}}对比8四种权限修饰符修饰符本类内部同包其他类不同包子类任意位置private✅❌❌❌默认无修饰符✅✅❌❌protected✅✅✅❌public✅✅✅✅口诀私有本类包默认受保子类外仅公。对比9值传递 vs 引用传递对比维度值传递基本类型引用传递引用类型传递内容传递值的副本传递引用的副本地址形参改变是否影响实参❌不影响两个独立变量✅影响指向同一对象典型示例void method(int a)void method(Person p)一句话改的是副本改的是对象本身代码示例// 值传递intx10;voidchange(inta){a20;}change(x);System.out.println(x);// 10不变// 引用传递PersonpnewPerson(张三);voidchangeName(Personp){p.setName(李四);}changeName(p);System.out.println(p.getName());// 李四变了对比10构造方法 vs 普通方法对比维度构造方法普通方法方法名必须与类名完全相同任意合法标识符返回值❌无返回值连 void 都不写有返回值或 void调用时机对象创建时自动调用new对象创建后手动调用调用次数一个对象只调用一次可多次调用能否被继承/重写❌ 不能继承/重写✅ 可重写能否重载✅ 可以重载多个构造方法✅ 可以重载对比11检查型异常 vs 运行时异常 vs Error对比维度检查型异常运行时异常Error编译期检查✅强制处理try-catch 或 throws❌ 不强制处理❌ 不强制处理代表IOException、SQLExceptionNullPointerException、IndexOutOfBoundsExceptionOutOfMemoryError、StackOverflowError根本原因外部环境问题程序逻辑错误JVM 内部严重问题处理方式try-catch 或 throws修复代码不靠 catch无法处理是否可恢复通常可重试/恢复不可恢复改代码不可恢复 一句话总结检查型异常是“外部问题必须处理”运行时异常是“代码写错了”Error 是“JVM 出大事了”。对比12抽象方法 vs 普通方法对比维度抽象方法普通方法修饰符abstract无abstract方法体❌没有方法体只有声明✅有方法体所在类必须在抽象类中可在普通类或抽象类中子类实现必须实现否则子类也得是抽象类可重写可不重写能否 private❌ 不能 private✅ 可以 private对比13类变量 vs 实例变量对比维度类变量静态变量实例变量修饰符static无static归属属于类属于实例共享性所有实例共享一份每个实例独立拥有存储位置方法区元空间堆访问方式类名.变量名对象.变量名生命周期类加载 → 类卸载对象创建 → 对象销毁对比14equals()vshashCode()对比维度equals()hashCode()作用判断两个对象内容是否相等返回对象的哈希值用于哈希表默认实现比较内存地址返回内存地址转换的 int重写必要性需要比较内容时必须重写重写equals()必须同时重写 hashCode()契约equals 相等 → hashCode必相等hashCode 相等 → equals不一定相等三、避坑要点错误/误区后果正确做法重写方法不加Override可能写成重载意外不执行始终加Override重写equals()不重写hashCode()HashMap/HashSet 无法正常工作同时重写两者重写equals()参数写成具体类这是重载不是重写参数必须是Object obj构造方法中调用可重写的方法子类未初始化可能空指针构造方法只调 private/final 方法静态方法试图用this编译错误静态方法中不能使用this组合 vs 继承选错紧耦合难以维护优先用组合四、练习题代码题以下代码输出什么为什么classA{voidprint(){System.out.print(A);}}classBextendsA{voidprint(){System.out.print(B);}}publicclassTest{publicstaticvoidmain(String[]args){AanewB();a.print();}}改错题下面的代码有什么问题如何修复classUser{privateintid;publicbooleanequals(Useru){returnthis.idu.id;}}对比题抽象类和接口的区别至少列出 5 点。 你的学习进度当前第20.1篇 ·基础篇外挂面向对象易混淆概念对比集✅ 已完成基础篇第1~20篇 第4.1篇 第20.1篇 正在学第20.1篇⏳ 待学习第21~44篇主体 更多外挂篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第21篇Java Object类》内容简介toString、equals、hashCode的正确重写规范equals与hashCode的契约。《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送
《Java 100 天进阶之路》第20.1篇:Java面向对象易混淆概念对比集(2026版)
发布时间:2026/7/16 17:27:41
第20.1篇Java面向对象易混淆概念对比集2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第20篇Java初始化、构造器、对象创建的过程 |➡️ 下一篇第21篇Java Object类️ 本文阅读地图2 分钟速览面向对象是 Java 的核心也是面试的“深水区”。本文汇总 14 组面向对象高频易混淆概念每组配一句话总结 详细对比 代码示例编号对比组一句话区分1重载 vs 重写重载同类异参编译绑定重写子类复写运行绑定2抽象类 vs 接口抽象类有状态接口只能有常量Java 8 可有 default3封装 vs 继承 vs 多态隐藏实现、复用代码、统一调用4组合 vs 继承组合是“有一个”继承是“是一个”5finalvsfinallyvsfinalize关键字 vs 异常块 vs 已废弃的垃圾回收方法6staticvs 实例成员属于类 vs 属于对象7thisvssuper本类引用 vs 父类引用8四种权限修饰符private default protected public9值传递 vs 引用传递传副本 vs 传地址引用10构造方法 vs 普通方法创建对象调用 vs 普通调用11检查型异常 vs 运行时异常 vs Error必须处理 vs 可改代码 vs JVM 内部错误12抽象方法 vs 普通方法无方法体 vs 有方法体13类变量 vs 实例变量共享一份 vs 各自独立14equals()vshashCode()比较内容 vs 计算哈希值必须一起重写文章目录第20.1篇Java面向对象易混淆概念对比集2026版️ 本文阅读地图2 分钟速览一、核心知识点概览二、逐组对比详解对比1重载Overload vs 重写Override对比2抽象类 vs 接口Java 8对比3封装 vs 继承 vs 多态对比4组合 vs 继承对比5final vs finally vs finalize对比6static vs 实例成员对比7this vs super对比8四种权限修饰符对比9值传递 vs 引用传递对比10构造方法 vs 普通方法对比11检查型异常 vs 运行时异常 vs Error对比12抽象方法 vs 普通方法对比13类变量 vs 实例变量对比14equals() vs hashCode()三、避坑要点四、练习题 你的学习进度 下一篇文章预告一、核心知识点概览本篇文章涵盖 Java 面向对象中 14 组最高频的易混淆概念来源于第5~20篇的全部内容篇号涉及对比数量第5篇前置基本类型 vs 引用类型已在第4.1篇覆盖—第7篇面向对象三大特征、面向过程 vs 面向对象1组第12篇类 vs 对象、抽象类 vs 普通类、构造方法 vs 普通方法2组第13篇staticvs 实例成员、finalvsfinallyvsfinalize、堆 vs 栈3组第14篇final修饰类/方法/变量区别1组第16篇Lombok 原理扩展—第18篇抽象类 vs 接口1组第19篇接口的作用扩展—第20篇初始化顺序父 vs 子—第21篇equals()vshashCode()1组背诵建议面向对象是面试必考内容这 14 组对比建议全部背下来面试时张口就来。二、逐组对比详解对比1重载Overload vs 重写Override对比维度方法重载Overload方法重写Override定义同类中多个方法名相同参数列表不同子类重新实现父类的非私有、非final方法发生范围同一类内继承关系的子类与父类之间参数列表必须不同个数/类型/顺序必须完全相同返回值类型无关可以相同也可以不同必须相同或是其子类协变返回访问修饰符无限制子类方法的访问权限≥父类不能更严格异常无限制子类抛出的异常≤父类更少或更小静态方法✅ 可以重载❌ 不能重写只能隐藏绑定时机编译期多态静态绑定运行期多态动态绑定注解标记无专用注解推荐使用Override口诀同类异参是重载子类复写是重写编译绑定看参数运行绑定看对象。对比2抽象类 vs 接口Java 8对比维度抽象类Abstract Class接口Interface构造方法✅ 可以有❌ 不能有成员变量可以是任意类型只能是public static final常量非抽象方法✅ 可以有具体方法Java 8 通过default/static提供访问修饰符任意方法默认publicJava 9 允许 private 方法多继承❌ 单继承✅ 可多实现设计理念is-a关系是什么can-do关系能做什么代码示例// 抽象类abstractclassAnimal{protectedStringname;publicAnimal(Stringname){this.namename;}publicabstractvoidmakeSound();// 抽象方法publicvoideat(){System.out.println(name吃东西);}// 普通方法}// 接口interfaceFlyable{voidfly();// 抽象方法defaultvoidtakeOff(){System.out.println(起飞);}// 默认方法}// 多实现classBirdextendsAnimalimplementsFlyable{publicBird(Stringname){super(name);}OverridepublicvoidmakeSound(){System.out.println(name叽叽);}Overridepublicvoidfly(){System.out.println(name飞);}}对比3封装 vs 继承 vs 多态对比维度封装继承多态核心目的隐藏实现细节复用代码统一调用接口实现方式private getter/setterextends关键字父类引用指向子类对象 方法重写好处安全、易维护减少冗余扩展性强、灵活典型场景实体类POJO代码复用接口统一调用、框架设计口诀藏实现、复代码、父指子。对比4组合 vs 继承对比维度组合Composition继承Inheritance关系has-a有一个is-a是一个耦合度低松耦合高紧耦合复用方式通过引用其他对象通过继承父类灵活性高可动态替换低继承关系固定设计原则优先使用组合谨慎使用“组合优于继承”代码示例// 继承Car is-a VehicleclassCarextendsVehicle{}// 组合Car has-a EngineclassCar{privateEngineengine;// 组合publicCar(){this.enginenewEngine();}}对比5finalvsfinallyvsfinalize对比维度finalfinallyfinalize()类型关键字关键字异常处理块Object 方法作用限制类/方法/变量确保代码无论是否抛异常都会执行GC 前调用已弃用典型用法final class、final void method()、final int MAX10try-catch-finallyOverride protected void finalize()推荐✅ 日常使用✅ 日常使用❌已弃用Java 9 一句话总结final是限制finally是保障finalize是古董已弃用。对比6staticvs 实例成员对比维度静态成员static实例成员非 static归属属于类类变量/类方法属于对象实例变量/实例方法存储位置方法区JDK 8 元空间堆随对象共享性所有实例共享一份每个实例独立拥有访问方式类名直接调用如Math.sqrt()对象调用如person.getName()是否可用this❌ 不可用✅ 可用生命周期类加载时初始化对象创建时初始化 一句话总结static 是“公共的”实例成员是“私有的”——所有对象共享 static各自拥有实例变量。对比7thisvssuper对比维度thissuper指向当前对象的引用父类对象的引用用途1区分成员变量和局部变量访问父类成员变量用途2调用本类的其他构造方法this(参数)调用父类构造方法super(参数)用途3返回当前对象return this访问父类被重写的方法位置限制this(参数)必须在构造方法第一行super(参数)必须在构造方法第一行代码示例classParent{privateStringname;publicParent(Stringname){this.namename;}publicvoidshow(){System.out.println(Parent:name);}}classChildextendsParent{publicChild(Stringname){super(name);// 调用父类构造方法}Overridepublicvoidshow(){super.show();// 调用父类方法System.out.println(Child);}}对比8四种权限修饰符修饰符本类内部同包其他类不同包子类任意位置private✅❌❌❌默认无修饰符✅✅❌❌protected✅✅✅❌public✅✅✅✅口诀私有本类包默认受保子类外仅公。对比9值传递 vs 引用传递对比维度值传递基本类型引用传递引用类型传递内容传递值的副本传递引用的副本地址形参改变是否影响实参❌不影响两个独立变量✅影响指向同一对象典型示例void method(int a)void method(Person p)一句话改的是副本改的是对象本身代码示例// 值传递intx10;voidchange(inta){a20;}change(x);System.out.println(x);// 10不变// 引用传递PersonpnewPerson(张三);voidchangeName(Personp){p.setName(李四);}changeName(p);System.out.println(p.getName());// 李四变了对比10构造方法 vs 普通方法对比维度构造方法普通方法方法名必须与类名完全相同任意合法标识符返回值❌无返回值连 void 都不写有返回值或 void调用时机对象创建时自动调用new对象创建后手动调用调用次数一个对象只调用一次可多次调用能否被继承/重写❌ 不能继承/重写✅ 可重写能否重载✅ 可以重载多个构造方法✅ 可以重载对比11检查型异常 vs 运行时异常 vs Error对比维度检查型异常运行时异常Error编译期检查✅强制处理try-catch 或 throws❌ 不强制处理❌ 不强制处理代表IOException、SQLExceptionNullPointerException、IndexOutOfBoundsExceptionOutOfMemoryError、StackOverflowError根本原因外部环境问题程序逻辑错误JVM 内部严重问题处理方式try-catch 或 throws修复代码不靠 catch无法处理是否可恢复通常可重试/恢复不可恢复改代码不可恢复 一句话总结检查型异常是“外部问题必须处理”运行时异常是“代码写错了”Error 是“JVM 出大事了”。对比12抽象方法 vs 普通方法对比维度抽象方法普通方法修饰符abstract无abstract方法体❌没有方法体只有声明✅有方法体所在类必须在抽象类中可在普通类或抽象类中子类实现必须实现否则子类也得是抽象类可重写可不重写能否 private❌ 不能 private✅ 可以 private对比13类变量 vs 实例变量对比维度类变量静态变量实例变量修饰符static无static归属属于类属于实例共享性所有实例共享一份每个实例独立拥有存储位置方法区元空间堆访问方式类名.变量名对象.变量名生命周期类加载 → 类卸载对象创建 → 对象销毁对比14equals()vshashCode()对比维度equals()hashCode()作用判断两个对象内容是否相等返回对象的哈希值用于哈希表默认实现比较内存地址返回内存地址转换的 int重写必要性需要比较内容时必须重写重写equals()必须同时重写 hashCode()契约equals 相等 → hashCode必相等hashCode 相等 → equals不一定相等三、避坑要点错误/误区后果正确做法重写方法不加Override可能写成重载意外不执行始终加Override重写equals()不重写hashCode()HashMap/HashSet 无法正常工作同时重写两者重写equals()参数写成具体类这是重载不是重写参数必须是Object obj构造方法中调用可重写的方法子类未初始化可能空指针构造方法只调 private/final 方法静态方法试图用this编译错误静态方法中不能使用this组合 vs 继承选错紧耦合难以维护优先用组合四、练习题代码题以下代码输出什么为什么classA{voidprint(){System.out.print(A);}}classBextendsA{voidprint(){System.out.print(B);}}publicclassTest{publicstaticvoidmain(String[]args){AanewB();a.print();}}改错题下面的代码有什么问题如何修复classUser{privateintid;publicbooleanequals(Useru){returnthis.idu.id;}}对比题抽象类和接口的区别至少列出 5 点。 你的学习进度当前第20.1篇 ·基础篇外挂面向对象易混淆概念对比集✅ 已完成基础篇第1~20篇 第4.1篇 第20.1篇 正在学第20.1篇⏳ 待学习第21~44篇主体 更多外挂篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第21篇Java Object类》内容简介toString、equals、hashCode的正确重写规范equals与hashCode的契约。《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送