日期:2014-05-20  浏览次数:20795 次

向下转型问题
Account是父类 CreditAccount是子类 setCeiling()方法是子类的方法 
问题是:加粗的部分 为什么一定要向下转型 然后再去调用setCeiling()方法 直接这么写有什么不好CreditAccount creditAccount = new CreditAccount();
public Account changeCeiling(long id, double ceiling){
  Account account = findAccountById(id);
  if(account != null){
  if(account instanceof CreditAccount){
CreditAccount creditAccount = (CreditAccount)account;
creditAccount.setCeiling(ceiling);

  }else{
  System.out.println("该用户是储蓄用户,不能设置透支额度1");
  }
  }else{
  System.out.println("该用户不存在!");
  }
  return account;
  }
   
 

------解决方案--------------------
setCeiling()方法是子类的方法,如果想调用子类的方法,当然需要转为子类类型。
因为子类一定是父类类型,但父类不一定是子类类型。(狗是动物,动物不一定是狗,也可能是猫)所以不能直接强转,需要instanceof 一下。
------解决方案--------------------
public class AAA extends Account{//假设AAA是储蓄用户类,是Account的子类
//没有setCeiling()方法
}


public Account changeCeiling(long id, double ceiling){
//Account account = findAccountById(id);
Account account = new AAA();
if(account != null){
if(account instanceof CreditAccount){
CreditAccount creditAccount = (CreditAccount)account;
creditAccount.setCeiling(ceiling);
}else{
System.out.println("该用户是储蓄用户,不能设置透支额度1");
}
}else{
System.out.println("该用户不存在!");
}
return account;
}

如何没有判断account是否是CreditAccount实例对象,就会出错,因为穿进去的是AAA类,他没有setCeiling方法
------解决方案--------------------
Java code

if(account instanceof CreditAccount){
account.setCeiling(ceiling);
//直接这样不行吗?多态是可以这样的。并且account是CreditAccount的一个实例啊。
//如果Account方法里面没有这个setCeiling方法,那就必须强转成子类,
//因为这样已经溢出多态的范围,不是公有的方法。
  }

------解决方案--------------------
探讨

Java code
public class AAA {

public void printA(){
System.out.println("AAA");
}

public static void main(String args[]){
AAA a = new BBB();
//a.printB();……