向下转型问题
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方法,那就必须强转成子类,
//因为这样已经溢出多态的范围,不是公有的方法。
}
------解决方案--------------------