进一步了解this和super
知乎上看到一问题很好,拿了与大家分享,原地址:https://www.zhihu.com/question/31548104。
问:
JAVA 中this 和super与覆写冲突的问题?
实例一:
输出为
child
Grandfather
child
father
从示例1可以知道
this总是指向调用该方法的对象,而super总是用于调用处方法所处的类的直接父类
实例二:
而实例二中
输出为
Child
Father
仅仅是将父类print改为private让子类无法覆写,为何子类对象使用this就能调用到父类的print函数?
还是说示例一的推论有误?
问题一出下面一片评论各种答案,我比较赞同http://zhihu.com/question/31548104/answer/83225999这位答主的说法,他提到了编译期绑定和动态绑定的观念。
另外建议阅读http://zhihu.com/question/31548104/answer/52766366的答案,根据编译后的字节码进行解答,讲的比较底层。
下面是我根据他们的回答做的一些总结:
有A类和B类,B类扩展自A:
- class A{
- //私有的方法不会被继承
- private void a1(){
- System.out.println("A>a1");
- }
- public void a1(){
- System.out.println("A");
- /*编译时会检测调用的方法a1是否私有权限,若私有说明此方法不会被继承,也就不存在多态(子类重写此方法)的可能了,那么这里编译时会直接绑定a1为A类的a1,如果方法能被继承则说明有多态的可能,那么编译为动态绑定,当调用时根据this指向的引用实例执行方法。*/
- this.a1();
- }
- }
- /*B能继承到a2但继承不到a1,因为a1是父类私有的*/
- class B extends A{
- //这里的a1不是重写,而是B里新的一个函数,因为根本没有从A里继承到a1,所以不存在重写的说法
- public void a1(){
- System.out.println("B>a1");
- }
- //可以去重写a2
- public void a2(){
- System.out.println("B");
- //这里调用的是B的a1
- this.a1();
- }
- }
- public Test1{
- public static void main(String[] args){
- B b= new B();
- b.a1();
- b.a2();
- }
- }
进一步了解this和super的更多相关文章
- 继承进一步使用,以及super关键字
目标: 1)掌握子类对象实例化过程 2)掌握方法覆盖概念和实现. 3)掌握super关键字的作用. 一,子类对象实例化过程 子类对象在实例化之前,必须先调用父类中的构造方法,再调用子类中的构造方法. ...
- 10种简单的Java性能优化
你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧. 最近“全网域(Web Scale)”一词被炒得火热,人 ...
- 【转】10种简单的Java性能优化
10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...
- 10种简单的Java性能优化(转)
本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加入翻译小组.转载请见文末要求. 你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了 ...
- 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释
我想这应该是Java构造函数的一种机制吧,首先以子类和父类为例.当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示的 ...
- Java中static、this、super、final的用法
一. static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...
- DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...
- 文件类似的推理 -- 超级本征值(super feature)
基于内容的变长分块(CDC)技术,能够用来对文件进行变长分块.而后用来进行反复性检測,广泛用于去重系统中.后来又出现了对相似数据块进行delta压缩,进一步节省存储开销. 所以就须要一种高效 ...
- Python内置函数(30)——super
英文文档: super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent ...
随机推荐
- PHP中SESSION无法获取问题
近期在看公司老项目,前台可以正常访问,但是后台却无法登录,一直报请求超时,请重新登录!进入服务后发现是有一处SESSION的值无法获取,这就让人很郁闷了,通常SESSION无法使用都是因为没有使用se ...
- git ignore文件
创建.gitignore文件来设置git要忽略的文件模式: 官方文件列列表:https://github.com/github/gitignore 1. 所有空行或者以 # 开头的行都会被 Git 忽 ...
- docker上安装eslaticsearch
一 elasticsearch安装 1 查找镜像: docker search elasticsearch 可以看到如下截图; 2 拉取镜像 docker pull elasticsearch 我并没 ...
- Report Server运行后一直处于加载状态
描述:对Report server做了一个小练习,算是入门,但发现运行起来后,页面一直处于加载状态,不知为何? 解决:查了一下网上的资料,解决的方法是 protected void Page_Load ...
- 07-图5 Saving James Bond - Hard Version (30 分)
This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...
- django组件之ajax
AJAX简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...
- Lvs Tun隧道模式配置
######## TUN是IP Tunneling ,IP隧道的简称,它将调度器收到的IP数据包封装在一个新的IP数据包中,转交给应用服务器,然后实际服务器的返回数据会直接返回给用户. 工作原理: 用 ...
- Java学习笔记day05_方法重载
1.方法的重载overload 在同一个类中, 允许出现同名的方法, 只要方法的参数列表不同即可. 参数列表不同: 参数个数不同, 参数类型不同, 顺序不同. public class MethodO ...
- python : No such file or directory
windows上写的python脚本,在linux上执行时报: No such file or directory 解决方法一# sed -i 's#\r##' mysqlchk.py 解决方法二脚本 ...
- python3 pip使用报错
在windodws上pip3使用了很长时间,今天突然报错. Fatal error in launcher: Unable to create process using '"' 解决方案 ...