Java 通过将其声明为SavingsAccount,您(编译器)所知道的是它至少是一个SavingsAccount,并且SavingsAccount没有getInterest()方法。它不能做任何其他的假设,我想我不明白。通过扩展类,您应该可以访问父类的成员。你有

Java 通过将其声明为SavingsAccount,您(编译器)所知道的是它至少是一个SavingsAccount,并且SavingsAccount没有getInterest()方法。它不能做任何其他的假设,我想我不明白。通过扩展类,您应该可以访问父类的成员。你有,java,variables,methods,Java,Variables,Methods,通过将其声明为SavingsAccount,您(编译器)所知道的是它至少是一个SavingsAccount,并且SavingsAccount没有getInterest()方法。它不能做任何其他的假设,我想我不明白。通过扩展类,您应该可以访问父类的成员。你有错误吗?是的。如果查看我发布的最后一小段代码,getInterest()方法应该返回对象的AnnualInterest。在本例中,我有两个SavingsAccount类型的对象(“saver1”和“saver2”)。当我运行代码时,我得到以下错


通过将其声明为
SavingsAccount
,您(编译器)所知道的是它至少是一个
SavingsAccount
,并且
SavingsAccount
没有
getInterest()
方法。它不能做任何其他的假设,我想我不明白。通过扩展类,您应该可以访问父类的成员。你有错误吗?是的。如果查看我发布的最后一小段代码,getInterest()方法应该返回对象的AnnualInterest。在本例中,我有两个SavingsAccount类型的对象(“saver1”和“saver2”)。当我运行代码时,我得到以下错误:找不到符号(参考主类saver1.getInterest()和saver2.getInterest()中的部分。您将无法从
SavingsAccount
对象中运行
getInterest()
SavingsAccount
没有
getInterest()
已定义。如果要使用该方法,必须将对象初始化为
FlexibleSavingsAccount
CDSavingsAccount
这是为什么?我是否必须声明另外两个FlexibleSavingsAccount类型的对象?我想我可以使用SavingsAccount对象,因为其他类都是从该类扩展而来的。通过将其声明为
SavingsAccount
,您(编译器)只知道它至少是
SavingsAccount
,并且
SavingsAccount
没有
getInterest()
method。它不能做任何其他假设。不确定你所说的未来验证代码是什么意思?在这里创建一个接口会释放可以包含在基类中的共享行为,并迫使作者编写代码两次,如果需要更改,则需要两次维护,如果需要输入错误,则需要两次?是的ract基类而不是interface可以处理这个问题。我可能会同时做一个接口和一个抽象基类。不确定你所说的未来验证代码是什么意思?在这里创建一个接口会释放基类中可能包含的共享行为,并迫使作者编写两次代码,如果需要,还需要两次维护更改并输入2次错误?是的,一个抽象基类而不是接口将处理此问题。我可能会同时执行接口和抽象基类。
public class SavingsAccountDriver {
    public static void main (String[] args) {
        SavingsAccount saver1 = new SavingsAccount(10002, 2000); //create new SavingsAccount object
        SavingsAccount saver2 = new SavingsAccount(10003, 3000); //create new SavingsAccount object

        saver1.setAnnualInterestRate(.012); //sets AnnualInterestRate for 'saver1' object
        saver2.setAnnualInterestRate(.04); //sets AnnualInterestRate for 'saver2' object

        System.out.println("\nMonthly balances:\n");
        System.out.println("Month " + " Account# " + " Balance " + "      " + " Month " + " Account# " + " Balance ");
        System.out.println("----- " + " -------- " + " ------- " + "      " + " ----- " + " -------- " + " ------- ");


        System.out.println(saver1.getAccountNumber() + " / " + saver1.getBalance() + " / " + saver1.getInterest());
        System.out.println(saver2.getAccountNumber() + " / " + saver2.getBalance() + " / " + saver2.getInterest());

        /*for(int month = 0; month <= 12; month++) {
            switch(month) { // switch that outputs month, account number, and balance for both accounts (Some non-needed cases used to make output look cleaner)
                case 0:
                    System.out.println(month + "      " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "         " + month + "      " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
                case 4: 
                    saver1.addInterest();
                    //saver2.addInterest();

                    System.out.println(month + "      " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "         " + month + "      " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
                case 10:
                    saver1.addInterest();
                    //saver2.addInterest();

                    System.out.println(month + "     " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "        " + month + "     " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
                case 11:
                    saver1.addInterest();
                    //saver2.addInterest();

                    System.out.println(month + "     " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "        " + month + "     " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
                case 12:
                    saver1.addInterest();
                    //saver2.addInterest();

                    double totalBalance = saver1.getBalance() + saver2.getBalance();
                    System.out.println(month + "     " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "        " + month + "     " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
                default:
                    saver1.addInterest();
                    //saver2.addInterest();

                    System.out.println(month + "      " + saver1.getAccountNumber() + "     " + saver1.getBalance() + "        " + month + "      " + saver2.getAccountNumber() + "     " + saver2.getBalance());
                    break;
            }
        }*/
    }
}
public class SavingsAccount {
    // variables specific to SavingsAccount class
    public double annualInterestRate;
    private final int ACCOUNT_NUMBER;
    public double balance;

    //constructor with account number and balance parameters
    public SavingsAccount(int account_number, double balance) {
        this.ACCOUNT_NUMBER = account_number;
        this.balance = balance;
    }

    //returns account number
    public int getAccountNumber() {
        return this.ACCOUNT_NUMBER;
    }

    //returns balance
    public double getBalance() {
        return this.balance;
    }

    //sets interest rate
    public void setAnnualInterestRate (double interestRate) {
        this.annualInterestRate = interestRate;
    }
}
public class FlexibleSavingsAccount extends SavingsAccount{

        public FlexibleSavingsAccount(int account_number, double balance) {
            super(account_number, balance);
        }

        //returns interest
        public double getInterest() {
            return annualInterestRate;  
        }
}
FlexibleSavingsAccount saver1 = new FlexibleSavingsAccount(10002, 2000); //create new FlexibleSavingsAccount object
public interface SavingsAccount {
    public int getAccountNumber();
    public double getBalance();
    public void setAnnualInterestRate (double interestRate);
 }
SavingsAccount saver1 = new FlexibleSavingsAccount(10002, 2000); //create new FlexibleSavingsAccount object