关键字 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 或 this 必须被放在构造方法的第一行。显然,两者不能被放在一个单独行中,但这种情况事实上不是一个问题 。如果写一个构造方法,它既没有调用 super(…)也没有调用 this(…),编译器自动插入一个调用到父类构造方法中,而不带参数。 其它构造方法也能调用 super(…)或 this(…),调用一个 static 方法和构造方法的数据链。 最终发生的是父类构造方法(可能几个)将在链中的任何子类构造方法前执行。