Java继承——super详解
可以与this进行对比
//Person类,父类
public class Person {
protected String name = "szc";
}
//学生is人,子类,继承父类Person
public class Student extends Person {
private String name = "Hust";
public void test(String name){
System.out.println(name);//此处name为test方法传参的name变量
System.out.println(this.name);//此处name带this,即当前类student中的name,即Hust
System.out.println(super.name);//super引出的name,即调用父类Person中的name,即szc
}
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("wuhan");
}
}
//输出结果:
wuhan
Hust
szc
super可协助子类调用父类中的属性
Ctrl + 鼠标左键点击变量,可以直接查看其对应的变量内容
public class Person {
public void print(){//若此时为private方法,则无法在子类中通过super调用
System.out.println("szc");
}
}
public class Student extends Person {
public void print(){
System.out.println("Hust");
}
public void test1(){
print(); //此时方法为Student类中的print
this.print();//此时方法仍为Student类中的print
super.print();//此时方法通过super,变成了Person类中的print
}
}
public class Application {
public static void main(String[] args) {
student.test1();
}
}
//输出为:Hust
Hust
szc
public class Person {
public Person(){
System.out.println("Person无参执行了");
}
}
public class Student extends Person {
public Student(){//此时是无参构造,因此即使不写也会默认隐藏super()
//隐藏代码:调用了父类的无参构造器
//即默认隐藏了:super();且该代码应该在子类构造器的第一行
System.out.println("Student无参执行了");
}
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
//输出:Person无参执行了
Student无参执行了
即:先调用父类无参构造器,后调用子类无参构造器
super的注意点
- super()调用父类的构造方法,且必须在子类构造中的第一行出现
- super必须且只能出现在子类的方法或构造方法中
- super和this不能同时调用构造方法(两个都需要在第一行,因此不可共存)
this:
- this代表本身调用者这个对象,而super代表父类对象的引用
- this在没有继承时也可以使用,而super只能在继承条件下才能使用
- 构造方法的区别:this是本类的构造,而super是父类的构造
若父类为有参构造器,则子类不可再通过无参构造进行super的继承调用,应也使用有参构造器。