在java中转换为父类型时调用子方法

时间:2011-11-21 05:04:48

标签: java polymorphism class-hierarchy

我正在尝试完成一些课程工作的问题,我们将不胜感激任何帮助!

我有3种类型的帐户,它们扩展了抽象类型“帐户”.. [CurrentAccount,StaffAccount和MortgageAccount]。

我正在尝试从文件中读取一些数据并创建帐户对象以及用户对象以添加到程序中存储的哈希映射。

当我创建帐户对象时,我使用Account类型的临时变量,并根据读入的数据定义其子类型。

例如:

Account temp=null;

if(data[i].equalsIgnoreCase("mortgage"){
    temp= new MortgageAccount;
}

问题是当我尝试调用属于MortgageAccount类型的方法时。

我是否需要每种类型的临时变量,StaffAccount MortgageAccount和CurrentAccount,并使用它们来同时使用它们的方法?

提前致谢!

4 个答案:

答案 0 :(得分:7)

这取决于。如果父类AccountMortgageAccount中覆盖了某个方法,那么当您调用该方法时,您将获得MortgageAccount版本。如果该方法仅存在于MortgageAccount中,那么您需要转换该变量以调用该方法。

答案 1 :(得分:6)

如果您的所有帐户对象都具有相同的界面,这意味着它们声明了相同的方法,并且它们的实现方式不同,那么您不需要为每种类型设置变量。

但是,如果要调用特定于子类型的方法,则需要该类型的变量,或者您需要在能够调用该方法之前强制转换该引用。

class A{
    public void sayHi(){ "Hi from A"; }
}


class B extends A{
    public void sayHi(){ "Hi from B"; 
    public void sayGoodBye(){ "Bye from B"; }
}


main(){
  A a = new B();

  //Works because the sayHi() method is declared in A and overridden in B. In this case
  //the B version will execute, but it can be called even if the variable is declared to
  //be type 'A' because sayHi() is part of type A's API and all subTypes will have
  //that method
  a.sayHi(); 

  //Compile error because 'a' is declared to be of type 'A' which doesn't have the
  //sayGoodBye method as part of its API
  a.sayGoodBye(); 

  // Works as long as the object pointed to by the a variable is an instanceof B. This is
  // because the cast explicitly tells the compiler it is a 'B' instance
  ((B)a).sayGoodBye();

}

答案 2 :(得分:4)

您需要的只是MortgageAccount类型的对象来调用它上面的方法。您的对象temp的类型为MortgageAccount,因此您只需在该对象上调用MortageAccountAccount方法即可。不需要铸造。

答案 3 :(得分:4)

这是Dynamic method dispatch

的概念

如果您正在使用Base类的Reference Variable并创建Derived类的对象,那么您只能访问在基类中定义或至少声明的方法,并且您将在派生类中重写它们。

要调用派生类的对象,您需要派生类的引用变量。