A.使用关键字this的准则:
1.在构造器中,如果要使用关键字this,那么,必须放在第一行,否则将导致一个编译错误。
2.构造方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码:
public class Platypus {
String name;
Platypus(String input) {
name = input;
}
Platypus() {
this("John/Mary Doe");
}
public static void main(String args[]) {
Platypus p1 = new Platypus("digger");
Platypus p2 = new Platypus();
}
}
在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员name赋值,第二个构造器,调用第一个构造器,给成员变量name一个初始值 "John/Mary Doe".
注意:尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始位置,否则编译会出错。
B.使用super时的准则:
1.构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。
2.无论构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。
class Mammal1{
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus2 extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}
public class TestMammal{
public static void main(String[] args){
Platypus2 pl = new Platypus2();
}
}
Super 的使用有三种情况:
1)访问父类被隐藏的成员变量,如:
super.variable;
2)调用父类中被重写的方法,如:
super.Method([paramlist]);
3)调用父类的构造函数,如:
super([paramlist]);
三种情况说明:
1、父类中没有显式定义任何构造方法,此时父类中实际有一个默认的无参数构造方法。这时,在子类中显式定义任何构造方法时,可以不用使用super调用父类的默认方法。
2、父类中显式定义了默认的无参数构造方法,那么子类可以定义任意的构造方法,而不必使用super调用父类的构造方法
3、父类中显示定义了构造方法,却没有显示定义默认的无参数构造方法,那么子类定义任何构造方法中都需要通过super调用父类的构造方法(该语段转载)