Java中的Override, Overload和Overwrite

中文翻译分别是覆盖,重载和重写

Override 和 Overwrite

实际上覆盖(Override)和重写(Overwrite)是对同一概念的不同称呼。
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写
Java中,需要重写(覆盖)父类中的方法,或者实现接口中的方法,可以用@Override标注这是一个此方法重写了(覆盖)父类/接口中的方法。

Overload

重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数,具体解释见下面代码。

示例代码

/**
 * @author jimyoung
 */

class A {
    char i = 'a';
    public void fun(int a) {
        System.out.println("调用A.fun(int a)");
    }

    public void fun(int a, int b) {
        System.out.println("调用A.fun(int a, int b)");
    }
}

class B extends A {
    char i = 'b';
    /**
     * 此方法是A.fun(int a, int b)的一个重写/覆盖(Override/Overwrite)
     */
    @Override
    public void fun(int a, int b) {
        System.out.println("调用B.fun(int a, int b)");
    }

    /**
     * 此方法是B.fun(int a, int b)的一个重载(Overload)
     * 重载要求方法名相同,参数不同(包括参数个数,参数类型,参数顺序,任一不同即可)
     * void fun(double i, int j) 和 void fun(int j, double i)也构成重载关系
     * 重载对返回结果不作要求,因为无法在调用的时候通过返回结果来明确调用的是哪个函数
     */
    public void fun(int a, int b, int c) {
        System.out.println("调用B.fun(int a, int b, int c)");
    }
    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        b.fun(1);
        b.fun(1, 1);
        b.fun(1, 1, 1);
        a.fun(1);
        a.fun(1, 1);
        /**
         * 子类不能覆盖父类的属性
         */
        System.out.println(a.i);
        System.out.println(b.i);
        /**
         * 无法进行下方这样的调用,因为父类引用不能访问子类中独有的方法
         * 如果子类对父类方法进行了重写,那么访问的是子类中的方法,参考a.fun(1, 1);的执行结果(多态的体现)
         */
        //a.fun(1, 1, 1);

    }
}

输出结果

调用A.fun(int a)
调用B.fun(int a, int b)
调用B.fun(int a, int b, int c)
调用A.fun(int a)
调用B.fun(int a, int b)
a
b

猜你喜欢

转载自www.cnblogs.com/jimyoung/p/12599394.html