关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)

刚接触Java的童鞋只有对java的多态性,覆写(override)和重载(overload)有所了解:
覆写是针对基类对超类方法的覆写,覆写方法不能使用比被覆写方法更严格的访问权限
重载方法的指在一个类中可以定义相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型)


下面主要介绍一下在《Java解惑》一书当中讲到的隐藏(hide)、遮掩(obscure)、遮蔽(shadow)这三个概念。

隐藏

是指一个域、静态方法或成员类型可以分别隐藏其超类的可访问到的相同名字的域、静态方法或成员类型

关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)_第1张图片

遮蔽

当一个声明遮蔽了另一个声明时,简单名将引用到遮蔽声明中的实体
最容易产生的遮蔽:局部变量与成员变量同名时,就会发生遮蔽。(比如生命了成员变量,又在局部声明一个同名变量)
这种遮蔽往往也最容易产生错误。
一种最常见的遮蔽: 构造方法中参数名与成员名相同时
关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)_第2张图片

遮掩

“一个变量可以遮掩具有相同名字的一个类型,只要它们都在同一个范围内:如果这个名字被用于变量与类型都被许可的范围,那么它将引用到变量上。相似地,一个变量或一个类型可以遮掩一个包。遮掩是唯一一种两个名字位于不同的名字空间的名字重用形式,这些名字空间包括:变量、包、方法或类型。如果一个类型或一个包被遮掩了,那么你不能通过其简单名引用到它,除非是在这样一个上下文环境中,即语法只允许在其名字空间中出现一种名字。”
“遮蔽与遮掩非常相像,二者的关键区别是一个声明只能遮蔽类型相同的另一个声明:一个类型声明可以遮蔽另一个类型声明,一个变量声明可以遮蔽另一个变量声明,一个方法声明可以遮蔽另一个方法声明。与其形成对照的是,变量声明可以遮掩类型和包声明,而类型声明也可以遮掩包声明。”(——《JAVA解惑》) 
关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)_第3张图片
关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)_第4张图片

你可能感兴趣的:(Java)