知乎上看到一问题很好,拿了与大家分享,原地址: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的更多相关文章

  1. 继承进一步使用,以及super关键字

    目标: 1)掌握子类对象实例化过程 2)掌握方法覆盖概念和实现. 3)掌握super关键字的作用. 一,子类对象实例化过程 子类对象在实例化之前,必须先调用父类中的构造方法,再调用子类中的构造方法. ...

  2. 10种简单的Java性能优化

    你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧. 最近“全网域(Web Scale)”一词被炒得火热,人 ...

  3. 【转】10种简单的Java性能优化

    10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...

  4. 10种简单的Java性能优化(转)

    本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加入翻译小组.转载请见文末要求. 你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了 ...

  5. 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释

    我想这应该是Java构造函数的一种机制吧,首先以子类和父类为例.当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示的 ...

  6. Java中static、this、super、final的用法

    一.          static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...

  7. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  8. 文件类似的推理 -- 超级本征值(super feature)

         基于内容的变长分块(CDC)技术,能够用来对文件进行变长分块.而后用来进行反复性检測,广泛用于去重系统中.后来又出现了对相似数据块进行delta压缩,进一步节省存储开销. 所以就须要一种高效 ...

  9. Python内置函数(30)——super

    英文文档: super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent ...

随机推荐

  1. 4.Single Number(出现一次的数)

    Level:   Easy 题目描述: Given a non-empty array of integers, every element appears twice except for one. ...

  2. wordpress显示FTP上传

    在开始添加的配置文件里添加以下内容 define("FS_METHOD","direct"); define("FS_CHMOD_DIR", ...

  3. 牛客Professional Manager(并查集)

    t’s universally acknowledged that there’re innumerable trees in the campus of HUST.  Thus a professi ...

  4. yii2 basic VER

    assets/ contains assets definition 包含资源定义 commands/ contains console commands (controllers) 包含命令行命令, ...

  5. mysql+gtid主从同步

    安装mysql  yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1. ...

  6. sql函数将1,2,3转换为表

    /****** Object: UserDefinedFunction [dbo].[splitstring_to_table] Script Date: 2017/7/11 9:35:58 **** ...

  7. qsor快排序以及cmp函数

    void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 各参数:1 待 ...

  8. vue自定义指令拖动div

    钩子函数一个指令定义对象可以提供如下几个钩子函数:bind:只掉用一次,指令第一次绑定到元素是调用,在这里可以进行一次性的初始化设置inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不 ...

  9. bootstrap-datepicker控件中文 ,只显示年和只显示月份

    插件下载地址 https://github.com/uxsolutions/bootstrap-datepicker html <link href="css/bootstrap-da ...

  10. animition动画的加入

    很多时候我们把PopupWindow用作自定义的菜单,需要一个从底部向上弹出的效果,这就需要为PopupWindow添加动画. 在工程res下新建anim文件夹,在anim文件夹先新建两个xml文件 ...