①类、超类和子类:
在java中与c++定义继承类得到方式十分相似。java用关键字extends代替了c++中的冒号(:)。在java中所有继承都是公有继承,而没有c++中的私有继承和保护继承。
在Java中对于已存在的类称为超类(superclass)、基类或父类;新类称为子类,派生类或孩子类。
子类的方法不能直接访问父类的私有域。对此我们可以通过调用超类的get方法。例如:
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + this.bonus;
}
有些人认为super和this引用是类似的概念,实际上,这是错误的。应为super不是一个对象的引用,不能将super赋给一个对象变量,super只是一种指示编译器调用超类方法的特殊关键字。
现在我们来演示一个构造器:
public Mannger(String name,double salary,int year,int month,int day){
super(name,salary,year,month,day);
bonus = 0;
}
注意方法内的第一行,这里的关键字super具有不同的含义。super(n,s,year,month,day)是调用超类中含有 n s month day 参数的构造器的简写形式。使用super调用构造器的语句必须是子类构造器的第一句。如果子类的构造器没有显式的调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式的调用超类的其他构造器,则Java编译器将报告错误。
回忆下,关键字this有两个用途,一是引用隐式参数,二是调用该类其他的构造器。同样,super关键字也用两个用途:一是调用超类方法,而是调用超累的构造器。在调用构造器时,这两个关键字的使用方式很相似。调用构造器的语句只能作为一个构造器的第!一!条!语句!出现!!!
②继承:
可以将一个子类的对象赋给超类变量。在Java程序语言中,对象的变量是多态的。一个超类变量既可以引用一个自己的对象,也可以引用任何一个子类的对象。然而不能将一个超类的引用赋给子类变量 。
同时,在覆盖超类方法时,如果超类的一个方法为public,子类方法一定声明为public。
有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为final类。如果在定义类的时候使用了final修饰符就表明这个类是final类。
类中的特定方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法。(如果将一个类声明为final,只有其中的方法自动称为final,而不包括域。)
前面有,域也可以被声明为final。对于final域来说,构造对象就不允许改变他们的值了。对于final域来说,构造对象之后就不允许改变他们的值了。
③强制类型转换:
在之前,讲过将一个类型强制转换成另一个类型的过程被称为类型转换。java语言提供了一种专门用于进行类型转换的表示法。例如:
double x = 3.405;
int nx = (int)x;
在java中,当一个值存入变量时,编译器会检查是否允许该操作。将一个子类的引用赋给一个超类变量,编译器是允许的。但是将一个超类的引用赋给一个子类变量,必须!进行!类型!转换!这样才能通过运行时的检查
否则,java运行时就会报告错误!因此,应该养成一这样一个良好的程序设计习惯:在进行类型转换之前,先查看一下是否能够成功地转换。这个过程简单地使用了instanceof操作符就可以实现
Manager boss = new Manger();
if(staff[1] instanceof Manager)
{
boss = (Manager)staff[1];
}
最后,如果这个类型传唤不可能成功,编译器就不会进行这个类型转换。例如:
String c = (String)staff[1];
将会产生编译错误,这是因为String不是staff 那个数组的类的子类 。