看完这一篇,再也不怕阿里面试官问Super了

今天小编在浏览知乎时,发现别人提出了一个关于super关键字的问题

在这里插入图片描述

这个程序的输出结果是多少呢? 是2还是1呢?

我们知道这个题的考点就是关于super关键字,那么今天咱们就带着题目搞搞super这个关键字。

什么是super?

它是一个指代变量,用于在子类中指代父类对象

使用范围

访问父类中的成员变量

访问父类中的成员方法

访问父类中的构造方法

我们使用代码来进行逐步讲解

1.访问父类中的成员变量

public class Person {
    public String name = "男人";
    public int age = 12334 ;
}
public class Student extends Person {

    public String name = "辉辉";
    public int age = 21 ;

    public void show(){
        System.out.println("Student:"+this.name);
        System.out.println("Person:"+super.name);
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.show();
    }
}

结果为:
在这里插入图片描述

2.访问父类中的成员方法

public class Person {
    public void method(){
        System.out.println("我是父类中的方法");
    }
}
public class Student extends Person {
    public void method(){
        System.out.println("我是子类中的方法");
    }
    public void show(){
        this.method();
        super.method();
    }
    public static void main(String[] args) {
        Student student = new Student("辉辉");
        student.show();
    }
}

结果为:
在这里插入图片描述

3.访问父类中的构造方法

(1).调用无参构造

public class Person {
    public Person(){
        System.out.println("我是父类中的无参构造方法");
    }
}
public class Student extends Person {
    public Student(){
        super();
        System.out.println("我是子类中的构造方法");
    }
    public static void main(String[] args) {
        Student student = new Student();
    }
}

在这里插入图片描述

(2).调用有参构造

public class Person {
    public String name = "男人";
    public Person(String name){
        this.name = name;
        System.out.println("我是父类中的有参构造方法");
    }
}
public class Student extends Person {
    public Student(){
        super("攻城小弟");
        System.out.println("我是子类中的构造方法");
    }
    public static void main(String[] args) {
        Student student = new Student();
    }
}

在这里插入图片描述
注意点:

当两个类存在继承关系时,默认子类会调用父类中的无参构造,super()在子类中可以不写,父类中其无参构造代码可以不写,自己默认存在。

当父类中含有有参构造时,其无参构造会消失,如果你在子类中想要调用无参构造,需要手动书写代码,否在报错。

一个重要的关键点,我们根据题目分析一下,并解答这个题目。

我们知道super的使用是在存在继承关系的两个类中存在的。

继承:就是将父类中非私用的属性和方法继承给子类,所以上面的题目,虽然HelloWord这个类没有定义a变量,但是还是可以访问a变量,这个地方存在两种情况

ONE

public class Person {
    public int a = 1 ;
}
public class HelloWord extends Person{
  public HelloWord(int a){
    this.a = a;
    System.out.println("super.a"+super.a);
  }
}

这种情况:在HelloWord这个类中,不含有自己的成员变量a,其中的a是父类的。只有一个a变量

TWO

public class Person {
    public int a = 1 ;
}
public class HelloWord extends Person{
  public int a ;
  public HelloWord(int a){
    this.a = a;
    System.out.println("super.a"+super.a);
  }
}

这种情况:在HelloWord这个类中,含有自己的成员变量a,其中名字为a的变量是为两个。一个是子类的,一个是父类的,子类的访问使用this.a而父类中a变量使用super.a访问。

super的另一个作用:当子类和父类中含有相同的名字的属性时,为了区分子类和父类,就可以利用super和this这两个关键字。

到这里,我们利用自己学到的知识,我们分析上面的一段代码

public class HelloWord extends Person{
  public HelloWord(int a){
    this.a = a;
    System.out.println("super.a"+super.a);
  }
}

我们知道这个子类中只含有一个变量a,是父类的,当使用this为其进行赋值时,其实改变的是父类中a的值,所以super.a=2

后记
作为一名学习JAVA的新手,虽然自己的知识还不完善,但小编还是希望可以将自己学到的知识,分享给大家,所以写下了上面的文章,如有错误,可以联系小编啊,小编一定即使改正错误,且感谢小伙伴的指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值