1、关键字super有两个用途:一是调用超类的方法,而是调用超类的构造器。
super不是对一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。super在构造器中的作用:
由于构造器不能范围Employee类的私有域(具体例子见本文最后面PersonTest.java),所以必须利用Employee类的构造器对这部分私有域进行初始化子
,我们可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是
类构造器的第一条语句。如果之类的构造器没有显示的调用超类的构造器,这将自动调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中没有显示地调用超类的其它构造器,则Java编译器将报告错误,这个规则对与abstract base class 也是成立的。
2、关键字this有两个用途:一是引用隐式参数,二是调用该类的其它的构造器。在调用构造器时和super很相似,都只能作为另一个构造器的第一条语句出现。
3、多态。先看例子:
boss.setBonus(5000);
但不能这样调用
staff[0].setBonus(5000);//error,这样会引起一个编译错误
这是因为staff[0]声明的类型是Employee,而setBonus不是Empoyee类的方法。
4、动态绑定:
super不是对一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。super在构造器中的作用:
public
Manager(String n,
double
s,
int
year,
int
month,
int
day)
{
super (n, s, year, month, day);
bonus = 0 ;
}
{
super (n, s, year, month, day);
bonus = 0 ;
}
2、关键字this有两个用途:一是引用隐式参数,二是调用该类的其它的构造器。在调用构造器时和super很相似,都只能作为另一个构造器的第一条语句出现。
3、多态。先看例子:
Manager boss
=
new
Manager();
Employee [] staff = new Employee[ 3 ];
staff[ 0 ] = boss;
在这个例子中,变量staff[0]和boss引用同一个对象.但编译器将staff[0]看待成Employee对象.这意味着可以这样调用:
Employee [] staff = new Employee[ 3 ];
staff[ 0 ] = boss;
boss.setBonus(5000);
但不能这样调用
staff[0].setBonus(5000);//error,这样会引起一个编译错误
这是因为staff[0]声明的类型是Employee,而setBonus不是Empoyee类的方法。
4、动态绑定:
- 方法的名字和参数列表被称为方法的签名(signature).如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就覆盖了超类中的这个同签名的方法。但是,返回类型不是签名的一部分,因此在覆盖方法的时候,一定要保证返回类型的兼容性。在JDK 5.0以前的版本中,要求返回类型必须是一样的。而现在允许子类将覆盖方法返回类型定义为原返回类型的子类型。例如,假设Employee类有:
public Employee getBuddy(){}在后面的子类Manager中,可以按照如下所示的方法覆盖这个方法:public Manager getBuddy(){} // OK in JDK 5.0
- 如果方法是private, static, final或者是构造器,那么编译器将可以准确地知道应该调用那个方法。我们将这种调用方式称为静态绑定。但是,子类不能继承父类private (方法,更谈不上覆盖)不能覆盖final修饰的方法,但可一覆盖static方法
- 覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是如果超类得方法是public,那么子类方法一定要声明为public。