Jon*_*eet 22

  • 重载:根据指定参数的数量和类型在编译时选择方法签名

  • 覆盖:根据目标对象的实际类型在执行时选择方法实现(而不是表达式的编译时类型)

例如:

class Base
{
    void foo(int x)
    {
        System.out.println("Base.foo(int)");
    }

    void foo(double d)
    {
        System.out.println("Base.foo(double)");
    }
}

class Child extends Base
{
    @Override void foo (int x)
    {
        System.out.println("Child.foo(int)");
    }
}

...

Base b = new Child();
b.foo(10); // Prints Child.foo(int)
b.foo(5.0); // Prints Base.foo(double)
Run Code Online (Sandbox Code Playgroud)

这两个调用都是重载的例子.调用了两种方法foo,编译器确定要调用的签名.

第一个调用是覆盖的示例.编译器选择签名"foo(int)",但是在执行时,目标对象的类型确定要使用的实现应该是Child.


mik*_*iku 10

  • 重载方法是一种编译技巧,允许您使用相同的名称根据参数执行不同的操作.

  • 覆盖方法意味着它的整个功能正在被替换.覆盖是在子类中对父类中定义的方法执行的操作.

src:http://www.jchq.net/tutorial/06_02Tut.htm


fas*_*ava 6

重载:

public Bar foo(int some);
public Bar foo(int some, boolean x);  // Same method name, different signature.
Run Code Online (Sandbox Code Playgroud)

覆盖:

public Bar foo(int some);   // Defined in some class A
public Bar foo(int some);   // Same method name and signature. Defined in subclass of A.
Run Code Online (Sandbox Code Playgroud)

如果没有定义第二个方法,它将继承第一个方法.现在它将被A的子类中的第二个方法替换.