您的位置:首页 > 编程语言 > Java开发

JAVA对象转型(一)

2013-08-27 12:41 225 查看
先看下面代码(引自JAVA核心技术):一个Employee类和一个继承于Employee类的Manager类。Manager类中新增了bonus成员变量,并且新增了getBonus()方法,然后重写了父类中的getSalary方法



















关于上面的方法首先有以下容易出错的地方:

①对于子类Manager中的方法getSalay(),如果改成如下形式:

public double getSalary(){

       return salary+bonus;

}

是不是也可以呢?毕竟,Manager继承了超类的所有成员变量,包括salary。很不幸的是,因为超类中的salary是private,private的成员变量只能被自己的类访问,so.........还好,Employee提供了一个公共接口getSalary(),所以可以借助公共接口进行访问。

②再看Manager的构造方法,第由于Manager类的构造器不能访问Employee类的私有域,所以利用了Employee类的构造方法对这部分私有域进行初始化,使用super调用构造器的语句必须是子类构造器的第一条语句。

这里顺便说说一句:

关键字this有两个用途:一是引用隐式参数,二是调用该类其他的构造器。

关键字super也有两个用途:一是调用超类的方法(如Manager的getSalary()),二是调用超类的构造器。在调用超类的构造器时,这两个关键字的使用方式很类似,调用构造器的语句只能作为另一个构造器的第一条语句。

③请看第14行代码:e.getSalary()是能够确定应该执行哪个方法,尽管e被声明为Employee类,但e实际上既可以引用Employee类的对象,也可以引用其子类Manager类的对象。当e引用Manager类的对象时,e。getSalary()调用Manager类中的getSalary()方法。一个对象变量可以引用多种实际类型的现象被称为多态,在运行时能够自动选择执行哪个方法的现象被称为动态绑定。

④尽管staff[0]与boss指向同一个对象,但是编译器会将staff[0]看成Employee对象,也就是staff[0]是没有setBonus()方法的,也就是boss.setBonus()是对的,staff[0].setBonus()是错的。一个超类的引用(这个超类“指向”一个子类的对象)不能其子类对象新增的方法或属性。这个可以联系③思考,比较超类子类都有同一个方法和只有子类有新方法的区别。

⑤在JAVA中子类数组的引用可以转换成超类数组的引用,而不需要强制类型转换。

假如把ManagerTest类的内容改成


其他的两个类完全不变,请注意9~14的代码。managers和staff是引用同一个数组的,当我写了第13句时,似乎把一个普通雇员归入的了经历行列,并且此时编译器并未给出警告,但是当我运行这个程序时,控制台给出下面的结果


当我写下staff[1].setBonus(5000)时,myEclipse马上给出了错误提示:The method setBonus(int) is undefined for the type Employee

其实这点可以从④理解。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息