Java 重载、重写和隐藏的区别

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

前言:
最近复习Java基础时,发现之前有个知识点(隐藏)被我忽略了,一直弄成了覆盖的意思,害,说明基础不够牢固。自己测试了一遍果然发现了隐藏的不一样的地方,这里自己就懒得写总结了,转载别人写的比较好的一篇。

原文:https://www.cnblogs.com/weichunguang/p/7646933.html

一、重载(Overload)

注意:为了正确的区分重载和重写,请各位务必记清重载(Overload)和重写(Override)的英文。

(1)重载定义:表示两个或多个方法的名字相同,但方法的参数不同。方法参数不同有两层含义:A、参数的个数不同;B、参数的类型不同。

[java] view plain copy

public void run(String name, int count)  
{  
System.out.println(count + " " + name + " " + "are running.");  
}  
public void run(int count, String name)  
{  
System.out.println(count + " " + name + " " + "are running.");  
}  

请思考以上两个方法是否构成了重载?

(2)重载发生的时机:重载是发生在同一个类内部的两个或多个方法之间。

(3)方法的返回类型对重载没有任何影响!即,对于方法名字和参数都相同的两个方法,如果他们的返回类型不同,这种语法格式是错误的,大家可以试一试。那么,也就是说,只要是重载返回类型一定相同。否则为两个不同的方法。如下代码,这是两个不同的方法。

[java] view plain copy

public void run()  
{  
System.out.println("dog is running");  
}  
public int run(String name, int count)  
{  
System.out.println(count + " " + name + " " + "are running.");  
return 1;  
}  

(3)构造方法之间的重载:一个类中有多个构造方法,那么它们一定是重载的。

(4)重载方法之间的调用:对于普通方法的重载,重载的方法之间是可以直接调用的,如下代码一。

但是对于重载的构造方法之间的调用,需要使用this()关键字。A、this()括号中参数表示目标构造方法所接收的参数;B、对this()的调用必须是构造方法的第一条语句。如下代码二。

public int run(String name, int count)  
{  
System.out.println(count + " " + name + " " + "are running.");  
return 1;  
}  
public void run(int count, String name)  
{  
run(name , count);  
System.out.println(count + " " + name + " " + "are running.");  
}  



public Dog()  
{  
this("金巴");  
System.out.println("你好世界,我是一条狗!");  
}  
public Dog(String name)  
{  
System.out.println("你好世界," + "我是一条" + name + "狗!");  
}  

二、重写(Override)

(1)重写定义:子类与父类的方法的返回类型一样,方法名称一样,参数一样,这样我们就说子类与父类的方法构成了重写关系。

补充:在重写中,我们一直没提到权限的问题(public、protected、private),使用private修饰的方法是不能够进行重写的,也不能够被继承,所以private和多态扯不上关系。在同一个包下,构成重写关系,父类和子类的方法,权限可以是public和public、protected和protected、protected和public,但不可能是public和protected,即权限可以扩大但不可缩小。

(2)重写发生的时机:重写发生在父类与子类之间。

(3)构造方法时不能重写的,如果您理解是构造方法的作用,就知道构造方法为什么不能重写。

(4)在重写时,子类重写的方法调用父类被重写的方法时,可以使用super.父类方法的方式调用,其中此语句不必放在第一行。如下代码所示:

class Animal  
{  
public void run()  
{  
System.out.println("animal is running");  
}  
}  
class Dog extends Animal  
{  
//override  
public void run()  
{  
System.out.println("dog is running");  
super.run();  
}  
}  

三、隐藏(Hide)

(1)提到隐藏,就不得不提到一个关键字–static,static是静态的意思,具体用法意义,各位可以去查相关的资料。这里我想说的,static方法在继承中的特殊性!
(1)子类不能重写(Overriding)父类的静态方法,只能隐藏(Hiding)父类的静态方法。

(2)什么叫隐藏父类的静态方法呢?就是说父类的静态方法和子类的静态方法是同时存在的,具体调用的是哪个方法,是要看调用的方法的引用是什么类型的引用,如果是父类型的引用,调用的就是父类的静态方法,如果是子类型的引用,调用的就是子类的静态方法。【这里面有些多态(Polymorphism)的知识,不懂的可以问我哈!】具体区别我们可以看一个例子,这个例子来自官方文档。

