进一步了解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 ...
随机推荐
- PAT天梯赛 L1-049 天梯赛座位分配
题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...
- springboot整合dubbo注解方式(三)
笔者用自己代码测试时候发现这个版本信息,可以没有,也可以制定一个就可以了,没有太大的问题,只是需要注意引入的依赖问题,两个jar与一个jar的问题, 然后就是接口公共依赖问题,案例是把我找的几个案例进 ...
- 架构师 AI 技术
架构师是大忽悠吗?阿里技术大牛告诉你真相! - huangshulang1234的博客 - CSDN博客https://blog.csdn.net/huangshulang1234/article/d ...
- pm2 启动后台 node js
1,安装node js 参看:https://www.cnblogs.com/wf-l5201314/p/9229974.html 2,pm2安装(安装环境linux / os) 命令:npm ins ...
- C# 事务提交(非数据库)
.Net 2.0开始支持 static void Main(string[] args) { using (TransactionScope ts = new TransactionScope()) ...
- Photoshop入门教程(一):文本新建与概念解析
写在开头 <Photoshop实用入门>系列教程可能对于一点都没有接触过Photoshop的人来说不太容易接受,因为本教程并没有细致到教你如何使用画笔工具等一系列很基础的东西,有些地方的讲 ...
- thinkPHP5.0获取器
获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用: class Cate extends Model { public function getTypeAttr ...
- thinkPHP5.0验证码不显示
1.使用composer安装时,验证码无法正常显示 主要是因为验证码扩展库的版本安装不正常,官方的5.0版本的扩展库版本号都是1.*,默认安装的是2.0版本,2.0版本均为ThinkPHP5.1版本专 ...
- python 数据可视化---Anscombe’s quartet
import seaborn as sns sns.set(style="ticks") # Load the example dataset for Anscombe's qua ...
- Nginx 为什么要延迟关闭
防止 Nginx处理完后调用close关闭连接后 ,若缓冲区任然接收到客户端发来的内容 ,则服务器会向客户端发送RST包关闭连接,导致客户端由于收到了RST而忽略了 http response ...