目录

一.super 修饰属性

二.super 修饰方法

什么是方法重写

三.super 修饰构造方法

1.调用父类的无参构造

2.调用父类的有参构造

3.注意


一.super 修饰属性

如果想要在子类中调用被覆写的父类中的同名属性,使用 super 关键字,super 修饰属性,明确表示直接访问父类中的属性。

格式:super.属性名 

eg:定义一个父类 Base1 ,定义一个子类 Derived 继承 Base1 ,使用 super 关键字在子类中调用覆写的属性 a 。

java中super关键字重名变量 java super关键字的使用_java中super关键字重名变量

java中super关键字重名变量 java super关键字的使用_java中super关键字重名变量_02

public class Base1 {
    int a=10;
}
public class Derived extends Base1{
    int a=20;
    public void test(){
        //调用子类Derived的属性a
        System.out.println(a);
        //调用父类Base1的属性a
        System.out.println(super.a);
    }

    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.test();
    }
}

二.super 修饰方法

首先了解一个概念:

什么是方法重写

方法重写(Override):发生在有继承关系的类之间,子类定义了和父类除了权限不同以外其他全部相同(名称,参数列表,返回值都相同)的方法,称之为方法的重写。

注意:子类重写后的方法权限>=父类方法的权限。

如果我们想在在子类中调用被覆写后的父类方法,就可以使用super关键字来实现,表示直接从父类中寻找同名方法。

格式:super.方法名称()

eg: 子类 Derived 中的 testB 方法分别使用 this(指向该类) 和 super 关键字调用了子类中的 testA 方法和父类中的 testA 方法。

关于方法重写

  • 调用子类:this.
  • 调用父类:super.

关于this关键字的使用可以参考:Java中的this关键字的用法

java中super关键字重名变量 java super关键字的使用_jvm_03

java中super关键字重名变量 java super关键字的使用_java_04

public class Base1 {
    int a=10;
    void testA(){
        System.out.println("调用父类中的testA方法");
    }
}
public class Derived extends Base1{
    int a=20;
    public void test(){
        //调用子类Derived的属性a
        System.out.println(a);
        //调用父类Base1的属性a
        System.out.println(super.a);
    }

    public void testA(){
        System.out.println("调用子类中的testA方法");
    }

    public void testB(){
        //调用子类中的testA方法
        this.testA();
        //调用父类中的testA方法
        super.testA();
    }

    public static void main(String[] args) {
        Derived derived=new Derived();
//        derived.test();
        derived.testB();
    }
}

三.super修饰构造方法

1.调用父类的无参构造

若调用的是父类的无参构造,可以不写。

2.调用父类的有参构造

若调用的是父类的有参构造,则必须显示使用 super(参数列表),明确表示先调用父类的构造方法。

格式:super(参数列表) 

eg:

如果父类只有有参构造函数,那我们想要调用子类的构造函数,就必须使用 super 关键字,否则就会有以下提醒。

java中super关键字重名变量 java super关键字的使用_java中super关键字重名变量_05

java中super关键字重名变量 java super关键字的使用_学习_06

 正确的调用:

java中super关键字重名变量 java super关键字的使用_java中super关键字重名变量_07

Base1 中的有参构造函数: 

public Base1(int a,int b){
        this.a=a;
        this.b=b;
        System.out.println("调用父类的有参构造函数");
    }

Derived中的无参构造函数:

public Derived(){
        //先调用Base1中的有参构造函数
        super(10,20);
        System.out.println("调用子类的无参构造函数");
    }

3.注意

  • super 在子类中调用父类的构造方法必须在子类构造方法的首行。
  • this 的构造方法调用也得放在首行,所以 this 和 super 表示构造方法调用时,不能同时出现。
  • this 可以表示当前对象的引用,但是 super 没有这个特点,super 只能引用父类的属性或方法。
  • super 和 this 都表示成员域的属性,这两个关键字都不能在静态域中直接使用。

如有建议或想法,欢迎一切讨论学习~