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

本文详细解释了在面向对象编程中重写与隐藏的概念及它们之间的区别,通过Java实例展示了如何实现方法的重写和变量及方法的隐藏,并强调了重写与隐藏的不同绑定特性。


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

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


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

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

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

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


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



【路径规划】(螺旋)基于A星全覆盖路径规划研究(Matlab代码实现)内容概要:本文围绕“基于A星算法的全覆盖路径规划”展开研究,重点介绍了一种结合螺旋搜索策略的A星算法在栅格地图中的路径规划实现方法,并提供了完整的Matlab代码实现。该方法旨在解决移动机器人或无人机在未知或部分已知环境中实现高效、无遗漏的区域全覆盖路径规划问题。文中详细阐述了A星算法的基本原理、启发式函数设计、开放集与关闭集管理机制,并融合螺旋遍历策略以提升初始探索效率,确保覆盖完整性。同时,文档提及该研究属于一系列路径规划技术的一部分,涵盖多种智能优化算法与其他路径规划方法的融合应用。; 适合人群:具备一定Matlab编程基础,从事机器人、自动化、智能控制及相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于服务机器人、农业无人机、扫地机器人等需要完成区域全覆盖任务的设备路径设计;②用于学习理解A星算法在实际路径规划中的扩展应用,特别是如何结合特定搜索策略(如螺旋)提升算法性能;③作为科研复现与算法对比实验的基础代码参考。; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注A星算法与螺旋策略的切换逻辑与条件判断,并可通过修改地图环境、障碍物分布等方式进行仿真实验,进一步掌握算法适应性与优化方向。
在编程中,重载重写面向对象编程的重要概念,在不同编程语言中定义应用有所不同,下面以JavaC++为例进行介绍。 ### 概念 - **重载(Overloading)**:在Java里,重载指在同一个类中存在多个同名方法;在C++ 中,重载是在同一个作用域中定义多个同名的函数。它们的参数列表(类型、数量或顺序)必须不同,且重载函数与函数的返回类型无关,返回类型不能用来区分重载函数。目的是允许在同一作用域中使用相同的函数名来实现不同的功能,使函数的调用更加灵活直观,适用范围包括函数(包括成员函数)运算符 [^2][^4][^5]。 - **重写(Overriding)**:在Java中,重写是在继承关系中子类重新定义父类方法;在C++ 里,重写是在派生类中重新定义基类中的虚函数,使得派生类的版本会覆盖基类的版本。重写允许在派生类中提供基类函数的具体实现,通常用于实现多态性,仅适用于虚函数(在基类中用 `virtual` 关键字声明的函数) [^4][^5]。 ### 区别 主要体现在以下五个方面: 1. **定义范围**:重载是在同一个类(Java)或同一作用域(C++)中,而重写是在继承关系中,子类对父类方法(Java)或派生类对基类虚函数(C++)进行重新定义 [^4][^5]。 2. **参数要求**:重载必须改变参数列表(类型/数量/顺序);重写必须保持完全相同的参数列表 [^4]。 3. **返回类型**:重载允许不同的返回类型;重写的返回类型必须兼容(协变类型) [^4]。 4. **访问权限**:重载可自由修改访问修饰符;重写的访问级别不能更严格(如父类 `protected` 则子类不能改为 `private`) [^4]。 5. **多态表现**:重载是编译时静态绑定;重写是运行时动态绑定,是实现多态的基础 [^4]。 ### 应用 - **重载的应用**:在实际编程中,重载可以让代码更加简洁易读。例如在一个数学计算类中,可以定义多个 `sum` 方法来处理不同类型数量的参数: ```java public class MathUtils { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } } ``` - **重写的应用**:重写常用于实现多态性,使得程序可以根据对象的实际类型来调用相应的方法。例如: ```java class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值