Pfeffer
Pfeffer
2017-08-11 01:49
采纳率: 53%
浏览 1.1k
已采纳

强制性转换和instanceof 组合在一起的问题 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; 
} http://ask.csdn.net/questions/648777#

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 boss = (Manager) staff[1];// Error
行这个程序的时候,JAVA 运行时系统将报告这个错误,并产生一个ClassCastException异常。如果没有捕获这个异常,那么程序就会终止。因此应该养成一个良好的程序设计习惯: 在进行类型转换之前先查看一下是否能够成功的转换。这个过程简单地使用instanceof 运算符就可以实现。例如:
if(staff[1] instanceof Manager)
{
boss =(Manager)staff [1];
...
}

我有如下几个问题:
1. 强制性类型转换就是为了方便staff[1] 来调用子类中的某些方法,为什么这里会出现这么个判断,staff[1]本来就属于Manager啊,这个判断铁定是错的啊。
2.上面这个一段话中提到一个捕获异常,都出现异常了,程序肯定会终止,并且出现问题啊,为什么会说如果没有捕获这个异常,那么程序就会终止呢? 没有办法理解。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • dcxy0
    Q544471255 2017-08-11 02:18
    已采纳
    1. 强制性类型转换就是为了方便staff[1] 来调用子类中的某些方法,为什么这里会出现这么个判断,staff[1]本来就属于Manager啊,这个判断铁定是错的啊。

    这个地方所说的场景很广泛,并非指的是已知类型,比如在Android中就有很多获取View的,需要通过强制转换来实现,但那会你已经知道转换不会出错,因此可以不用判断,而在部分你不知道转换是否会异常的时候,就需要instanceof来进行判断.

    2.上面这个一段话中提到一个捕获异常,都出现异常了,程序肯定会终止,并且出现问题啊,为什么会说如果没有捕获这个异常,那么程序就会终止呢? 没有办法理解。

    Java里面有一种异常是需要程序员主动处理的,比如

     File file = new File("d:/temp", "addfile.txt");  
            try {  
                file.createNewFile(); // 创建文件  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } 
    

    这一段出现的IOException是一个文件操作异常,也就是说,try块里面的代码,可能导致这个异常,Java需要你提前捕获进行处理。

    有另外的异常是可以再捕获之后,程序不终止。

    点赞 评论
  • penguin_nunu
    superkit 2017-08-11 01:59

    try{
    boss =(Manager)staff [1];}
    catch(Exception e){
    e.printStacktrace();
    }
    ......

    这样程序是不会终止的,try块的代码如果发生异常,将会执行catch块的代码,然后继续想下执行;

    try{
    boss =(Manager)staff [1];}
    catch(Exception e){
    throw new RunTimeException(e);
    }
    ......
    这样程序在try块发生异常后,执行catch块的代码。但是catch中直接跑出异常程序终止。

    点赞 评论
  • penguin_nunu
    superkit 2017-08-11 02:04

    第一个问题:
    if(staff[1] instanceof Manager)
    {
    ...
    }
    就是说正常情况下staff[1]的类型是Manager,但是实际以后的工作中代码复杂后,可能会有这样的类型符合的情况,
    这样如果staff[1]不是Manager类型,那么if条件不成立,就不会执行里面的boss =(Manager)staff [1];
    这样就不会发生异常;代码要尽量逻辑严谨;

    点赞 评论

相关推荐