final类
有时候,我们希望一个类成为最终类,不能被其它类继承,也就是不能有子类。在这种情况下,我们就需要在声明类时,在关键字class前加上关键字final,让该类成为一个最终类。例如:
public final class Hourly extends Employee{
//类定义…
}
final方法
当子类重写父类的一个方法时,父类中被重写的方法实质上被隐藏了。在子类中,要调用父类中的方法,唯一的方法是显式地调用。如果我们编写的方法有中很重要的行为,我们不想子类重写,可以将该方法声明为最终方法。最终方法不能被子类重写。
Object类中的getClass()、wait()和notify()方法都是最终方法,这些方法不能被任何类重写。
当将方法声明为最终时,关键字final可以出现在返回值类型之前的任意位置,习惯上是放在访问修饰符之后。
实例化过程
子类对象是对父类的扩展。当子类被实例化时,父类对象需要先被构造。更特别地,父类的构造器必须在子类的构造器执行之前执行。此外,如果子类有祖父类,那么祖父对象需要先构造。这个过程一直向继承树继续传递。
当一个对象被实例化时,发生下列事件序列:
1)new运算符调用子类的构造器。
2)子类会用this关键字调用子类的其它构造器。最后,子类中的第一行代码中不是this()的构造器将被调用。
3)在子类的构造器中的任何语句执行前,父类的构造器必须用super关键字调用。如果没有显式地使用super调用,那么编译器会用super()调用无参数的父类构造器。
4)如果父类也是另一个类的子类,那么在父类的构造器中的任何语句执行前,父类构造器必须使用super调用更高一层父类的构造器。
5)本过程继续执行,直到到达类层次树的顶部,即Object类。
6)Object类中的构造器执行,然后控制流程转到继承层次树中Object下面的类的构造器中。
7)构造器沿着继承层次树向下执行。最后一个要执行的构造器,实际上是第一步中先调用的那个构造器。