一、super
super:调用父类的关键字
在java的子类中指代父类引用
二、super使用
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
1.
name:指参数name
this.name:指实例化后的对象name
super.name:父类的name
this:指向当前类
super:指向父类
2.
print()和this.print():指的都是本类中的print方法
super.print():指的是父类的print()方法
3.
调用父类的构造器super();必须在子类构造器的第一行
一般情况(无参构造器+不写super()😉:super()是隐藏的,调用子类的时候,会第一时间先调用父类的无参构造器,然后才调用子类的无参构造器
public Student() {
//一般不写的话,隐藏了代码super():来调用父类的无参构造
super();//要调用父类的构造器,super();必须在子类构造器的第一行
System.out.println("Student无参执行了");
}
4.
可以在子类构造器中调用父类有参构造器来实例化子类对象
5.
对于super();
默认会调用父类的无参构造器,在实例化子类的时候,就会执行对父类的无参构造器调用
如果父类没有无参构造器,并且只写了有参构造器,说明调用不了父类的无参构造器方法,那么要在子类构造方法中写上调用父类有参构造器的方法
例如:super(“name”);
6.
同时,其它通过继承(默认有super();)理论上调用了父类的无参构造器,但父类没有无参构造器时,需要子类构造方法中需要调用父类有参构造器,来正常实例化子类对象
7.
如果子类写了有参构造器,但是没有写上无参构造器,那么子类是无法正常实例化的(硬要实例化的话需要加入参数,通过调用子类的有参构造方法来实例化子类对象)
即:Student student = new Student();报错
Student student = new Student(xiaoMing);通过
硬要实例化的话需要加入参数,通过调用子类的有参构造方法来实例化子类对象
有子类无参构造器时,Student student = new Student()正常通过
三、super注意点:
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或者构造方法中
3.super和this不能同时调用构造方法!
super Vs this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法:
this();本类的构造
super();父类的构造
package My_Demo.First_Review.OOP.Demo04;
public class Person {
public Person(String name) {
System.out.println("父类Person有参构造执行了");
}
public Person(){
System.out.println("父类Person无参构造执行了");
}
private int money=10_0000_0000;
public void say()
{
System.out.println("Are you OK?");
}
public int money() {
return money;
}
public void setMoney(int money)
{
this.money = money;
}
}
package com.OOP.Demo_05;
//学生 is 人 派生类、子类
//子类继承了父类,就会拥有父类的全部方法(私有除外)
public class Student extends Person {
//Ctrl+H
public Student(String name) {
super(name);
System.out.println("子类Student有参构造器执行了");
}
public Student() {
//隐藏代码:调用了父类的无参构造
super("name");//调用父类的构造器,super();必须在子类构造器的第一行
System.out.println("子类Student无参构造器执行了");
}
private String name="李赣";
public void print(){
System.out.println("Student");
}
public void test1(){
print();
this.print();
super.print();
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
package com.OOP.Demo_05;
//Teacher is 人:派生类、子类
public class Teacher extends Person {
public Teacher(String name) {
super(name);
}
}
package com.OOP.Demo_05;
public class Teacher extends Person {
public Teacher() {
super("sss");
System.out.println("子类Teacher无参构造执行了");
}
}