Java重载、重写、覆盖、隐藏的总结

C++中重载(overload)、重写(override,也叫做“覆盖”)重定义(redefine,也叫作“隐藏”)的区别? 指派生类的函数屏蔽了与其同名的基类函数。特点:①函数名称相同,但是返回值可以不同。②作用域分别位于基类派生类之中;①如果派生类的函数基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。②如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。所以,此处只要求是同名函数,不管参数列表是否相同,基类函数都会被隐藏 阅读详情

重载Overloading

发生要素如下:

1. 在同一作用范围内(同一个类,同一个接口)

2. 方法名必定相同

3. 形参组成不同(类型、个数均不相同 or 个数相同但类型不同 or 类型相同个数不同)

错误的认识:

1. 方法名相同,形参组成完全相同,返回类型不同也算重载(方法重载要求方法具有不同的签名:形参组成,而返回值并不算作签名内容,故不参与重载的选择)

2. abstract修饰必须存在才算重载方法(无所谓啊,修饰符惹谁了?)

abstract class AbstractBase {
    abstract void add();  
    abstract void add(int a);  //OK 
    void add(String b){} //OK
    int add(String b){} // NO!!!编译不通过
    protected void add(int a,int b){}
}

覆盖/重写/覆写(一个意思!)(Overriding/Overwrite)

发生要素如下:

1. 不同作用范围内(继承别的类,实现接口)

2. 方法名相同(废话!)

3. 形参组成相同(类型、个数均相同)

4. 返回类型相同

个人理解:

1. 既然是覆盖,要完全盖住,学的像点,所以方法的外表要看上去一样嘛。

2. 实现接口方法,也可称为覆盖,毕竟是把空的方法体覆盖为具体的代码了。想想也是,实现接口的时候IDE是不是为我们自动加上了@Override注解?这个在JDK6之前的版本可不行,写这个注解是会报错的。(怀念起在老东家运维JDK1.5项目的时光)

要注意的地方:派生方法不能抛出比基类方法范围更广的异常(速记:孩子不能闯比父母更大的祸),

                         错误范例:基类方法throws IOException,派生方法却throws Exception。

                         派生方法不能有比基类方法更大的访问度(速记:孩子不能比父母更能显摆),

                         错误范例:基类方法是protected,派生方法却是public。

隐藏Hiding

发生要素如下:

1. 同覆盖的1.2.3.4条件(必要)

2. 仅发生在静态方法上

要点:

隐藏不需要@Override注解修饰,加上会报错。且派生方法的可抛出异常范围和可访问范围的约束与覆盖相同(不能抛更多异常,不能有更广的访问权限)。

在jls11文档中,隐藏注明为 by Class Methods,而覆盖则是by Instance Methods,这个很好理解,静态的成员方法就是属于这个类的,隐藏也可以叫类的方法的覆盖。

个人理解:静态方法是和类绑定到一起的,那么在实例化的时候,用的谁的类型的引用,那么call到的方法就是谁的实现,也许说的不恰当,请看下例:

       class Super {
           static String greeting() { return "Goodnight"; }
           String name() { return "Richard"; }
       }
       class Sub extends Super {
           static String greeting() { return "Hello"; }
           String name() { return "Kick"; }
       }
       class Test {
           public static void main(String[] args) {
               Super s = new Sub();  
               System.out.println(s.greeting() + ", " + s.name());
               //输出:Goodnight, Kick
               Sub s2 = new Sub();
               System.out.println(s2.greeting() + ", " + s.name());
               //输出:Hello, Kick
           } 

}

由于s的类型是Super,所以greeting()执行的是Super的实现,但是name()是正常的覆盖,好比派生类没有重写greeting()一样(派生类干的事儿被藏起来了)。但是s2 call到的就是Sub的实现了,符合常规的思路。

 

  本文参考:jsl11文档

C++ 重载重写(覆盖)、重定义(隐藏) 与 Java 重载重写(覆盖)、隐藏的区别 C++: 一、重载(overload) 指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。 (1)相同的范围(在同一个作用域中) ; (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 (5)返回值可以不同; 二、重写(也称为覆盖 override) 是指派生类重新定义基类的虚函数,特征是: (1)不在同一个作用域(分别位于派生类与基类) ;... 阅读详情

相关推荐

Java方法覆盖重载的深入理解

本文将详细介绍Java中的方法覆盖(Overriding)方法重载(Overloading)的区别用法。通过分析具体的代码示例输出结果,深入探讨了方法签名、继承层级、以及如何在子类中调用超类方法等关键概念。同时,文章也解释了静态方法实例方法在覆盖隐藏上的不同表现,以及如何使用super关键字来访问超类的成员。

weixin_35755188的博客 304

重载、重定义、重写覆盖)、隐藏的定义与区别

