• 进一步了解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();
        }
    }
  • 相关阅读:
    wpf图片查看器,支持鼠标滚动缩放拖拽
    Python 3.x 学习笔记--杂
    Python 3.x 模块
    python 连接kafka
    Oracle问题
    Device Mapper Multipath(DM-Multipath)
    各种书籍
    Centos 6.x系统
    老男孩Python 3.x 讲义
    Python 3.x 学习笔记
  • 原文地址:https://www.cnblogs.com/hihtml5/p/6427906.html
Copyright © 2020-2023  润新知