1. super表示父类属性
一般没有意义,因为属性会被 private 封装,被 private 封装的属性是不能调用的。
语法:super.属性名称
,明确表示从父类中查找属性
class Person {
public String info = "父类";
}
class Student extends Person {
public String info = "子类";
public void fun() {
System.out.println(super.info);
System.out.println(this.info);
}
}
public class SuperDiaoYongFuLeiShuXing {
public static void main(String[] args) {
Student stu = new Student();
stu.fun();
}
}
super.info
表示的父类中的属性,而 this.info
表示的是本类中的属性,此时的本类指的是 student 子类。
2. super表示父类方法
① 表示父类构造方法
语法:super(方法参数);
调用父类无参构造时,子类构造方法首行的
super();
可以省略;当父类不存在无参构造时,子类构造方法必须使用super(方法参数);
明确表示当前调用的是哪个父类构造,此时super不能省略,且必须处于子类构造方法首行,此时子类不存在this
构造器调用!!!
- 调用父类无参构造
class Person {
public Person() {
System.out.println("Person类对象产生");
}
}
class Student extends Person {
public Student() {
// 此句在无参构造时写与不写一样
super();
System.out.println("Student类对象产生");
}
}
public class SuperBiaoShiFuLeiGouZaoFangFa {
public static void main(String[] args) {
new Student();
}
}
因为这个是构造方法,实例化子类对象之前一定会先实例化父类对象,即先调用父类构造方法再调用子类构造方法,所以无论有没有super
,这里的结果都是两个。
- 调用父类有参构造
注意:语法是super(方法参数);
,并没有参数类型!!!
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
class Student extends Person {
private String school;
public Student(String name, int age, String school) {
super(name, age);
this.school = school;
System.out.println("学校是:"+school);
}
}
public class SuperBiaoShiFuLeiGouZaoFangFa {
public static void main(String[] args) {
new Student("张三", 20, "清华");
}
}
② 表示父类被覆写的方法
语法:super.方法名(方法参数);
class Person {
public void print() {
System.out.println("父类");
}
}
class Student extends Person {
public void print() {
super.print();
System.out.println("子类");
}
}
public class SuperDiaoYongFuLeiBeiFuXieDeFangFa {
public static void main(String[] args) {
new Student().print();
}
}
print()
这个方法被子类覆写了,子类的 print()
方法中没有没有 super
构造器调用,是不会打印出 “父类” 这个结果的,如果有了 super
构造器调用则super
此时就会表示父类的被覆写的方法。
3. this 和 super 的区别
能使用super.方法();
一定要明确记住是父类的操作。