子类对象需要被类型转换为子类以访问子类方法

时间:2014-12-21 02:12:28

标签: java inheritance

这是(删节)超级班:

public class Account
{
    private double bal;  //The current balance
    private int accnum;  //The account number


    public Account(int a)
    {    
        bal=0.0;
        accnum=a;
    }
}

子类:

public class SavingsAccount extends Account{

    private static final double INTEREST_RATE = 5;  // Interest amount for savings account

    public SavingsAccount(int a) {
        super(a);
    }

    public void addInterest(){
        double interest = getBalance()/100*INTEREST_RATE;
        deposit(interest);
    }
}

主要代码:

public class AccountMain {

    public static void main(String[] args) {
        // Declare Variables
        Account myAccount = new SavingsAccount(500);

        // Do stuff
        myAccount.deposit(1000);
        System.out.println(myAccount.toString());
        ((SavingsAccount) myAccount).addInterest();
        System.out.println(myAccount.toString());
    }

}

为什么我必须在将myAccount声明为SavingsAccount时将其作为SavingsAccount投放?

我读过的所有内容都暗示通过将新对象声明为子类应该使所有超类和子类方法可用。我觉得我错过了一些东西但却无法找到。

2 个答案:

答案 0 :(得分:2)

  

为什么我必须在将myAccount声明为SavingsAccount时将其作为SavingsAccount投放?

这是你的变量声明部分:

Account myAccount;

所以这就是编译器理解变量 type 的方式。

这是作业部分:

myAccount = new SavingsAccount(500);

这是您为变量指定特定对象引用的位置。请注意,它不会也不能更改声明的类型。

因此,您可以看到myAccount变量肯定 声明一个SavingsAccount类型变量。它已被声明为已分配SavingsAccount类型对象的Account类型变量。您也可以稍后将赋值更改为另一个Account类型对象,因此为了类型安全,如果您想将变量用作更具体的类型,编译器将要求您转换该变量。

答案 1 :(得分:1)

实际上是多态行为 - myAccount 对象仅在运行时被视为 SavingsAccount 。简而言之:

MyClass a = new MyClass(); // 'a' type is considered as MyClass in both development & runtime
MySuper b = new MyClass(); // 'b' type is MySuper on development and MyClass on runtime

除非您正在使用集合,否则不需要以这种方式声明您的对象。但如果需要收藏,您可以:

  1. 将整个集合声明为所需类型
  2. 或使用界面(如果您需要使用与继承无关的常用功能)