Java基础之重载(Overload)与重写(Override)详解

  

Java基础之重载(Overload)与重写(Override)详解

什么是重载(Overload)?

重载指的是在同一个类中,可以使用相同的方法名,但是方法名后面的参数列表必须不同。也就是说,同一个方法名可以对应多个不同的方法,这些不同的方法在参数列表的类型、数量或者顺序上都有所区别。

重载方法的形式:

    // 仅仅参数类型不同
    public void doSomething(int num) { ... }
    public void doSomething(double num) { ... }

    // 参数的数量不同
    public void doSomething(int num) { ... }
    public void doSomething(int num, String name) { ... }

   // 参数的顺序不同
   public void doSomething(int num, String name) { ... }
   public void doSomething(String name, int num) { ... }

重载规则

Java中对于重载方法的要求如下:

  • 同一类中方法名相同但参数列表不同。
  • 不能仅仅依靠返回值的不同来重载方法。
  • 只有参数列表不同时,才能够进行重载。
  • 如果参数个数相同,则参数类型可以不同,前提是它们不构成歧义(即只有一个方法以上符合调用时传入的参数类型和个数)。
  • 如果两个或两个以上的方法符合前三个条件,则采用参数数量最多的那个方法。

什么是重写(Override)?

重写指的是在子类中编写一个与其父类中方法名,返回类型、参数列表都相同的方法。子类重写(覆盖)继承自父类的方法时,必须与父类一模一样,包括方法名、返回值类型、方法参数、访问修饰符等。当子类对象调用该方法时,将优先调用子类中定义的方法,而不是父类中同名同参同返回值类型的方法。

重写方法的形式:

// 子类中重写了父类的方法
public class ChildClass extends ParentClass {
    public void doSomething() { ... }
}

重写规则

Java中对于方法重写的要求如下:

  • 方法名必须与被重写方法的方法名完全相同。
  • 方法的返回类型与参数列表必须与被重写方法的返回类型和参数列表完全相同。
  • 访问修饰符的限制不能比被重写方法的限制更严格(即 public > protected > default > private)。
  • 重写的方法不能比被重写的方法抛出更广泛的异常。
  • 重写的方法不能是final或static类型。

举例说明

重载方法的举例

public class OverloadDemo {
    public void doSomething(int num) {
        System.out.println("重载方法1:" + num);
    }

    public void doSomething(double num) {
        System.out.println("重载方法2:" + num);
    }

    public void doSomething(int num, String name) {
        System.out.println("重载方法3:" + num + " " + name);
    }

    public void doSomething(String name, int num) {
        System.out.println("重载方法4:" + name + " " + num);
    }

    public static void main(String[] args) {
        OverloadDemo demo = new OverloadDemo();
        demo.doSomething(1);
        demo.doSomething(1.0);
        demo.doSomething(1, "hello");
        demo.doSomething("hello", 1);
    }
}

运行结果:

重载方法1:1
重载方法2:1.0
重载方法3:1 hello
重载方法4:hello 1

重写方法的举例

public class ParentClass {
    public void doSomething() {
        System.out.println("父类中的方法");
    }
}

public class ChildClass extends ParentClass {
    public void doSomething() {
        System.out.println("子类中的方法");
    }

    public static void main(String[] args) {
        ParentClass p = new ChildClass();
        p.doSomething();
    }
}

运行结果:

子类中的方法

在上面的例子中,尽管把子类对象存储在父类引用变量中,最终执行的却是子类中重写的方法。这就是Java中的方法重写机制。

相关文章