《JDK源码剖析》super三问,刷新你的认知
【摘要】 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆❤️技术活,该赏❤️点赞 👍 收藏 ⭐再看,养成习惯可私信我,进社群,有送书等更多活动! 问题问题1:super的含义是父类的引用吗?问题2:下面Test 的main方法执行后,打印的内容是什么?问题3:C类中的super,是指C,还是B,或是A?p...
❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆
❤️技术活,该赏
❤️点赞 👍 收藏 ⭐再看,养成习惯
可私信我,进社群,有送书等更多活动!
问题
问题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()在第一行的原因就是: 子类有可能访问了父类对象, 假如在构造函数中使父类对象的成员函数和变量, 在成员初始化使用了父类,在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)