今天在学习Java中《类对象》这一章时,我看到了熟悉的重载重定义,突然想到自己在学习C++时也遇到过这些概念,而且当时还没搞懂,仔细一想,我好像现在也没搞懂。 于是我立马扔下手中的Java,离开自习室,在CSDN上查询这两个概念的区别,这不查不知道,一查吓一跳,我又碰到一个非常熟悉的大兄弟----重写从未听过的一个老哥们----隐藏。 这四个混在一起。完了,更懵了。 但是功夫不负有心人啊,还是让孩子搞懂了这几个玩意,我可真是个小天才! 那我们来看下这四个概念的内容以及区别吧 ...

m0_53133879的博客 4359

重写重载覆盖

重写于父子类、动态绑定;重载于一个类、静态绑定。

Smart_auspicious的博客 1916

什么是重载覆盖重写),隐藏(重定义)

#[TOC] 重载 重载是什么: 函数重载是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表(参数个数或类型或顺序)必须不同,对返回值不做要求,因为无法通过改变参数列表来判断调用的是那一个重载函数。 注意点: 1.函数重载在同一作用域 2.函数重载与返回值无关 3.类静态成员函数可以普通成员函数构成重载 int add(int a,int b) { return a+b; } double add(double a,double b)//返回值,参数类型不

weixin_47641702的博客 2823

java方法重写/覆盖(override)

方法覆盖即子类有一个方法,与父类(或更上一级的父类)的某个方法的名称、参数、返回类型一样,那么我们就说子类的整个方法覆盖了父类的方法。比如,父类方法是默认修饰符,子类是public,这样是对的,但是反过来就会缩小父类的访问 权限。比如、父类返回类型是 Object,子类返回类型是String,(String是Object的子类)2、子类方法的返回类型父类方法的返回类型一样、或者是。//super.say() 调用父类方法。3、子类方法不能缩小父类方法的访问权限。

lmd187的博客 844

关于JAVA重载重写(覆盖)、隐藏

**最近进行了JAVA末考,自己整理了一些关于重载重写(覆盖),隐藏的知识,来此算是记录一下,具体内容如下:** 一. 重载 方法名、返回值相同,但参数不同的多个同名函数。 特点: (1) 返回值必须相同(系统认为形参一样的函数返回结果类型也应该一样)。 (2) 参数不同: ① 形参个数不同 ② 形参数据类型不同 ③ 形参排列顺序不同 (满足以上三个其中一个或多个即可) (3) main函数也可...

qq_51368339的博客 544

重载重写(覆盖)、隐藏的区别--Java

重载 overload 大家都熟悉java重载以及实现,在一个类中同一个函数以多种不同的形态出现,即函数的参数个数或者类型不一样。 例子 System.out.println(); 下面简称SOP SOP(String str) SOP(int number) SOP(char ch) SOP(double num) 覆盖重写) overwrite 覆盖也是大家熟悉

小三哥的随手记 549

JAVA重载重写&隐藏覆盖

重载: 前提条件:重载是针对方法来说的, ①在同一个类当中, ②函数名字相同, ③但是参数个数不同或参数类型不同或参数顺序不同 ④只有返回值不同是不可以的 重写: 前提条件:重写是针对实例方法来说的 1、要求子父类有相同的“返回值类型 方法名(参数列表)”都相同2、子类方法的权限修饰符不能小于父类方法的权限修饰符3、若父类方法抛异常,那么子类方法抛的异常不能大于父类方...

weixin_30480651的博客 255

java中的隐藏重写分别是指什么_java重载覆盖隐藏三者的区别分析