public class Animal   
{  
public static void testClassMethod()   
{  
System.out.println("The class" + " method in Animal.");  
}  
public void testInstanceMethod()   
{  
System.out.println("The instance " + " method in Animal.");  
}  
}  

The second class, a subclass of Animal, is called Cat:

public class Cat extends Animal   
{  
public static void testClassMethod()   
{  
System.out.println("The class method" + " in Cat.");  
}  
public void testInstanceMethod()  
{  
System.out.println("The instance method" + " in Cat.");  
}  
public static void main(String[] args)   
{  
Cat myCat = new Cat();  
Animal myAnimal = myCat;  
Animal.testClassMethod();  
myAnimal.testInstanceMethod();  
}  
}  

隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

隐藏现象发生在子类和父类之间,隐藏是针对父类中成员变量和静态方法而言。

当子类声明与父类中成员变量具有相同的变量名的变量时,则实现了对父类中成员变量的隐藏;

当子类声明了与父类中的静态成员方法具有相同的方法名,参数列表和相同的返回值时,则实现了对父类中静态方法的隐藏。

注意:当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定

方法隐藏只有一种形式,就是父类和子类存在相同的静态方法

属性只能被隐藏,不能被覆盖

子类实例变量/静态变量可以隐藏父类的实例/静态变量,总结为变量可以交叉隐藏

隐藏和覆盖的区别

被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性

被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法

因为覆盖是动态绑定,是受RTTI(run time type identification,运行时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏

特殊情况:

1.final修饰的属性可以被隐藏,但是不能被赋值,即不能用=来赋值,网上说final属性不能被修改,这个说法不准确,因为对于引用类型的变量用final修饰后,它只是不能被指向其他对象,但是可以改它自身的值,可以用ArrayList测试,final属性可以在运行的时候进行初始化,但是不能不出现初始化语句

2.final修饰的方法不能被覆盖,可以被重载

3.final修饰的类不能被继承

4.private 方法隐式添加了final

实例:

SuperClass类:

package com.yilong.test.scjp;  

    public 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 void method2() {  
    System.out.println("SuperClass Method2");  
    }  
    public final void method3() {  
    System.out.println("SuperClass Method3");  
    }  
    }  
java 什么是隐藏_【细说JavaJava重写隐藏 重写隐藏,有些书上或介绍上可能名称不一样,但都大差不差。以前只了解重写隐藏也听说过,但没有详细了解过,趁现在,整理一下这两方面的内容吧。首先,先说一下概念方面的东西。重写重写:子类继承了父类,在子类中声明了与父类具有相同的方法名称与参数列表,并且具有相同的返回类型(或者子类的返回类型是父类的子类型)的实例方法,那么就说子类重写了父类中的同名方法(但父类的方法必须在子类中可见),而重写则是实现多... 阅读详情

相关推荐

重载重写隐藏

是指在同一可访问区内,被声明的多个具有不同参数列表的同名函数(参数的类型,个数,顺序不同),实际调用时根据参数列表确定调用哪个函数,重载不关心函数的返回类型。特点: (1)相同的范围(在同一个类中) ;(2)函数名字相同;(3)参数不同;(参数的类型,个数,顺序不同)(4)不关心函数返回类型例如: 重载的表现形式有: 参数个数不同 参数类型不同 参数类型个数都不同.重载原理: C++代码在编译时会根据参数列表对函数进行重命名 例如void Swap(int a, int b)会被重命名为_Swap_int_

kk阿彬 1217

java中的隐藏重写分别是指什么_Java 重载重写隐藏区别

