1. 继承
Java与C++定义继承类的方式十分相似。Java用关键字extends
代替了C++中的冒号(:)
。在Java中,所有的继承都是公有继承,而没有C++中的私有继承和保护继承。
class Manager extends Employee
{
//添加方法和域
}
在Java中使用超类和子类来表示基类和派生类。
2. super关键字
在Java中使用关键字super调用超类的方法,而在C++中则采用超类名加上::
操作符的形式。
如果希望调用超类Employee中的getSalary方法,而不是当前类的这个方法,可以使用特定的关键字super
解决这个问题。
public double getSalary()
{
double baseSalary=super.getSalary();
return baseSalary+bonus;
}
super在构造器中的应用:
public Manager(String n, double s, int month, int day)
{
super(n,s,month,day);
bonus=0;
}
3. 多态和动态绑定
多态(polymorphism):一个对象变量可以指示多种实际类型的现象。
动态绑定(dynamic binding):在运行时能够自动地选择调用哪个方法现象。
在Java中,不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。
如果不希望让一个方法具有虚拟特征,可以将它标记为final
。
“is-a”规则:另一个表述法是置换法则,表明程序中出现超类对象的任何地方都可以用子类对象置换。
- 可以将一个子类的对象赋给超类变量。
- 但,不能将一个超类的引用赋给子类变量。
静态绑定(static binding):如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法。
动态绑定(dynamic binding):调用的方法依赖于隐式参数的实际类型,并在运行时实现。
方法签名:方法的名字和参数列表。
虚拟机预先为每个类创建了一个方法表(method table),其中列出了所有方法的签名和实际调用的方法,在真正调用方法的时候,虚拟机仅查找这个表即可。
4. 继承层次
继承层次:由一个公共超类派生出来的所有类的集合。
继承链:在继承层次中,从某个特定的类到其祖先的路径。
Java不支持多继承。
5. 阻止继承:final类和方法
final类:不允许扩展的类,如果在定义类的时候使用了final修饰符就表明这个类是final类,用来阻止某个类定义子类。
final方法:类中的特定方法可以被声明为final,子类不能覆盖这个方法。
final类中的使用方法自动地成为final方法。
使用方法:
final class Executive extends Manager
{
...
public final String getName()
{
return name;
}
}
final域:域也可以被声明为final,对于final域来说,构造对象之后就不允许改变它们的值了。
如果将一个类声明为final,只有其中的方法自动地成为final,而不包括域。
将类或方法声明为final的主要目的是:确保它们不会在子类中改变语义。