重载:方法名相同,但参数不同的多个同名函数注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同2.返回值异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()int a() ,如果调用a(),出现歧义)3.main方法也是可以被重载覆盖:子类重写父类的方法,要求方法名参数类型完全一样(参数不能是子类),返回值异常比父类小或者相同(即...

weixin_35899510的博客 202

JavaC++中“隐藏/覆盖/重写/重载” 的区别

重载重载是一个类的各个函数之间的,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。 重写重写是父类子类之间的。 这里主要谈函数的重写隐藏 首先,重写隐藏是互斥的,相对的。父子中都存在的函数,不是重写就是隐藏重写隐藏的本质区别是:重写是动态绑定,根据运行时引用所指向的对象的实际类型来决定调用相关类

xiaoyi971520_3的博客 657

java总的重载(overload)、重写覆盖(override)隐藏分析;

class Super{ public static void smethod(){ System.out.println("super smethod!"); } public static void stest(){ System.out.println("super test!"); } public void test(){ System.out.prin

hrbeuwhw的专栏 490

java隐藏覆盖_java中方法的隐藏覆盖问题?

ok()方法在继承时候发生覆盖(重写)了吗?发生了。在子类B中的ok()方法拥有父类方法相同的方法名参数列表(signature),所以在这里发生了重写。调用B类对象的ok()方法会print "b",父类方法被覆盖。如果是重写了,那定义一个b类的对象还能再调用a类继承的ok()函数吗?可以。方法就是利用super关键字。@陆萌萌 的答案已经解释了。a类的ok()函数是在子类中隐藏了吗?能告诉我...

weixin_39922147的博客 167

java方法的重载覆盖隐藏,以及多态的区别

java方法的重载覆盖隐藏重载 overloading大家都熟悉java重载以及实现,在一个类中同一个函数以多种不同的形态出现,即函数的参数个数或者类型不一样。例子 System.out.println(); 下面简称SOPSOP(String str)SOP(int number)SOP(char ch)SOP(double num)............................

ouyp0627的专栏 1605

Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖...

Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用,静态方法属于类也不能重写,用谁的引用调用的方法就是谁的,final方法也不能重写,若子类的方法父类相同,只能说是不同的实现,但是不是覆盖,参考Java编程思想157页,了解一下java中的覆盖隐...

weixin_33873846的博客 244

继承内容总结

方法重写是发生在继承关系中的,子类父类中方法名相同,参数列表相同,返回值类型一致(这里的一致指的是返回值类型一致,并不是要完全相同),访问修饰符权限子类大于等于父类,抛出异常子类小于等于父类。调用一个对象的被重写的方法的时候,实际上调用的是子类中重写之后的方法,而不是父类中的方法。子类的构造方法可以调用父类的构造方法,在子类的构造方法中使用super关键字调用,从而初始化父类的属性。如果父类没有写构造方法,子类无需调用父类的构造方法,如果父类写了构造方法,子类必须调用。这是子类自己的属性。

m0_57218914的博客 89

java混乱_Java的术语为何如此混乱?

有些术语因为翻译+本身含义模糊+使用者水平问题显得混乱是正常的。对于 Java,我觉得参考 JLS 译本里的翻译是一个不错的选择。我们需要明确这几个可能互相混淆的概念:隐藏(Hiding)、覆盖(重写,Override)、重载(Overload)、遮蔽(Shadowing)以及遮掩(Obscuring)。什么是遮蔽(Shadowing)?JLS §6.4.1 中是这样描述的:Some declar...

weixin_35216188的博客 224

java static 覆盖_static关键字什么意思?Java中是否可以覆盖一个private或者是static的方法?...

答案:“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。java中也不可以覆盖private的方法,因为private修饰的变量方法只能在当前类中使用,如果是其他的类继承当前类是不能...

weixin_39943799的博客 183

day 10 封装、继承、属性覆盖、构造方法、方法重写

1.封装 隐藏属性、方法或者实现的过程就是封装 2.继承—java类与类之间的关系,子类可以使用父类的属性方法 1.优缺点 优点:提高了代码的复用性可维护性 缺点:加强了类类的关系,增加了耦合性,违反了高内聚,低耦合的设计原则 2.父类中的属性方法,是所有子类的共同的属性方法, 子类自己的属性方法,只能被子类自己所使用,仅仅属于子类自己 3.覆盖 1. 父类子类中具有相同的属性 在子类中使用子类自己的属性,如果要强行使用父类的属性, 用super调用父类属性

tpszhao的博客 190
上一篇: Oracle新建表空间、新建用户、授权
下一篇: Java8新特性之default关键字学习
暴躁的外皮
博客等级 码龄16年 27粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值