Java的多态和重载

1. 重载(Overloading):同一作用域内的 “同名不同参”

重载指的是在同一个类(或同一个作用域)中,允许定义多个名称相同但参数列表不同的方法(或函数),调用时通过 “传入参数的类型、个数、顺序” 来区分具体执行哪个方法。

  1. 多态(Polymorphism):继承体系中的 “动态绑定”

多态指的是在继承(或接口实现)体系中,子类(或实现类)可以重写(Override)父类(或接口)的方法,使得 “父类引用指向子类对象时,调用方法会执行子类的具体实现”,而非父类的实现。

父类与子类的构造器调用规则(最易混淆)

核心规则:

  1. 子类构造器默认会先调用父类的无参构造器(隐式调用,通过 super() 实现)。
  2. 若父类没有无参构造器,子类必须显式调用父类的有参构造器(用 super(参数),且必须放在子类构造器第一行)。

反例(编译报错):

class Parent {
    // 父类只定义了有参构造器,无默认无参构造器
    public Parent(int age) {} 
}

class Child extends Parent {
    public Child() {
        // 编译报错:父类没有无参构造器,子类必须显式调用 super(参数)
    }
}

正确示例:

class Parent {
    public Parent(int age) {} 
}

class Child extends Parent {
    public Child() {
        super(10); // 显式调用父类有参构造器,必须在第一行
    }
}

混淆点提醒:

  • 不要以为 “子类构造器只负责自己的属性”,它必须先完成父类的初始化
  • 父类的 private 属性子类无法直接访问,但父类构造器仍会被调用(初始化父类的私有状态)。
多态的 “编译看左,运行看右”(核心易错点)

多态场景:父类类型 变量 = new 子类对象()

  • 编译时:变量能调用的方法由 “父类类型” 决定(父类没有的方法,编译报错)。
  • 运行时:实际执行的是 “子类重写后的方法”(若子类未重写,则执行父类方法)。

示例:

class Animal {
    public void eat() { System.out.println("动物吃饭"); }
    public void sleep() { System.out.println("动物睡觉"); }
}

class Cat extends Animal {
    @Override
    public void eat() { System.out.println("猫吃鱼"); } // 重写父类方法
    public void catchMouse() { System.out.println("猫抓老鼠"); } // 子类独有方法
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Cat(); // 多态
        animal.eat(); // 运行时执行子类重写的方法 → 输出“猫吃鱼”
        animal.sleep(); // 子类未重写,执行父类方法 → 输出“动物睡觉”
        // animal.catchMouse(); // 编译报错:父类Animal没有该方法
    }
}

混淆点提醒:

  • 多态中,子类独有的方法无法通过父类变量调用(编译不通过)。
  • 变量的 “类型”(左边)决定了编译期的可见性,对象的 “实际类型”(右边)决定了运行期的执行逻辑。

方法重载(Overload)与重写(Override)的区别

维度 重载(Overload) 重写(Override)
定义场景 同一个类中 父子类中(子类重写父类方法)
方法名 必须相同 必须相同
参数列表 必须不同(个数 / 类型 / 顺序) 必须相同(与父类保持一致)
返回值类型 可以不同 必须与父类相同(或子类类型)
权限修饰符 无限制 子类权限 ≥ 父类(不能更严格)
核心目的 方便调用(同一功能的不同实现) 实现多态(子类定制父类行为)
posted @ 2025-11-06 15:33  Leo0OO  阅读(21)  评论(2)    收藏  举报