Java和C++中“隐藏/覆盖/重写/重载” 的区别


重载:重载是一个类的各个函数之间的,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

重写:重写是父类子类之间的。


这里主要谈函数的重写和隐藏

首先,重写和隐藏是互斥的,相对的。父子中都存在的函数,不是重写就是隐藏。

重写和隐藏的本质区别是:重写是动态绑定,根据运行时引用所指向的对象的实际类型来决定调用相关类的成员,而隐藏是静态绑定的,根据编译时引用的静态类型来决定调用的相关成员。

(就是父类的引用调用的是子类的方法,就是子类的这个方法重写了; 如果父类的引用仍然调用的是父类的方法,子类的引用调用的是子类的方法,那么如果这连个方法重名,那就是子类隐藏了父类的方法。)


C++中重写,一般叫做覆盖。

C++ 中隐藏和重写(覆盖) 只与virtual有关,如果方法有修饰符virtual,表示的是虚函数,是需要子类重写父类的方法。


Java里面的隐藏,值针对参数一样的static函数,参数不一样的static函数,照样不会隐藏。

实例

package com.company;


class Solution {

}

class SuperClass {
    public static int i = 1;
    public int j = 2;
    public final int k = 3;

    public static void method1() {
        System.out.println("SuperClass Method1");
    }

    public static void method1(int a) {
        System.out.println("SuperClass Method1 with int " + a);
    }

    public void method2() {
        System.out.println("SuperClass Method2");
    }

    public void method2(int a) {
        System.out.println("SuperClass Method2 with int " + a);
    }

    public final void method3() {
        System.out.println("SuperClass Method3");
    }

}

class SubClass extends SuperClass {

    public  int i = 2;//无论是不是static,都能隐藏父类的变量i
    public static int j = 1;
    public  int k = 4;//无论是不是final,都能隐藏父类的变量k

    public static void method1() {
        System.out.println("SubClass Method1");
    }

    public void method2() {
        System.out.println("SubClass Method2");
    }

    /*public final void method3() {
        System.out.println("SuperClass Method3");
    }*/
}

public class Main {

    public static void main(String[] args) throws InterruptedException {

        SuperClass sc = new SubClass();
        System.out.println("i = " + sc.i); // 所有的成员变量,只能被隐藏
        System.out.println("j = " + sc.j);
        System.out.println("k = " + sc.k);
        sc.method1();//静态方法只能被隐藏
        sc.method1(3);
        sc.method2();
        sc.method2(3);
        sc.method3();



        SubClass subc = new SubClass();
        System.out.println("i = " + subc.i);
        System.out.println("j = " + subc.j);
        System.out.println("k = " + subc.k);

        subc.method1();
        subc.method1(3);
        subc.method2();
        subc.method2(3);
        subc.method3();

        // Your Codec object will be instantiated and called as such:
        //System.out.printf("ret:%d\n", ret);

        System.out.println();

    }

}

结果

i = 1
j = 2
k = 3
SuperClass Method1
SuperClass Method1 with int 3
SubClass Method2
SuperClass Method2 with int 3
SuperClass Method3
i = 2
j = 1
k = 4
SubClass Method1
SuperClass Method1 with int 3
SubClass Method2
SuperClass Method2 with int 3
SuperClass Method3



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值