Java笔记: 继承成员覆盖和隐藏
在扩展类时,既可以向类中添加新的成员,也可以重新定义现有的成员。重定义现有成员的具体效果取决于成员的类型。本文不会详细的介绍概念,只简要总结覆盖(overriding,也叫重写)和隐藏(hiding)中最关键的地方。
方法覆盖的条件
概念:一个方法将方法的超类实现替换为自己的实现。覆盖并不要求两个方法类型完全一致,具体要求总结如下:
- 签名: 覆盖方法的签名必须与超类相同,签名即为方法名和参数类型列表。
- 返回类型: 覆盖方法返回类型可以是超类方法返回类型的子类型。
- 访问权限: 覆盖方法可以改变访问修饰符,但只能提供更多的访问权限。
- 异常: 覆盖方法抛出的异常可以比超类少,也可以是其子类型。
这些要求的规律就是覆盖的方法必须要与超类方法兼容,因为这样可以保证重写之后超类方法的契约仍然成立。
继承成员的访问
调用哪个(非静态)方法是由对象的实际类型决定的,访问哪个字段是由引用的类型决定的。参考如下示例:
class SuperShow {
public String str = "SuperStr";
public void show() {
System.out.println("Super.show: " + str);
}
}
class ExtendShow extends SuperShow {
public String str = "ExtendStr";
public void show() {
System.out.println("Extend.show: " + str);
}
public static void main(String[] args) {
ExtendShow ext = new ExtendShow();
SuperShow sup = ext;
sup.show();
ext.show();
System.out.println("sup.str = " + sup.str);
System.out.println("ext.str = " + ext.str);
}
}
输出结果如下:
$ java ExtendShow
Extend.show: ExtendStr
Extend.show: ExtendStr
sup.str = SuperStr
ext.str = ExtendStr
根据之前所说的规则,show方法的调用总是会到ExtendShow类的版本上,这是由对象的实际类型决定的。而str的访问则是由引用决定,具体访问哪一个字段在编译期基于引用的类型决定。
Java笔记: 继承成员覆盖和隐藏的更多相关文章
- Java笔记 —— 继承
Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...
- java的重载、覆盖和隐藏的区别
重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...
- java中重载、覆盖和隐藏三者的区别分析
重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...
- [Java笔记]继承
继承只是继承框架,而数据没有继承!. 继承不改变父类数据!
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- JAVA中方法和变量在继承中的覆盖和隐藏
出处:http://renyanwei.iteye.com/blog/258304 我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际 ...
- JAVA中方法和变量在继承中的覆盖和隐藏(一)
我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...
- Java中方法的重写与成员变量的隐藏
这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? public class ...
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...
随机推荐
- 纪录片 - Why Are We Fat?(全3集)
1. 传送门:https://www.bilibili.com/video/av13977351?spm_id_from=333.338.__bofqi.16 2. 笔记 第一型糖尿病是天生的,第二型 ...
- Design and History FAQ for Python3
Source : Design and History FAQ for Python3 Why is there no goto? 你可以通过异常来获得一个可以跨函数调用的 "goto 结构 ...
- rundll32.exe文件详解
平时很常听到有些朋友说:呀,我系统的注册表启动项目有rundll32.exe,系统进程也有rundll32.exe,是不是病毒呀?这是对rundll32.exe接口不了解,其实其原理非常简单,了解并掌 ...
- 高手教大家如何配置JVM参数
/usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K ...
- ES6之新的数据结构
Set Set 类似于数组,是一种集合的数据结构,和 Array 之间最大的区别是: Set中所有的成员都是唯一的. 可以把Set想象成是一个: 既没有重复元素,也没有顺序概念的数组. Set 本身是 ...
- BUU re xor
从13行和18行的0x21(c规定十六进制必须用0x**表示)可以知道这个字符串就是33个字符 shift+e来提取出数组中的字符: 设这个数组是global数组 global[] = { 102, ...
- Go语言 | 哪些大公司在用go语言?
Go大概09年面世以来,已经8年了,也算是8年抗战.在这8年中,已经有很多公司开始使用Go语言开发自己的服务,甚至完全转向Go开发,也诞生了很多基于Go的服务和应用,比如Dokcer.k8s等,现在我 ...
- 新闻网大数据实时分析可视化系统项目——8、Flume数据采集准备
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...
- 小程序的tabar顶部和底部导航的区别
最近有人说小程序的底部tabar放在顶部会出现问题,那么先看看如何放在顶部吧:图片效果: 这里呢,在官方文档是有说明,tabbar 的属性设置里面有个position属性,position只支持bot ...
- [LuoguP1203][USACO1.1]P1203 Broken Necklace
Solution 这道题数据规模奇小,因此大部分人都使用了暴力搜索的方法,这也是我一开始的想法. 对于 100100%100 的数据,3≤n≤3503≤n≤3503≤n≤350 的确可以如此,但暴力搜 ...