救命!Java 进阶居然还在考这些“小儿科”?

12 阅读3分钟

刚入行的 Java 萌新总觉得进阶知识遥不可及,其实很多高频考点就藏在基础的“升级款”里。今天扒 3 个看似简单、面试必问的进阶基础点,带代码带你秒懂!

一、 重载 vs 重写:别再傻傻分不清

很多人会把这俩概念搞混,其实核心区别就一个:重载看参数,重写看父子。

重载(Overload):同一个类里的“多面手”

  • 核心规则:方法名相同,参数列表(个数、类型、顺序)不同,与返回值无关。
  • 典型场景:构造方法重载、工具方法多参数适配。
public class OverloadDemo {
    // 无参构造
    public OverloadDemo() {
        System.out.println("无参构造");
    }

    // 带参构造(重载)
    public OverloadDemo(String msg) {
        System.out.println("带参构造:" + msg);
    }

    // 求和方法1:两个int
    public int sum(int a, int b) {
        return a + b;
    }

    // 求和方法2:三个int(重载)
    public int sum(int a, int b, int c) {
        return a + b + c;
    }

    public static void main(String[] args) {
        OverloadDemo demo1 = new OverloadDemo();
        OverloadDemo demo2 = new OverloadDemo("重载测试");
        System.out.println(demo2.sum(1,2));
        System.out.println(demo2.sum(1,2,3));
    }
}

 

重写(Override):子类对父类的“定制化改造”

  • 核心规则:子类方法与父类方法名、参数列表、返回值完全一致,访问权限不能更严格。
  • 典型场景:实现多态、定制父类逻辑。
// 父类
class Animal {
    public void makeSound() {
        System.out.println("动物发出叫声");
    }
}

// 子类
class Cat extends Animal {
    // 重写父类方法
    @Override
    public void makeSound() {
        System.out.println("喵~喵~");
    }
}

public class OverrideDemo {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.makeSound(); // 输出:喵~喵~  多态体现
    }
}

 

二、 接口 vs 抽象类:选对能省一半事

这俩都是“规范制定者”,但适用场景天差地别,一张表看懂核心区别:

特性 接口(Interface) 抽象类(Abstract Class)

成员变量 只能是 public static final 可以有任意变量

成员方法 JDK8+ 可含默认/静态方法,其余抽象 可含抽象方法和普通方法

继承实现 类可实现多个接口 类只能继承一个抽象类

代码示例:接口做规范,抽象类做基础

// 接口:定义“会飞”的规范
interface Flyable {
    void fly();
}

// 抽象类:定义“鸟类”的基础属性和方法
abstract class Bird {
    protected String name;
    public Bird(String name) {
        this.name = name;
    }
    // 抽象方法:子类必须实现
    public abstract void eat();
}

// 具体类:麻雀(继承抽象类+实现接口)
class Sparrow extends Bird implements Flyable {
    public Sparrow(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(name + "吃虫子");
    }

    @Override
    public void fly() {
        System.out.println(name + "低空飞行");
    }
}

public class InterfaceAbstractDemo {
    public static void main(String[] args) {
        Sparrow sparrow = new Sparrow("小麻雀");
        sparrow.eat();
        sparrow.fly();
    }
}

 

三、 包装类的“坑”:== 和 equals 别乱用

Java 为 8 种基本类型提供了包装类(如  Integer  对应  int ),新手最容易踩  ==  比较地址的坑。

核心知识点

  • 包装类是引用类型, ==  比较的是对象地址, equals  比较的是值。

  • 缓存池: Integer  在 -128~127 范围内会复用对象,超出范围会新建对象。

public class WrapperClassDemo {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;

        System.out.println(a == b); // true  命中缓存池
        System.out.println(c == d); // false 超出缓存范围,新建对象
        System.out.println(c.equals(d)); // true  比较值相等
    }
}

 

总结

Java 进阶不是空中楼阁,把这些基础知识点吃透,面试时就能少踩坑!下次再有人问你这些“小儿科”,直接甩代码怼回去~