新思想

Java 的 Overload 和 Override

override:覆盖,表示在子类中一个函数覆盖了基类中的同名函数名称,或者局部的某个函数覆盖了全局的某个同名函数名称。被覆盖的函数通常不能直接被调用,而是必须借助一些显式的强制手段。
override 是运行时概念。

overload:重载,表示在同一级子类或同一命名空间中,一个函数因参数类型与个数不同可以有不同的实现。可以表现多态性。被重载的函数,通常每个不同的实现都可以单独被调用。
overload 是编译时概念。

 

overload:重载

class Foo
{
    public void print(String str)
    {
        System.out.println("String");
    }

    public void print(Object o)
    {
        System.out.println("Object");
    }

    public void print(int i)
    {
        System.out.println("int");
    }

    public void print(long l)
    {
        System.out.println("long");
    }

    public void print(float f)
    {
        System.out.println("float");
    }

    public void print(double d)
    {
        System.out.println("double");
    }

    public void print(int i, float f)
    {
        System.out.println("int and float");
    }

    public void print(long l, double d)
    {
        System.out.println("long and double");
    }
}

public class OverloadOverride {
    public static void main(String[] args) {
        Foo f = new Foo();
        f.print(12);
        f.print(78.98);

        f.print(12L);
        f.print(78.98F);

        f.print('A');
        f.print("A");

        f.print(1, 1.0);
    }
}

输出:

int
double
long
float
int
String
long and double

 

override:覆盖

class Father {
    public void done(Object o) {
        System.out.println("father");
    }
}

class Son extends Father {
    public void done(String str) {
        System.out.println("son");
    }
}

public class OverloadOverride {
    public static void main(String[] args) {
        Father ff = new Son();
        ff.done(new String());
        ((Son) ff).done(new String());

        Son ss = new Son();
        ss.done(new String());
    }
}

输出:

father
son
son

上面的例子中的 Son 实际上是 overload 方法,子类 Son 中继承了父类的 done(Object o) 方法,然后重载了 done(String str) 方法。

父类的引用只能引用父类的方法 或 被子类 override 重写了的方法所以获得了以上输出。

 

真正的 Override :

class Father {
    public void done(Object o) {
        System.out.println("father");
    }
}

class Son extends Father {
    public void done(Object o) {
        System.out.println("Override father");
    }

    public void done(String str) {
        System.out.println("son");
    }
}

public class OverloadOverride {
    public static void main(String[] args) {
        Father ff = new Son();
        ff.done(new String());
        ((Father) ff).done(new String());

        Son ss = new Son();
        ss.done(new String());
    }
}

输出:

Override father
Override father
son

 

全部源代码:

class Foo
{
    public void print(String str)
    {
        System.out.println("String");
    }

    public void print(Object o)
    {
        System.out.println("Object");
    }

    public void print(int i)
    {
        System.out.println("int");
    }

    public void print(long l)
    {
        System.out.println("long");
    }

    public void print(float f)
    {
        System.out.println("float");
    }

    public void print(double d)
    {
        System.out.println("double");
    }

    public void print(int i, float f)
    {
        System.out.println("int and float");
    }

    public void print(long l, double d)
    {
        System.out.println("long and double");
    }
}

class Father {
    //    public void done(String str) {
    public void done(Object o) {
        System.out.println("father");
    }
}

class Son extends Father {
    //    Override
    public void done(Object o) {
        System.out.println("Override from father");
    }

    public void done(String str) {
        System.out.println("son");
    }
}

public class OverloadOverride {
    public static void main(String[] args) {
        Father ff = new Son();
        ff.done(new String());
        ((Son) ff).done(new String());

//        Son ss = new Son();
//        ss.done(new String());

        Foo f = new Foo();
        f.print(12);
        f.print(78.98);

        f.print(12L);
        f.print(78.98F);

        f.print('A');
        f.print("A");

        f.print(1, 1.0);
    }
}

注意:在初始化代码块和构造函数部分要尽量避免调用成员方法(除非确定该成员方法不会被子类重写),因为成员方法可能被子类重写,造成不可预料的情况。

posted on 2016-01-22 14:52  新思想  阅读(161)  评论(0)    收藏  举报

导航