前言:
此时小伙伴们对“java中的关键字”大约比较看重,同学们都想要了解一些“java中的关键字”的相关文章。那么小编同时在网摘上汇集了一些有关“java中的关键字””的相关资讯,希望各位老铁们能喜欢,咱们快快来了解一下吧!“这里是云端源想IT,帮你轻松学IT”
嗨~ 今天的你过得还好吗?
待天亮后
做一朵暗处迎盛阳的玫瑰
- 2023.09.04 -
你第一次遇到super关键字是什么时候呢?是不是使用IDEA或者eclipse快捷键生成类构造方法的时候出现在构造方法第一行的super()语句呢?
在没有了解super关键字之前,相信你是很疑惑这行代码的作用的,没关系,本文带你全面详解super关键字,你就会知道这行代码有什么作用了。
一、super关键字介绍
super关键字是Java中用于调用父类中的方法和变量的关键字。在子类中使用super关键字可以调用父类中的方法和变量,也可以在子类中访问父类中的方法和变量。super关键字可以用于继承多个父类的情况下,访问这些父类中的方法和变量。在使用super关键字时,需要注意父类的声明顺序和变量名称的区分。
super关键字和this关键字用法比较相似。通俗讲创建一个子类和父类,super在子类中可以引用父类内容,即就是调用父类成员方法、成员变量和构造方法。
我们将super关键字与this关键字对比来介绍,两者有许多相似之处:
this只能出现在构造方法和实例方法(不带staric关键字的方法)之中,代表的是当前正在调用这个方法的对象;super也只能出现在构造方法和实例方法中,代表的是当前对象的父类型特征。
怎么去理解这个父类型特征呢?
super关键字代表的就是“当前对象”的那部分父类型特征。 比如: 我继承了我父亲的一部分特征 例如:眼睛、皮肤等,那么super代表的就是“眼睛、皮肤等”,“眼睛、皮肤等”,虽然是继承了父亲的,但这部分是长在我身上的。
二、Super关键字的语法
1、 super的第一种语法是:“super(实参列表)”
这种语法的作用是:通过子类的构造方法去调用父类的构造方法,用来给当前子类的父类型特征初始化值。
注意:
1)这里的父类型特征指的是从父类继承过来的那部分属性或者行为;
2)虽然调用了父类的构造方法,但是并没有在底层创建父类对象,只是给当前子类对象的父类型特征赋了值,实际上对象只有当前子类对象一个;
3)super(实参列表)只能出现在子类构造方法的第一行;
4)super(),括号里没有参数代表调用父类的无参数构造方法;
5)因为需要模拟现实世界中有父母才会有儿子的这种关系,所以java有一条语法就是:子类的构造方法中第一行如果没有super(),也会默认有一个super(),表示通过子类构造方法去调用父类的无参构造方法,所以还必须保证父类的无参构造方法一定存在。
解释一下开头所提出的问题:
我们知道java中有一个超级父类Object类,所有引用数据类型都是Object的子类,包括自己自定义的类也会默认继承Object,所以当你使用快捷键生成一个类的构造方法的时候,会默认在构造方法第一行出现super()代码,你将这一行代码删除了也没事,因为会默认有这一行代码。
代码示例如下:
public class Super {public static void main(String[] args) {Son son = new Son("张三",18,"华为");System.out.println(son.name);System.out.println(son.age);System.out.println(son.phoneName);}}/*** 父亲类:Parent* 说明:* 1.属性有:姓名、年龄、手机名* 2.方法有:构造方法*/class Parent{String name;//姓名int age;//年龄String phoneName;//手机名//无参构造public Parent() {}//有参构造public Parent(String name, int age, String phoneName) {this.name = name;this.age = age;this.phoneName = phoneName;}}/*** 儿子类:Son 继承父亲类* 说明:属性和方法都继承于父亲,也就是说,此时的Son所有属性和方法都是“父类型特征”*/class Son extends Parent{//子类Son的有参构造public Son(String name,int age,String phoneName) {//调用super(实参列表)调用父类的有参构造//给当前子类的父类型特征初始化值,其实也就是子类自己的属性//只不过是调用了父类的构造方法来初始化值super(name, age, phoneName);}}
执行结果如图:
2、 super的第二种语法是:“super.成员变量” 或者“super.成员方法”。
这种语法的作用是:区分子类和父类中相同名字的成员变量或者相同名字的成员方法。
举例如下:假设有父亲类和儿子类,让儿子类去继承父亲类,儿子类和父亲类的属性和方法都相同,如何通过儿子类去访问继承自父亲的那部分特征呢,只有调用super关键字来区分,代码如下。
public class Super {public static void main(String[] args) {//创建一个儿子对象//注意:传入的参数赋值给了子类自身的属性,子类继承的父类型特征默认给了值: super("张三",50,"oppo");Son son = new Son("小小小张三",18,"华为手机");//此时调用son的访问父类型特征方法son.getParentData();}}/*** 父亲类:Parent* 说明:* 1.属性有:姓名、年龄、手机名* 2.方法有:构造方法、玩手机方法*/class Parent{String name;//姓名int age;//年龄String phoneName;//手机名//无参构造public Parent() {}//有参构造public Parent(String name, int age, String phoneName) {this.name = name;this.age = age;this.phoneName = phoneName;}//玩手机方法public void playPhone(){System.out.println("父亲在玩手机!");}}/*** 儿子类:Son 继承父亲类* 1.属性有:姓名、年龄、手机名* 2.方法有:构造方法、玩手机方法、访问父类型特征方法*/class Son extends Parent{String name;//姓名int age;//年龄String phoneName;//手机名//无参构造public Son() {}//有参构造public Son(String name, int age, String phoneName) {//通过子类给从父亲继承过来的父类型特征赋值super("张三",50,"oppo");//给子类自己的属性赋值//注意:子类中的name等属性和方法 与 父类中的name等属性和方法 是不同的this.name = name;this.age = age;this.phoneName = phoneName;}//设计一个访问父类型特征的方法public void getParentData(){//如果以下属性和方法都不加super关键字,那么就是调用子类自身的属性和方法System.out.println("父类型特征的name:" + super.name);System.out.println("父类型特征的age:" + super.age);System.out.println("父类型特征的phoneName:" + super.phoneName);//父类型特征的玩手机方法super.playPhone();}//玩手机方法public void playPhone() {System.out.println("儿子在玩手机!");}}
执行结果为:
以上边提出的父亲类和儿子类为例:
子类中调用super()父类的构造方法,父类的构造方法还会继续调用它的父类的super()构造方法,但是实际上对象只创建了一个。所有调用的super()构造方法只是在子类对象在JVM堆区中的那一块空间中占用一小部分来给父类型特征初始化值。
三、Super关键字的三种用法
1、super.父类的成员变量
1)如下代码所示,当想访问父类里面的成员变量b,调用show()方法,子类中没有该成员变量b时,会自行向上查找(即继承关系下的父类)。显示的写super时.它一定指向父类的成员变量,所以在成员变量不同名的情况下,super可以省略。
public class Test1 {public static void main(String[] args) {Zi zi = new Zi();zi.show();}}class Fu {public int a = 10;public int b=20;}class Zi extends Fu{public int a = 20;public int c;public void show() {//访问父类里面的非private修饰的成员变量(不同名)System.out.println(b);System.out.println(super.b);}}
2)想访问子父类同名的成员变量a时,调用show()方法,当没有显示的写super或者写this(this指向最终调用他的对象)关键字时,访问的是子类的的成员变量a,当显示的写super时.它一定访问的是父类的的成员变量a。
public class W1 {public static void main(String[] args) {Zi zi = new Zi();zi.show();}}class Fu {public int a = 10;public int b=20;}class Zi extends Fu{public int a = 20;public int c;public Zi() {super();}public void show() {//访问子类和父类中同名的成员变量System.out.println(a);//访问子类System.out.println(this.a);//访问子类System.out.println(super.a);//访问父类}
运行结果如图所示:
2、super.父类的成员方法
1)当想访问父类里面的成员方法fu(),调用show()方法,子类中没有该成员方法fu()时,会自行向上查找。显示的写super时.它一定指向父类的成员方法fu(),所以在成员方法不同名的情况下,super可以省略。
public class W1 {public static void main(String[] args) {Zi zi = new Zi();zi.test();}}class Fu {public void fu() {System.out.println("父类");}}class Zi extends Fu{public void zi() {System.out.println("子类");}public void test() {//访问父类的 方法fu();this.fu();super.fu();}}
2)想访问子父类同名的成员方法时,调用show()方法,当没有显示的写super或者写this(this指向最终调用他的对象)关键字时,访问的是子类的的方法fu(),当显示的写super时.它一定访问的是父类的的成员方法fu()。
public class W1 {public static void main(String[] args) {Zi zi = new Zi();zi.test();}}class Fu {public void method() {System.out.println("父类method");}}class Zi extends Fu{public void method() {System.out.println("子类method");}public void test() {method();//调用子类method方法this.method();//调用子类method方法super.method();//调用父类的method方法}}
运行结果如下:
3、super(参数)
在继承关系下要访问构造方法要注意以下几点:
1)在子类构造方法中没有显示的写super(参数),则会默认赠送一个super();如果显示的写了super()则不再赠送,当然父类里面也可以写super(),是因为一个类没有显示的继承一个父类则默认继承Object顶级父类。
当我们用匿名对象 new Zi()创建子类对象(调用子类构造方法)时,无论如何都会调用父类的构造方法:
①显示的写super()调用的是父类中的无参数的构造方法。
public class Test01 {public static void main(String[] args) {new Zi();}}class Fu {public Fu() {super();System.out.println("父类");}}class Zi extends Fu{public Zi() {super();System.out.println("子类");}}
运行结果:
②显示的写super(参数)调用的是父类中的有参的构造方法。
public class Test01 {public static void main(String[] args) {new Zi();}}class Fu {public Fu(int a) {System.out.println("父类有参构造");}}class Zi extends Fu{public Zi() {super(100);System.out.println("子类");}}
运行结果:
(2)如果要显示的写,则super(参数)必须是第一个语句,且必须写在第一行,不能和this()同时存在;
总结:super关键字是学习Java面向对象编程的重要基础之一。在Java中,super关键字通常用于引用当前对象的父类的成员,这个关键字在面向对象编程中非常有用,它允许我们调用父类中的方法或属性,以便在子类中使用。希望本篇文章有助于你更好地理解Java编程中的面向对象编程。
我们下期再见!
END
文案编辑|云端学长
文案配图|云端学长
内容由:云端源想分享
标签: #java中的关键字