Java中super关键字的使用

在java中,子类继承父类,一般会用到super关键字,下面我们介绍super的使用。

目录

一、子类构造方法中super的使用

1.调用子类的构造方法之前,会先调用父类的构造方法

2.如果没有显示地调用父类的构造方法,会默认调用父类的无参构造方法

3.可以使用super关键字来显示调用父类的构造方法(一定要放在构造器第一行)

二、子类对象实例化过程

三、子类实例方法中super的使用

四、this与super的比较


一、子类构造方法中super的使用

1.调用子类的构造方法之前,会先调用父类的构造方法

举例:

我们在一个包下同时建两个文件一个为Fu.java,另一个为Test.java

编写Fu.java文件:

package com.syc.test;

public class Fu {
    public Fu(){
        System.out.println("父类的无参构造器");
    }
}

class Zi extends Fu{
    public Zi(){
        System.out.println("子类的无参构造器");
    }
}

Test.java文件:

package com.syc.test;

public class Test {
    public static void main(String[] args) {
        new Zi();
    }
}

运行结果:

说明在调用子类的构造方法前,先调用了父类的构造方法,此时相当于在子类的构造方法里面的第一行有一句super(); 

2.如果没有显示地调用父类的构造方法,会默认调用父类的无参构造方法

举例:

我们修改Fu.java文件为:

package com.syc.test;

public class Fu {
    public Fu(){
        System.out.println("父类的无参构造器");
    }

    public Fu(int a){
        System.out.println("父类中带有一个int型参数的构造器");
    }
}

class Zi extends Fu{
    public Zi(){
        System.out.println("子类的无参构造器");
    }

    public Zi(int a){
        System.out.println("子类中带有一个int型参数的构造器");
    }
}

Test.java为:

package com.syc.test;

public class Test {
    public static void main(String[] args) {
        new Zi(10);
    }
}

运行结果:

说明:此时相当于在public Zi(int a)这个构造器中的第一行有一句super();

3.可以使用super关键字来显示调用父类的构造方法(一定要放在构造器第一行)

 若我们修改Fu.java文件,在其中添加进super(20);语句,即:

继续运行上述文件,运行结果为:

二、子类对象实例化过程

  1. 创建子类对象时,先调用父类构造器(默认情况下,隐式调用无参构造器),后调用子类构造器
  2. 创建子类对象时,会先按照其父类的信息开辟空间,然后如果有新增的属性或者方法,再继续分配

用一张图来说明就是:

三、子类实例方法中super的使用

在子类的实例方法中,若方法名/变量和父类相同时,会重写父类的方法/隐藏父类的变量,若此时我们想访问父类的变量或者方法,可以使用super关键字,调用父类的方法和属性。

语法为:super.函数名(参数列表)/ super.属性、

如下,我们新建Fu类:

package com.syc.test;

public class Fu {
    public int a = 10;
    public void fun(){
        System.out.println("Fu fun");
    }
}

class Zi extends Fu{
    public int a = 200;

    @Override
    public void fun(){
        System.out.println("重写的fun方法");
    }

    public void test(){
        System.out.println(super.a);//调用父类被隐藏的变量
        super.fun();//调用父类被覆盖的方法
    }

}

 测试类为Test.java:

package com.syc.test;

public class Test {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println(zi.a);
        zi.fun();

        zi.test();
    }
}

四、this与super的比较

  1. 调用构造器:this(参数)调用的是本类重载的其他构造器,super(参数)调用的是父类的构造器
  2. 调用成员:this.调用的是本类的成员,super.调用的是父类的成员
  3. this发生在本类中,super发生在继承关系中
  4. this和super都必须在构造器第一行的位置,不能同时出现

我们新建一个com.syc.test包中的People类代码如下,用此例来说明this和super的调用过程:

package com.syc.test;

public class People {
    public int age;

    public People(){
        System.out.println("父类无参构造器");
    }

    public People(int age){
        this();
        System.out.println("父类有参构造器");
        this.age = age;//通过this调用本类中的成员
    }
}

class Teacher extends People{
    public String name;
    public Teacher(){
        super(10);
        System.out.println("子类无参构造器");
    }

    public Teacher(String name){
        System.out.println("子类有参构造器");
        this.name = name;//通过this.调用本类中的成员
        super.age = 100;//通过super.调用父类中的成员
    }
}

我们在测试类中进行测试:

public class Test {
    public static void main(String[] args) {
        Teacher t = new Teacher();
    }
}

运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值