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;
    }
    
    

解决方案 »

  1.   

    setCeiling()方法是子类的方法,如果想调用子类的方法,当然需要转为子类类型。
    因为子类一定是父类类型,但父类不一定是子类类型。(狗是动物,动物不一定是狗,也可能是猫)所以不能直接强转,需要instanceof 一下。
      

  2.   

    java中小的往大的转没问题,大的往小的转溢出
      

  3.   

    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方法
      

  4.   


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

  5.   

    因为要使用多态,父类必须有改抽象方法或实现方法,楼主你懂的。absctact class Account{
    private abstact void saveMoney();
    private abstact void getMoney();}class CreditAccount extends Account{private abstact void saveMoney(){
    }
    private abstact void getMoney(){
    }
    private abstact void setCeiling(){
    }}//Account account = new CreditAccount();
    //account.saveMoney();
    //account.getMoney();
    //account.setCeiling();//会报错
      

  6.   

    其实就是多态嘛。就拿这一句来说Account account = findAccountById(id);那么你这个方法返回的是一个Account的对象,那么可能有AAccount,BAccount都是继承于Account的,那么这个findAccountById方法可以根据业务的需要返回AAccount,BAccount都可以,这样可以实现方法的通用。在调用者那边别人只知道返回的是个Account类型的对象,更好的实现方法的封装。
      

  7.   

    setCeiling()方法是子类的方法,如果想调用子类的方法,当然需要转为子类类型。
    因为子类一定是父类类型,但父类不一定是子类类型。(狗是动物,动物不一定是狗,也可能是猫)所以不能直接强转,需要instanceof 一下。 
      

  8.   

    关键不是父类Account里没有子类CreditAccount中的setCeiling()方法么?
    你不转根本就编译不过嘛
      

  9.   

    public class AAA {

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

    public static void main(String args[]){
    AAA a = new BBB();
    //a.printB();编译通不过,父类的引用类型不能调用子类的方法
    if(a instanceof BBB){
    BBB b = (BBB)a;
    b.printB();

    ((BBB) a).printB();//跟之前两句同样的效果
             }
    }
    }class BBB extends AAA{

    public void printB(){
    System.out.println("BBB");
    }
    }
      

  10.   


    嗯嗯嗯   ,是的建议楼主看看:http://blog.csdn.net/yhk215492323/article/details/6700425