关键字 super 可被用来引用该类的父类,它被用来引用父类的成员变量或方法。
父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。
super 关键字的功能:
点取父类中被子类隐藏了的数据成员或方法
public class Employee {
private String name;
private int salary;
public String getDetails() {
return "Name: " + name + "\nSalary: " + salary;
}
}
public class Manager extends Employee {
private String department;
public String getDetails() {
return super.getDetails() + // 调用父类的方法
"\nDepartment: " + department;
}
}
请注意,super.method()格式的调用,如果对象已经具有父类类型,那么它的方法的整个行为都将被调用,也包括其所有负面效果。该方法不必在父类中定义,它也可以从某些祖先类中继承。也就是说可以从父类的父类去获取,具有追溯性,一直向上去找,直到找到为止,这是一个很重要的特点。
调用父类构造方法
在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用 super 来显示调用父类的构造方法。
public class Employee {
String name;
public Employee(String n) {
name = n;
}
}
public class Manager extends Employee {
String department;
public Manager(String s, String d) {
super(s);
department = d;
}
}
注意:无论是 super 还是 this,都必须放在构造方法的第一行。
通常要定义一个带参数的构造方法,并要使用这些参数来控制一个对象的父类部分的构造。
可能通过从子类构造方法的第一行调用关键字 super 的手段调用一个特殊的父类构造方法作为子类初始化的一部分。要控制具体的构造方法的调用,必须给 super()提供合适的参数。当不调用带参数的 super 时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。 在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。
public class Employee {
String name;
public Employee(String n) {
name = n;
}
}
public class Manager extends Employee {
String department;
public Manager(String s, String d) {
super(s); // 调用父类参数为 String 类型的构造方法,没有这句话,编译会出错
department = d;
}
}
super 关键字的功能:
- 点取父类中被子类隐藏了的数据成员。
- 点取已经覆盖了的方法。
- 作为方法名表示父类构造方法。
点取父类中被子类隐藏了的数据成员或方法
public class Employee {
private String name;
private int salary;
public String getDetails() {
return "Name: " + name + "\nSalary: " + salary;
}
}
public class Manager extends Employee {
private String department;
public String getDetails() {
return super.getDetails() + // 调用父类的方法
"\nDepartment: " + department;
}
}
请注意,super.method()格式的调用,如果对象已经具有父类类型,那么它的方法的整个行为都将被调用,也包括其所有负面效果。该方法不必在父类中定义,它也可以从某些祖先类中继承。也就是说可以从父类的父类去获取,具有追溯性,一直向上去找,直到找到为止,这是一个很重要的特点。
调用父类构造方法
在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用 super 来显示调用父类的构造方法。
public class Employee {
String name;
public Employee(String n) {
name = n;
}
}
public class Manager extends Employee {
String department;
public Manager(String s, String d) {
super(s);
department = d;
}
}
注意:无论是 super 还是 this,都必须放在构造方法的第一行。
通常要定义一个带参数的构造方法,并要使用这些参数来控制一个对象的父类部分的构造。
可能通过从子类构造方法的第一行调用关键字 super 的手段调用一个特殊的父类构造方法作为子类初始化的一部分。要控制具体的构造方法的调用,必须给 super()提供合适的参数。当不调用带参数的 super 时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。 在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。
public class Employee {
String name;
public Employee(String n) {
name = n;
}
}
public class Manager extends Employee {
String department;
public Manager(String s, String d) {
super(s); // 调用父类参数为 String 类型的构造方法,没有这句话,编译会出错
department = d;
}
}
当被使用时,super 或 this 必须被放在构造方法的第一行。显然,两者不能被放在一个单独行中,但这种情况事实上不是一个问题 。如果写一个构造方法,它既没有调用 super(…)也没有调用 this(…),编译器自动插入一个调用到父类构造方法中,而不带参数。 其它构造方法也能调用 super(…)或 this(…),调用一个 static 方法和构造方法的数据链。 最终发生的是父类构造方法(可能几个)将在链中的任何子类构造方法前执行。m