目录

概念

Java中重载(Overloading)和重写(Overriding)都是针对Java方法的。

重载

如果一个类中定义了多个同名的方法,他们或有不同的参数或有不同的参数类型。则称为方法的重载。

重写

在子类和父类的关系中,如果在子类中定义某方法与其父类的方法有相同的名称和参数,称该方法被重写,子类对象调用此方法时,将调用子类中的定义,父类的方法被覆盖掉了。

重写和重载的区别

  • 重载是个编译期概念,重写是个运行期概念。
  • 重载遵循”编译期绑定“,在编译时根据参数变量的类型判断调用哪个方法。
  • 重写遵循”运行期绑定“,在运行时根据引用变量指向的对象来确定调用父类还是子类的方法。
  • 在Java中,多态指的是动态多态,而重载在编译期就已经确定调用哪个方法了,所以重载不是多态

重载代码示例

public class Hello {
    public void say() {
        System.out.println("Hello");
    }
    //重载
    public void say(String s) {
        System.out.println("Hello" + s);
    }

    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.say();
        hello.say("World");
    }
}
//输出
Hello
HelloWorld

Hello类中定义了两个say方法,参数不同,编译期时会根据参数选择调用哪个方法。

重写代码示例

//父类
public class Father {
    public void say() {
        System.out.println("I am Father");
    }
}
//子类
public class Son extends Father {
    @Override
    public void say() {
        System.out.println("I am Son");
    }

    public static void main(String[] args) {
        Father father = new Son();
        father.say();
    }
}
//输出
I am Son

主方法中,father对象被定义为Father类型,编译期时,会检查Father是否有say方法,有就编译通过,运行期时,Son对象被new处理赋值给father,也就是父类引用指向子类对象,所以father调用say方法时,会调用Son类的say方法,输出I am Son。