《JDK源码剖析》super三问,刷新你的认知

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《JDK源码剖析》super三问,刷新你的认知相关的知识,希望对你有一定的参考价值。

❤️作者主页:小虚竹

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆

❤️技术活,该赏

❤️点赞 👍 收藏 ⭐再看,养成习惯

PC端左侧加我微信,进社群,有送书等更多活动!

问题

问题1:super的含义是父类的引用吗?
问题2:下面Test 的main方法执行后,打印的内容是什么?
问题3:C类中的super,是指C,还是B,或是A?

public abstract class A 


public abstract class B extends A 
    

public class C extends B 
    @Override
    public String toString() 
        return super.toString();
    


public class Test 
    public static void main(String[] args) 
        C c = new C();
        System.out.println(c.toString());
    

解决方案

只要懂得super的底层原理,上面这三个问题的答案就出来了。
super的含义:指向当前对象的父类型特征;

super代表继承关系,通过它能访问到 已经继承 到子类中的属于父类的属性和方法。

像这题如果父类没有重写toString方法,会再往上找,直到找到为止(最终类的是Object类)。
问题2的答案: 打印的是C的内存地址。
问题3的答案: 这题是个陷阱题,不是A,B,C。而是指向当前对象的父类型特征;

扩展

  • this和super一样,都是对象内部的引用变量,只能出现在对象内部;
  • super能出现在实例方法和构造方法中。
  • super不能出现在静态方法中。

静态方法是存储在静态区内的,静态区会随着类加载器一起加载到内存当中,这时候,只是加载到内存当中,但是并没有真正的去运行,此时也就没有产生实例化的对象。对象都没有,super是不存在的。

  • super()都只能出现在构造方法的第一行

super()在第一行的原因就是: 子类有可能访问了父类对象, 假如在构造函数中使父类对象的成员函数和变量, 在成员初始化使用了父类,在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化。

以上是关于《JDK源码剖析》super三问,刷新你的认知的主要内容,如果未能解决你的问题,请参考以下文章

super三问,刷新你的认知

全面复盘 B 站面试时坑我最深的 Java 并发:JDK 源码剖析

阿里面试坑我最深的 Java 并发:JDK 源码剖析,在CSDN补到课了!

阿里大牛手写的JDK源码剖析手册与并发编程图册,完美诠释高并发

Java源码—JDK 1.8 HashMap重点源码部分剖析

阿里大牛最新出产:JDK源码剖析手册与并发编程图册,完美诠释高并发