一、前言

前面学习了 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 关键字

  1. 调用父类构造方法:子类构造第一行默认隐式super(),调用父类无参构造;父类只有有参构造时,必须手动写super(参数)
  2. 访问父类被重名覆盖的成员变量 / 方法:super.属性super.方法()

3. this 关键字

  1. 区分局部变量与成员变量:局部变量和成员变量同名时,this.变量代表当前对象的成员变量。
  2. 调用本类其他构造方法: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. 继承中的类型转换

  1. 向上转型(隐式转换):子类转父类,自动转换,安全。

    java

    CA ca = new CB(); //CB extends CA,无需强转
    
  2. 向下转型(显式强制转换):父类转子类,必须强制转换,编译不会校验逻辑,运行时报ClassCastException,建议配合instanceof判断类型再转换。

三、多态:一个接口,多种实现

1. 多态两大分类

  1. 编译多态(方法重载):同一个类中,方法名相同、参数列表不同,编译时根据参数匹配对应方法。比如绘图draw(),传矩形、圆形参数执行不同逻辑。
  2. 运行多态(方法重写):子类重写父类方法,父类引用指向子类对象时,运行时执行子类重写后的方法。 书中员工、经理案例完美体现运行多态: 父类 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 文件。

六、其他高级特性简记

  1. Lambda 表达式:简化单方法接口(函数式接口)的匿名内部类写法,代码极简;
  2. 泛型:<> 约束数据类型,避免类型强转、类型转换异常;
  3. 反射:运行时获取类、方法、属性信息,框架底层核心原理;
  4. 注解:@XXX,给代码附加元数据,用于编译校验、框架配置。

七、学习总结

  1. 继承解决代码复用,多态解决程序扩展,二者结合实现高内聚低耦合;
  2. this 区分当前对象,super 指向父类,二者都不能在静态方法中使用;
  3. 抽象类是 “模板类”,接口是 “行为规范”;需要复用代码选抽象类,多行为扩展选接口;
  4. 内部类适合封装私有逻辑,匿名内部类、Lambda 是简化开发利器;
  5. Comparable 做默认排序,Comparator 做灵活临时排序,日常集合排序高频使用。

本章内容是 Java 面向对象的灵魂,后续 Spring 等框架底层大量运用继承、多态、接口、反射思想,一定要动手敲书中员工、矩形、匿名类案例加深理解。

更多推荐