Pfeffer 2017-08-10 07:09 采纳率: 50%
浏览 1059
已采纳

关于强制性转换的一段话,看不明白,是Java核心技术卷一中的,附上了程序

 package inheritance; 
 //Manager类继承了Employee类 
 public class Manager extends Employee{ 

 private double bonus; 

 public Manager(String n, double s, int year, int month, int day){ 
 //利用super关键词调用Employee类的构造器 
 super(n, s, year, month, day); 
 bonus = 0;
 } 
 //覆盖了Employee类中的getSalary方法 
 public double getSalary(){ 
 //用super关键字调用Employee类的方法 
 double baseSalary = super.getSalary(); 
 return baseSalary + bonus; 
 } 
 public void setBonus(double b){ 
 bonus = b;
 } 
 }

package inheritance; 
import java.util.Date;
import java.util.GregorianCalendar
public class Employee { 
private String name; 
private double salary; 
private Date hireDay; 
public Employee(String n,double s ,int year,int month,int day){
name = n; 
salary = s; 
GregorianCalendar calendar = new GregorianCalendar(year, month-1, day); hireDay = calendar.getTime(); 
} 

public String getName(){ 
return name; 
} 
public double getSalary(){ 
return salary; 
} 

public Date getHireDay(){
return hireDay; 
} 

public void raiseSalary(double byPercent){ 
double raise = salary * byPercent / 100; 
salary += raise; 
} 
}

public static void main(String[] args){ 
//constrcut a Manager object 
Manager boss = new Manager("Cracker",80000,1988,12,15); boss.setBonus(5000); 
Employee[] staff = new Employee[3]; //fill the staff arry with Manager and //Employee object 
staff[0] = boss; 
staff[1] = new Employee("Harry",50000,1986,10,1); 
staff[2] = new Employee("Tommy",40000,1987,3,15); 
//print out information about all Employee objects 
//体现了多态与动态捆绑 
for(Employee e : staff) 
System.out.println("name:" + e.getName() + ",salary:" + e.getSalary());
}



进行类型转换的唯一原因是:**在暂时忽视对象的实际类型之后,使用对象的全部功能。**例如,在Manager类中,由于某些项是普通雇员,所以staff数组必须是Employee对象的数组。我们需要将数组中引用经理的元**素复原成Manager类,**以便能够访问新增加的所有变量(需要注意,在前面的代码中,为了避免类型转换,我们做了**一些特别的处理**,即将boss变量存入数组之前,先用Manager对象对它进行初始化。为了设置经理的奖金,必须使用正确的类型)

1.什么叫暂时忽视对象的类型,使用对象的全部功能?

2.什么叫复原成Manager类,以便能够访问新增加的所有变量?这些新增加的变量是啥,能否指出来?

3.上段话还提出了做出了特别的处理,完全搞不懂在哪儿?

  • 写回答

4条回答 默认 最新

  • SonOfWind0311 2017-08-10 07:53
    关注

    1.什么叫暂时忽视对象的类型,使用对象的全部功能?
    staff数组中对象的类型是Employee,但实际上其中保存了一个子类的对象boss。如果把boss当作Employee使用是无法使用该对象的所有方法的,
    比如setBonus方法,要使用这个方法(因为boss作为Manager的实例,需要使用这个方法),就需要暂时忽略它的类型(Employee),把它当作Manager使用。

    2.什么叫复原成Manager类,以便能够访问新增加的所有变量?这些新增加的变量是啥,能否指出来?
    所谓的复原,修改下代码可能更清晰些:
    去掉boss对象,直接给staff[0]赋值:
    staff[0] = new Manager("Cracker",80000,1988,12,15);
    好了,这时候直接调用staff[0].setBonus就会报错,因为此时staff[0]按照声明的类型是Employee,没有setBonus这个方法。
    需要强制转换成Manager类,也就是所谓的复原成Manager类来调用:
    ((Manager)staff[0]).setBonus(5000);
    新增加的成员变量/方法:就是Manager类中新定义的bonus变量,setBonus方法。

    3.上段话还提出了做出了特别的处理,完全搞不懂在哪儿?
    一些特别的处理,上面已经提到了:**,即将boss变量存入数组之前,先用Manager对象对它进行初始化。
    实际上就是说,为了给staff[0] setBonus,这儿做了技巧性的处理:
    先声明一个Manager类型的boss变量,调用setBonus方法之后,再把bonus赋值给staff[0].
    不技巧性的做法就是强制类型转换,就是我在上一问中的代码写法:
    staff[0] = new Manager("Cracker",80000,1988,12,15);
    ((Manager)staff[0]).setBonus(5000);

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?