前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中super关键字详解

Java中super关键字详解

作者头像
用户7886150
修改2021-02-02 10:15:53
2910
修改2021-02-02 10:15:53
举报
文章被收录于专栏:bit哲学院

参考链接: Java super关键字

在Java的基础学习中,慢慢接触到许多陌生的关键字,今天来讲一下我所认识的super关键字 

它的使用场景为:有继承在⭐(必须在继承下才能使用super) 

一.super调用(父类)构造方法 

看下面这段代码 

class Person{

    public Person(){

        System.out.println("1.Person类的构造方法");

    }

}

class Student extends Person{

    public Student(){

        super();  //可写可不写,不写系统会自动在子类无参构造前加上super();表示先调用父类的无参构造;

        System.out.println("2.Student类的构造方法");

    }

}

public class Day6{

    public static void main(String[] args){

        Student stu = new Student();

    }

 打印结果为: 1.Person类的构造方法 2.Student类的构造方法 

注意: 

1.当父类存在无参构造时,当调用子类无参构造时,系统会自动在子类无参构造前加上super(),表示先调用父类的无参构造。 super语句可以省略,此时子类可以使用this调用构造方法。 

2.当父类不存在无参构造时(指父类一个无参构造方法都没),必须在子类构造方法中使用super(参数);明确指定调用父类的哪个有参构造。此时super语句不能省略;⭐且此时子类不存在this调用构造方法。 

看下面这段代码: 

class Person{

    private String name;

    private int age;

    public Person(String name){

        this.name = name;

    }

    public Person(String name, int age){

        this(name);   //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复

        this.age = age;

    }

    public Person(){

        System.out.println("1.Person类的构造方法");

    }

}

class Student extends Person{

    private String school;

    public Student(){

        super("yy");

        System.out.println("Student类的构造方法");

    }

    public Student(String school){

        this();

        //super("yy");    //对super的调用必须在构造方法的第一行

        System.out.println("2.Student类的构造方法");

    }

}

public class Day6{

    public static void main(String[] args){

        Student stu = new Student("beida");

    }

 运行结果如下: Student类的构造方法 2.Student类的构造方法 

这个代码中父类含有无参构造方法,所以在子类中可以使用this关键字来调用子类的构造方法,此时得省去super语句,免得跟this冲突,但省去后系统依旧会帮你加上,但不会报错,若不省去则会报错 ; 

若将上面代码改成如下: 

class Person{

    private String name;

    private int age;

    public Person(String name){

        this.name = name;

    }

    public Person(String name, int age){

        this(name);   //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复

        this.age = age;

    }

}

class Student extends Person{

    private String school;

    public Student(){

        super("yy");

        System.out.println("Student类的构造方法");

    }

    public Student(String school){

        this();

        super("yy");   

        System.out.println("2.Student类的构造方法");

    }

}

public class Day6{

    public static void main(String[] args){

        Student stu = new Student("beida");

    }

可见父类中没有无参构造方法,但子类却使用了this调用构造方法,这是不允许的,所以会报错; 

二.super调用普通方法  

super调用方法或属性都是指调用父类中的方法或属性; 看下面简单的应用: 

class Person{

    public String info = "father";

    public void print(){

        System.out.println("i am father");

    }

}

class Student extends Person{

    public Student(){

        super.print();

        System.out.println(super.info);   //不能super.父类的私有属性

    }

}

public class Exer{

    public static void main(String[] args){

        Student stu = new Student();

    }

 将会输出:i am father father 

 我们可以看到,其实super的使用方法和this关键字有很大的相似之处,但最大的区别就在于super是访问父类的操作,而this是访问本类的操作!!

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档