Java 面向对象进阶:继承、多态、接口、内部类核心知识总结
·
一、前言
前面学习了 Java 基础类与对象、封装思想,本章开启面向对象高级特性,涵盖继承、super/this 关键字、类型转换、多态、抽象类、接口、Comparable 与 Comparator、内部类等核心内容,也是面试高频考点,把这些特性吃透才算真正掌握 Java 面向对象编程。
二、继承:代码复用的核心手段
1. 继承是什么
如果多个类存在大量重复属性、方法,不用复制粘贴重复代码,通过extends让子类自动拥有父类非私有成员,只扩展子类独有的逻辑,大幅减少冗余代码。 以书中 Person 类举例:
java
public class Person {
private String name;
private int age;
public void say() {
System.out.println(name+"can say");
}
public void setName(String name) {
this.name = name;
}
}
后续定义 Student、Manager 无需重复写 name、age、say 方法,直接class Student extends Person即可复用。
2. super 关键字
- 调用父类构造方法:子类构造第一行默认隐式
super(),调用父类无参构造;父类只有有参构造时,必须手动写super(参数)。 - 访问父类被重名覆盖的成员变量 / 方法:
super.属性、super.方法()。
3. this 关键字
- 区分局部变量与成员变量:局部变量和成员变量同名时,
this.变量代表当前对象的成员变量。 - 调用本类其他构造方法:
this(参数),必须放在构造方法第一行。 书中示例运行逻辑:
java
class Local {
public int i = 1; //成员变量
Local(int i) {
System.out.println("this.i = "+ this.i); //this.i指向成员变量1
System.out.println("i = "+i); //无this,取局部形参6
}
Local(){
this(6); //调用本类带参构造
}
}
输出:
plaintext
this.i =1
i =6
4. 继承中的类型转换
- 向上转型(隐式转换):子类转父类,自动转换,安全。
java
CA ca = new CB(); //CB extends CA,无需强转 - 向下转型(显式强制转换):父类转子类,必须强制转换,编译不会校验逻辑,运行时报
ClassCastException,建议配合instanceof判断类型再转换。
三、多态:一个接口,多种实现
1. 多态两大分类
- 编译多态(方法重载):同一个类中,方法名相同、参数列表不同,编译时根据参数匹配对应方法。比如绘图
draw(),传矩形、圆形参数执行不同逻辑。 - 运行多态(方法重写):子类重写父类方法,父类引用指向子类对象时,运行时执行子类重写后的方法。 书中员工、经理案例完美体现运行多态: 父类 NewEmployee 有 getSalary (),子类 NewManager 重写该方法叠加奖金,同样调用 getSalary (),普通员工只输出基础薪资,经理输出基础 + 奖金。
java
class NewManager extends NewEmployee{
private double bonus;
public double getSalary() {
double baseSalary = super.getSalary();
return baseSalary + bonus; //重写父类薪资方法
}
}
2. 多态核心前提
- 存在继承 / 实现关系
- 子类重写父类方法
- 父类引用指向子类对象
四、抽象类与接口:规范定义工具
1. 抽象类 abstract class
- 用
abstract修饰,不能 new 实例; - 可包含普通属性、普通方法、构造方法、抽象方法(无方法体);
- 子类必须重写全部抽象方法,否则子类也要声明为 abstract;
- 单继承:一个类只能 extends 一个抽象类。
2. 接口 interface
- 完全抽象规范,JDK8 前只能有常量、抽象方法;JDK8 新增 default 默认方法、static 静态方法;JDK9 支持私有方法;
- 不能实例化,无构造方法;
- 多实现:一个类可以
implements多个接口,弥补 Java 单继承缺陷; - 接口之间可多继承
extends。
3. Comparable 与 Comparator 排序接口
(1)Comparable(自然排序,内置排序规则)
接口定义:public interface Comparable<T>{int compareTo(T o);}
- 让实体类实现该接口,重写
compareTo定义默认比较规则; - 返回值规则:
this.compareTo(o) > 0:当前对象更大==0:两个对象相等<0:当前对象更小
- 数组直接使用
Arrays.sort()自动排序,书中矩形按面积排序案例就是典型用法。
(2)Comparator(比较器,外部临时排序)
无需修改实体类代码,单独创建比较器实现排序,适合临时更换排序规则,可创建多个不同比较规则。
五、内部类:依附外部类的嵌套类
内部类分为 4 类:成员内部类、局部内部类、静态内部类、匿名内部类。
1. 静态内部类 static class
- 归属外部类本身,不依赖外部类实例,直接
外部类.内部类创建对象:Outer3.Inner3 n = new Outer3.Inner3(); - 只能访问外部类静态成员,无法直接访问外部类普通成员。
2. 匿名内部类(无名称内部类)
适用场景:只使用一次、类逻辑简短、创建时立刻使用。 语法:new 父类/接口(){重写方法} 书中接口匿名实现案例:
java
interface Exam {
void print1();
}
public Exam test() {
//匿名内部类实现Exam接口
return new Exam() {
@Override
public void print1() {
System.out.println("Hello world!!");
}
};
}
常用于线程、事件回调,简化代码,不用单独创建.class 文件。
六、其他高级特性简记
- Lambda 表达式:简化单方法接口(函数式接口)的匿名内部类写法,代码极简;
- 泛型:<> 约束数据类型,避免类型强转、类型转换异常;
- 反射:运行时获取类、方法、属性信息,框架底层核心原理;
- 注解:@XXX,给代码附加元数据,用于编译校验、框架配置。
七、学习总结
- 继承解决代码复用,多态解决程序扩展,二者结合实现高内聚低耦合;
- this 区分当前对象,super 指向父类,二者都不能在静态方法中使用;
- 抽象类是 “模板类”,接口是 “行为规范”;需要复用代码选抽象类,多行为扩展选接口;
- 内部类适合封装私有逻辑,匿名内部类、Lambda 是简化开发利器;
- Comparable 做默认排序,Comparator 做灵活临时排序,日常集合排序高频使用。
本章内容是 Java 面向对象的灵魂,后续 Spring 等框架底层大量运用继承、多态、接口、反射思想,一定要动手敲书中员工、矩形、匿名类案例加深理解。
更多推荐
所有评论(0)