Java中super()的使用
目录
1.super()的使用实例 一一一子类重写父类的方法
2.super()的使用实例 一一一子类重写父类的变量
3.super()的使用实例 一一一在子类的构造方法中
4.关于构造方法中super()
第一种情况:编译不通过
第二种情况:编译不通过
第三种情况:成功编译通过
1.super()的使用实例 一一一子类重写父类的方法
public class A {private String nameA="A";public void getName() {System.out.println("父类"+nameA);}public static void main(String[] args) {}}public class B extends A{private String nameB="B";@Overridepublic void getName() {System.out.println("子类"+nameB);super.getName();}public static void main(String[] args) {B b=new B();b.getName();}
}
运行结果:
结果分析:
在子类B中,我们重写了父类的getName方法,如果在重写的getName方法中我们去调用了父类的相同方法,必须要通过super关键字显示的指明出来。
如果不明确出来,按照子类优先的原则,相当于还是再调用重写的getName()方法,此时就形成了死循环,执行后会报java.lang.StackOverflowError异常。如下图所示:
2.super()的使用实例 一一一子类重写父类的变量
public class A {String nameA="A";}public class B extends A{String nameA="B";public void getName() {System.out.println("子类"+nameA);System.out.println("父类"+super.nameA);}public static void main(String[] args) {B b=new B();b.getName();}
}
运行结果:
此时子类B中有一个和父类一样的字段(也可以说成父类字段被隐藏了),为了获得父类的这个字段我们就必须加上super,如果没有加,直接写成name = name;不会报错,只是会警告,表示此条语句没有任何意义,因为此时都是访问的子类B里面的那么字段。
我们通过super是不能访问父类private修饰的变量和方法的,因为这个只属于父类的内部成员,一个对象是不能访问它的private成员的。
3.super()的使用实例 一一一在子类的构造方法中
编译器会自动在子类构造函数的第一句加上 super(); 来调用父类的无参构造器;此时可以省略不写。如果想写上的话必须在子类构造函数的第一句,可以通过super来调用父类其他重载的构造方法,只要相应的把参数传过去就好。
因此,super的作用主要在下面三种情况下:
1、调用父类被子类重写的方法;
2、调用父类被子类重定义的字段(被隐藏的成员变量);
3、调用父类的构造方法;
其他情况,由于子类自动继承了父类相应属性方法,关键字super可以不显示写出来。
4.关于构造方法中super()
第一种情况:编译不通过
分析:
如果一个类中没有写任何的构造方法,JVM会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为super(),一般这句话省略了)。所以当在父类中定义了有参构造函数,都是没有定义无参构造函数时,IDE会强制要求我们定义一个相同参数类型的构造器。
在本例中JVM默认给B加了一个无参构造方法,而在这个方法中默认调用了super(),但是父类中并不存在该构造方法
第二种情况:编译不通过
同样编译错误,相同的道理,虽然我们在子类中自己定义了一个构造方法,但是在这个构造方法中还是默认调用了super(),但是父类中并不存在该构造方法
第三种情况:成功编译通过
public class A {public A(String s) {}}public class B extends A{public B(String s) {super(s);}
}
分析:
所以,只要记住,在子类的构造方法中,只要里面没有显示的通过super去调用父类相应的构造方法,默认都是调用super(),即无参构造方法,因此要确保父类有相应的构造方法。
欢迎大家访问我的公众号,一起来学习成长:
Java中super()的使用相关推荐
- java里面super(),Java中super
Java中super 1. super代表父类?代表父类的对象?还是代表父类的引用?为什么super()在构造方法,super.fun()在方法能用?个人认为应该是super表示对象才能这么调用,可父 ...
- java中super的三种用法
java中super的用法 super只在子类中出现 super有三种用法 [1] super.xxx; xxx可以是类的属性. 例如super.name;即从子类中获取父类name属性的值 [2] ...
- Java中super关键字及super()的使用
Java中super关键字及super()的使用: 1.super的使用: (1)super是一个关键字. (2)super和this很类似,我们对比着学习. 2.先复习一下this关键字的使用. ( ...
- Java中super详解
目录 Java中super详解 super的作用: 1. 通过super可以访问父类的构造方法 2. 通过super可以访问父类的属性(非私有) 3. 通过super可以访问 ...
- Java中super关键字详解
Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...
- Java中super方法的使用
Java中super方法的使用 super关键字: (1)super能出现在实例方法和构造方法中. (2)super的语法是"super."和"super()" ...
- java中super的用法
java中super的用法 super只在子类中出现 super有三种用法 [1] super.xxx; xxx可以是类的属性. 例如super.name;即从子类中获取父类name属性的值 [2] ...
- Java中super关键字及其作用
Java中super关键字及其作用 super关键字及其作用 A:super关键字指代父类对象引用(super代表父类存储空间的标识) B:作用: a:访问被子类隐藏的父类同名成员变量和成员方法 : ...
- java中super用来定义父类,Java中super的几种用法及与this的区别
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
- java中super关键字_java中super关键字有什么用法
Java中在执行子类的构造方法之前或者子类没有明确指定构造方法,会自动调用父类的无参构造方法. (视频教程推荐:java课程) super的三种使用情况: 访问父类方法中被覆盖的方法. 调用父类构造方 ...
最新文章
- 构建深度学习框架运行平台
- css3选项卡样式,css3选项卡标题样式设计1
- 使用NeMo快速完成NLP中的信息抽取任务,英伟达专家实战讲解,内附代码
- STM32上使用JSON
- C ++ 类 | 构造函数w参数_6
- 2000条你应知的WPF小姿势 基础篇57-62 依赖属性进阶
- Echarts教程_1-2 简介
- 基于 Vue3 的颜色选择器
- UVA 10451 Ancient Village Sports UVA 11909 Soya Milk UVA 11152 Colourful Flowers
- 16、git删除暂存区文件
- 神经网络训练算法的调用,人工神经网络训练案例
- 前序+中序 =〉后序
- 9款最佳项目集管理工具
- 几种常见的开源软件许可协议(GPL, LGPL, Apache License, BSD)
- 18对个人财富的窥视——对一款手机木马的解读及分析
- 散转程序c语言,单片机 散转程序设计 软件实验
- javascript停止页面所有计时器
- 达尔优键盘Mac Command-c和Command-v复制粘贴快捷键失效问题解决方案
- 一种无需调查船上坞的调查设备安装测量方法和安装测量系统
- python里面title_python中title=(.*?)是什么意思