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
其实这点可以从④理解。
关于上面的方法首先有以下容易出错的地方:
①对于子类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
其实这点可以从④理解。
相关文章推荐
- 【JAVA基础知识总结】JAVA对象转型之上转型对象与下转型对象
- JAVA对象转型(二)
- Java---casting(对象转型)
- Java面向对象8——对象转型,动态绑定,抽象类,final关键字及接口
- Java 多态运行顺序&&多态上转型对象
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)
- JAVA中上转型对象的详细解释
- 2018/01/07JAVA 基础 / 接口与继承:对象转型的意义、instanceof的语法
- java入门之——对象转型
- java多态与对象转型
- 再学 JAVA基础(5)对象转型,多态。【子类对象的实例化过程】
- java基础----对象的上转型对象
- JavaSE(五)JAVA对象向上转型和向下转型
- java对象转型
- java对象转型实例分析
- Java4Android-对象的转型
- java基础--对象转型和多态
- java 对象的向下转型
- java基础学习总结——对象转型