Java中super关键字详解
目录
- super有什么用?
- super什么时候不可以省略呢?
- super在内存图中是如何存在的呢?
- super使用时的注意事项
- 总结
super有什么用? (1)当子类中构造方法第一行没有super时,会默认第一行有一个super(),它的作用是调用父类的无参构造。
例:
class A{ public A(){System.out.println("父类构造方法执行!"); }}public class superTest extends A{ public superTest(){//这里会有一个默认的super(),会调用父类的无参构造。System.out.println("子类构造方法执行!"); } public static void main(String[] args){superTest s = new superTest(); }}
执行结果如下:
文章图片
(2)如果想要调用父类中的有参构造,可以在子类构造方法第一行加super(形式参数列表),这里的形式参数列表与父类中想要调用的有参构造的形式参数列表相对应。
例:
class A{ //无参构造 public A(){System.out.println("父类无参构造方法执行!"); } //有参构造 public A(int a){System.out.println("父类有参构造方法执行!"); }}public class superTest extends A{ public superTest(){super(100); System.out.println("子类构造方法执行!"); } public static void main(String[] args){superTest s = new superTest(); }}
执行结果如下:
文章图片
(3)子类中可以通过super.xxx的方式,调用父类型特征(实例变量);通过==super.xxx()==的方式,调用父类型方法(实例方法)。
class A{ String name; public A(String name){this.name = name; }}public class superTest extends A{ public superTest(String name){super(name); } public void shopping(){System.out.println(super.name + "正在购物!"); } public static void main(String[] args){superTest s = new superTest("张三"); s.shopping(); }}
运行结果如下:
文章图片
super什么时候不可以省略呢? super和this很相似,很多时候都可以省略。Java中允许子类中出现和父类一样的同名变量,如果想在子类中访问父类中的同名特征,那么super就不能省略。
class A{ String name; public A(){name = "张三"; }}public class superTest extends A{ String name; public superTest(){name = "李四"; } public void dosome(){System.out.println(this.name + "dosome !"); //系统会自动将 name 看作 this.nameSystem.out.println(name + "dosome !"); System.out.println(super.name + "dosome !"); } public static void main(String[] args){superTest s = new superTest(); s.dosome(); }}
运行结果如下:
文章图片
super在内存图中是如何存在的呢? 以上面的代码为例,画出了大概的内存图,如下:
文章图片
super使用时的注意事项 (1)super()表示通过子类的构造方法调用父类的构造方法。模拟现实中这种场景:想要有儿子,必须先有父亲。
(2)当一个构造方法第一行:
既没有this(),又没有super()的话,会默认会有一个super();
表示通过当前子类构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。
(3)this()和super()不能共存,都是只能出现在构造方法第一行。
【Java中super关键字详解】(4)父类的构造方法是一定会执行的。
(5)在Java语言中,无论new什么对象,Object类中的无参构造一定会执行,并且是处于栈顶(最后被调用,但是最先执行结束,后进先出)。
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- Java中的抽象类和接口你了解吗
- Java高性能本地缓存框架Caffeine
- 东周列国志|《东周列国志》第四十六回 楚商臣宫中弑父 秦穆公崤谷封尸
- java|【Java成王之路】第三篇(Java SE(程序逻辑控制))
- java|【Java成王之路】第二篇(Java SE(基本数据类型和运算符))
- java|【Java成王之路】第一篇(Java SE入门(1))
- Java数据结构与算法笔记|贪心算法笔记
- 编码学习笔记|阿里巴巴Java开发手册阅读笔记
- 大厂面试题|【2021Java后端面试题整理】JVM面试题+面经答案
- JVM|大白话快速总结Java虚拟机