术语Override,Overload,Hide,Shadow,Obscure的解释
Override,即重写,Java最基础的编程技巧之一。仅针对实例方法,并且能够被子类所访问, 且子类该方法的访问权限至少大于父类。遵循运行期绑定原则。
Overload,即重载,Java最基础的编程技巧之一。要求方法名相同,签名不同(参数类型,参数个数,返回类型等)。遵循编译期绑定原则。
Hide,即隐藏,指实例域,静态方法,成员类型可以分别隐藏继承自超类的可访问的相同名字的实例域,静态方法,成员类型。
Shadow,即遮蔽,指一个变量,方法或类型可以分别遮蔽一个闭合的文本范围内的具有相同名字的所有变量,方法或类型。
Obscure,即遮掩,指一个变量可以遮掩一个相同名字的类型,只要它们在同一个范围内。
重点分析Hide,Shadow,Obscure的区别。
一、Hide存在于子类继承自父类的场景,且子类和父类具有相同名字的实例域,静态方法,成员类型。并且能够隐藏的东西都是父类可以访问到的。且对于静态方法来说,隐藏要求子类该静态方法的访问权限大于等于父类访问权限。
例如:
class Foo {public String className = "foo";public static void f() {}public static class innerClass {static String innerName = "FooInner";}
}class Sub extends Foo {String className = "sub";static void f() {}static class innerClass {static String innerName = "SubInner";}
}
这个案例就是隐藏,但是Sub的f()无法编译通过,因为它的访问权限小于父类。但是实例域或成员类型(Member Type)对于访问权限没有这个限制。
关于成员类型,Oracle官方给了解析,链接: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.5。可以看出成员类型大概指内部类或者接口。
二、Shadow存在于一个闭合的范围内,当一个变量与另一个实例域或者对象或者方法同名将发生遮蔽,最常见的两种遮蔽:
1.成员变量名和局部变量名相同,这局部变量所在的范围内,无法访问到成员变量。
2.构造方法的参数名和成员变量名相同,成员变量被遮蔽,这种遮蔽是合法的,也是类初始化有参构造器最常见的写法。
例如:
public class WhoKnows {static String sentence = "I don't know.";public static void main(String[] args) {String sentence = "I know!"; // shadows static fieldSystem.out.println(sentence); // prints local variableBelt belt = new Belt(3);System.out.println(belt.getSize());}
}class Belt {private int size;public Belt(int size) { // Parameter shadows Belt.sizethis.size = size;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}
三、Obscure存在于同一个范围内,一个变量名遮掩另一个相同变量名的类型。
例如:
public class Obscure {static String System; // Obscures type java.lang.Systempublic static void main(String[ ] args) {// Next line won't compile: System refers to static fieldSystem.out.println("hello, obscure world!");}
}
这个例子中System作为一个不规范的变量名遮掩了java.lang.System类,导致了Obscure类中,所有的本该引用java.lang.System的地方都引用了String类型的System,从而导致编译错误。
比较Shadow和Obscure,二者很相似。但是还是有点区别:
1.由Shadow导致的遮蔽通常不会发生编译错误。它只是在一个闭合的文本范围内覆盖了另一个同名的实例。但是由Obscure导致的遮掩却极易导致编译错误,尤其是和Java平台已有的类重名时。
2.遮蔽通常只是覆盖一个实例或方法,而遮掩却覆盖了整个类型。
术语Override,Overload,Hide,Shadow,Obscure的解释相关推荐
- java 中的override overload 比较
java 中的override & overload 比较 很久没看Java,忘记override和overload的区别了.百度了一下,把一个小弟的文章抄下来,备用. 方法的重写(Overi ...
- C++中override overload overwrite
C++中override overload overwrite 1. overload(重载)(不是多态) 重载:是指同一可访问区内被声明的几个具有不同的参数列(参数类型.参数个数.顺序不同)的同名函 ...
- overwrite java_Java中的Override, Overload和Overwrite
中文翻译分别是覆盖,重载和重写 Override 和 Overwrite 实际上覆盖(Override)和重写(Overwrite)是对同一概念的不同称呼. 重写是子类对父类的允许访问的方法的实现过程 ...
- Java凝视Override、Deprecated、SuppressWarnings具体解释
一.什么是凝视 说起凝视,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描写叙述数据的.就象数据表中的字段一样,每一个字段描写叙述了这个字段下的数据的含义.而 ...
- 【Linux】/etc/shadow文件字段解释
只有root用户才能查看/etc/shadow文件,通过此文件,管理员可以对其他用户进行管理. [root@master ~]# grep oracle /etc/shadow oracle:$6$e ...
- 神经网络术语及方法的意思,神经网络通俗解释
什么叫神经网络? 南搞小孩给出基本的概念:一.一些基本常识和原理[什么叫神经网络?]人的思维有逻辑性和直观性两种不同的基本方式. 逻辑性的思维是指根据逻辑规则进行推理的过程:它先将信息化成概念,并用符 ...
- 关于多态override/overload
多态是面向对象的特性之一,理解也不是特别困难,但是最近发现很多人喜欢把多态和覆盖(Overriding,暂且这么翻译吧)搅在一起.其实自己刚开始学的时候也曾经有过困惑,什么叫做重载(Overloadi ...
- 常见的金融术语——176个基础金融知识名词解释
基金类 1.开放式基金(open-end funds) 指基金规模不是固定不变的,而是可以随时根据市场供求情况发行新份额或被投资人赎回的投资基金. 2.封闭式基金(close-end funds) 指 ...
- C++多态及重载(overload),覆盖(override),隐藏(hide)的区别
转自 Hackbuteer1 http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编 ...
最新文章
- typeScripy-番外篇之命名空间和模块
- 7.04 -2018-长沙机场笔试总结
- 三、linux目录浏览管理及维护
- Linux CentOS 6.5 + Apache + Mariadb + PHP环境搭建
- python贪吃蛇毕业设计_【干货|python项目实例——贪吃蛇】- 环球网校
- Linux进阶之路————用户管理
- 万字详述 MySQL ProxySQL
- 关键业务开放平台助金融行业数字化转型
- 在CentOS上,Servlet出现java.lang.NoClassDefFoundError
- 开源cms系统We7插件开发准备工作全面就绪
- 哈希函数 英语单词_使用Hash表实现英文单词表并实现单词查询操作
- 网站性能优化之DNS Prefetch
- Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息
- vue项目中引入阿里云滑动验证
- SuperMap iDesktop .NET 9D(2019)产品白皮书
- 8月1号起 银行卡、支付宝、微信的这些费用可以省了!
- 零基础Bootstrap入门教程(25)--折叠面板、折叠面板导航
- mysql case when then end 和 if判断 常见使用方法
- 电磁场与仿真软件(17)
- java医院挂号代码_基于SSM开发的Java医院预约挂号系统 源码下载