Java中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.name
System.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()不能共存,都是只能出现在构造方法第一行。
(4)父类的构造方法是一定会执行的。
(5)在Java语言中,无论new什么对象,Object类中的无参构造一定会执行,并且是处于栈顶(最后被调用,但是最先执行结束,后进先出)。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
相关文章
Springboot 引入 Redis 并配置序列化并封装RedisTemplate
这篇文章主要介绍了Springboot 引入 Redis 并配置序列化并封装RedisTemplate。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下2022-09-09
深入研究spring boot集成kafka之spring-kafka底层原理
这篇文章主要深入研究了spring boot集成kafka如何实现spring-kafka的底层原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步2022-02-02
mybatis-plus报错Not Found TableInfoCache异常问题
在集成百度uid-generator过程中,MyBatis-Plus报错NotFoundTableInfoCache异常,解决方法:检查实体类是否继承了官方model,确保实体类对应的mapper已正确注入,在使用@Component注解时,应保证相关依赖已注入2024-09-09


最新评论