Java 重载重写隐藏区别一、重载(Overload)注意:为了正确的区分重载重写,请各位务必记清重载(Overload)重写(Override)的英文。(1)重载定义:表示两个或多个方法的名字相同,但方法的参数不同。方法参数不同有两层含义:A、参数的个数不同;B、参数的类型不同。publicvoidrun(Stringname,intcount){System.out.pri...

weixin_32172693的博客 720

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

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

m0_53133879的博客 4359

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

重载Overloading 发生要素如下: 1. 在同一作用范围内(同一个类,同一个接口) 2. 方法名必定相同 3. 形参组成不同(类型、个数均不相同 or 个数相同但类型不同 or 类型相同个数不同) 错误的认识: 1. 方法名相同,形参组成完全相同,返回类型不同也算重载(方法重载要求方法具有不同的签名:形参组成,而返回值并不算作签名内容,故不参与重载的选择) 2. abstr...

UVB-76电台 3521

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

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

小三哥的随手记 549

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

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

weixin_35899510的博客 202

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

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

xiaoyi971520_3的博客 657

Java重写(Override)、重载(Overload)、隐藏(Hide)

Java重写(Override)重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值形参都不能改变。即外壳不变,核心重写重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IO...

weixin_41924879的博客 1141

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

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

popkiler的专栏 1734

java基础——重写隐藏重载

方法签名:方法名+参数列表(参数类型、个数、顺序) 重写: 子类重写父类方法,仅限于实例方法。成员变量静态方法不能被重写,只能被隐藏重写原则: 1.方法名相同,参数类型相同。 2.子类返回类型小于等于父类返回类型。 3.子类异常小于等于父类异常。 4.子类访问权限大于等于父类访问权限。 重写方法可以改变其他方法修饰符如final,synchronize,native等。不管被...

Mutou_ren的博客 287

JAVA重写重载区别

Java重写重载机制 Java重写重载是两种在Java中经常提到的两组概念,它们在各个方面都有着很大的不同。   重载 每个类型成员都有一个唯一的签名。方法签名由方法名称一个参数列表(方法的参数的顺序类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称

teedry的专栏 4983

java子类隐藏_有人可以告诉我JAVA中子类继承父类中,什么叫做子类方法的隐藏重载隐藏?...

classtest{publicintfun(inta){}publicstringfun(stringa){}publicfloatfun(inta,stringb){}publicfloatfun(stringa,intb){}voidstringfun(floata){}voidstringfun(inta){}//该方法不是重载}前五个方法互为重载...

weixin_33274728的博客 671

107. Java 继承 - 总结:方法重写隐藏

本文总结了Java中方法重写隐藏的核心规则:1)子类实例方法可以重写超类实例方法,调用时使用子类实现;2)子类静态方法会隐藏同名超类静态方法,调用取决于类类型;3)静态方法与实例方法同名会引发编译错误。文章通过示例代码详细说明了三种情况,并区分了方法重载(参数不同)与重写区别,强调重载被视为新方法。最后指出掌握这些规则有助于避免继承体系中的常见错误。

yaoxin521123的博客 843

java重载、覆盖隐藏区别

原文章出处:http://www.cnblogs.com/xiaoQLu/archive/2013/01/07/2849869.html 重载:方法名相同,但参数不同的多个同名函数   注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同      2.返回值异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()

夏末 404

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

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

weixin_39922147的博客 167

Java必备基础十——类的继承详解——final、super关键字——重写重载的详细区别

首先明确,Java语言有三大特性: 封装性:详见本章 继承性:Java中类类可以继承,即可共用一套代码。例如所有动物类由动物共同特点来抽象描述好,针对某一类动物如猫既有动物的共同特点又有自身的特点,那么猫类可以继承动物类,然后在在自身的类中第一新的属性方法。去2前3234 传入 从 多态性:当一个类中定义的属性方法其它类继承后,可以在其它类表现出不同的类型行为,即同名的属性方法在不同的类中有不同的意义。 一、什么是继承 二、 ...

Pandafz的博客 1396

关于Java中方法的重载重写

问: 什么是方法重写?什么是方法重载?成员变量可以被重写吗? 方法重载(Overloading):在一个类中,有两个及以上的方法,它们方法名称相同,但参数列表不同,这些方法互相称为重载方法。 方法重写(Overriding):在子类父类中,若有两个方法的名称参数列表均相同,此时子类的方法将覆盖父类中的方法,称为方法重写区别与联系: \ 重载(Overloading) 重写(Ove...

Deecyn's Blog 332
上一篇: HashMap的抽丝剥茧
下一篇: String的抽丝剥茧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值