簡體   English   中英

將變量傳遞給擴展類和調用方法

[英]Passing Variables to Extended Class and Calling Methods

我現在完全不知所措。 我正在嘗試開發一個程序,該程序將顯示兩個儲蓄帳戶的MonthsAccount #Balance ,並在應計利息時更新Balance

  • 對於第一個帳戶,每月應計10,002利息,年利率為1.2%。
  • 對於第二個帳戶,每季度應計利息10,003,年利率為4%。

為此,我必須設計四個單獨的類。 SavingsAccountSavingsAccountDriverFlexibleSavingsAccountCDSavingsAccount SavingsAccountFlexibleSavingsAccountCDSavingsAccount的父類。 SavingsAccountDriver是Main類。

SavingsAccount我有一個方法setAnnualInterestRate()SavingsAccountDriver調用。 此方法設置每個帳戶的利率。 我遇到的問題是將此值傳遞給擴展類FlexibleSavingsAccountCDSavingsAccount以便我可以通過添加每個帳戶的利率來更新余額。 如果有人可以幫助我完成這項工作,我將不勝感激。

SavingsAccountDriver

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

FlexibleSavingsAccount

public class FlexibleSavingsAccount extends SavingsAccount{

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

        //returns interest
        public double getInterest() {
            return annualInterestRate;  
        }
}

您可能需要將getInterest添加為抽象方法,並將SavingsAccount聲明為抽象類。 那么您將擁有編譯器已知的方法來調用,並且您將被迫在子類中提供正確的實現

如果要將saver1saver2聲明為SavingsAccount類型, saver2在父類SavingsAccount聲明您的getInterest()方法。

按照您顯示的方式,該方法僅適用於聲明為FlexibleSavingsAccount類。

由於您將它們聲明為SavingsAccount您只能訪問該類的方法。

子類可以訪問父類的方法,但不能相反。

您已將實例化的儲蓄帳戶聲明為SavingsAccount類型。 他們將無法訪問方法getInterest()因為該方法位於FlexibleSavingsAccount

您需要將它們實例化為希望它們實際成為的實際儲蓄帳戶:

FlexibleSavingsAccount saver1 = new FlexibleSavingsAccount(10002, 2000); //create new FlexibleSavingsAccount object

現在saver1將能夠訪問getInterest()

額外的主意:

更好的方法是將父SavingsAccount編碼為接口。 然后,您將在此接口中聲明getInterest()方法,同時將方法中的詳細信息留給子類。

儲蓄賬戶:

public interface SavingsAccount {
    public int getAccountNumber();
    public double getBalance();
    public void setAnnualInterestRate (double interestRate);
 }

然后實例化您的帳戶:

SavingsAccount saver1 = new FlexibleSavingsAccount(10002, 2000); //create new FlexibleSavingsAccount object

請注意,這樣做還有一個好處,就是您可以將實例聲明為已編碼到SavingsAccount接口,這對於將來驗證代碼始終是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM