Java中的super和this关键字——

super与this关键字

先总结再解释:

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

super注意点:
1.super调用父类的构造方法,必须在构造方法的第一行
2.super必须只能出现在子类的方法或者构造方法中!
3.super和this不能同时调用构造方法!
VS this:
代表的对象不同:
this:代表本身调用者这个对象
super:代表父类对象的引用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法的区别:
this();本类的构造
super();父类的构造

穿插一点继承里的东西:

子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再调用本类中的相应构造方法。

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带参,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。(可参考最后一条规则示例:)

如果父类构造器无参,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

如下:

//父类:
package com.oop.Test05;
public class Person{
//父类的无参构造
  public Person() {
        System.out.println("父类无参构造执行了");
    }
}
//子类:
package com.oop.Test05;
public class Student extends Person{
  //子类的无参构造
    public Student() {
        //super();可显式可隐藏,若显式,则必须放在第一行
        System.out.println("子类的无参构造执行了");
    }
}
//测试类:
package com.oop;
import com.oop.Test05.Student;
public class Application {
    public static void main(String[] args) {
        Student student = new Student();
    }
}

输出:

父类无参构造执行了
子类的无参构造执行了

继承条件下构造方法调用规则如下:

1.子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,super()语句有没有都一样;

但是注意:若父类显式定义了有参构造方法,但未显式定义无参构造,此时父类中的无参构造方法就被干掉了,此时既无法使用super();语句调用父类的无参构造,同时子类也无法定义自己的无参构造。在这种情况下,super();语句,写了也没用,编译器报错,代码无法通过。不过我们只是无法调用无参,但是可以调用父类的有参构造。

可以通过下面的方法调用:(可参考最后一条规则示例:)

super(参数);
//参数列表匹配对应的有参构造

2.如果子类的构造方法中通过super显式调用父类的有参构造方法,此时父类无参构造方法不会被执行。

如下:

//父类:
package com.oop.Test05;
public class Person{
//父类的无参构造
  public Person() {
        System.out.println("父类无参构造执行了");
    }
//父类的有参构造
    public Person(String name) {
        System.out.println("父类有参构造执行了");
    }
}
//子类:
package com.oop.Test05;
public class Student extends Person{
  //子类的无参构造
    public Student() {
        super("樱");
        System.out.println("子类的无参构造执行了");
    }
}
//测试类:
package com.oop;
import com.oop.Test05.Student;
public class Application {
    public static void main(String[] args) {
        Student student = new Student();
    }
}

输出:

樱
父类有参构造执行了
子类的无参构造执行了

3.如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应满足:this语句放在第一行。

posted @ 2022-04-09 12:16  柔小兔  Views(78)  Comments(1Edit  收藏  举报