来自子类的Java访问保护变量



我正在做一项关于java中继承的家庭作业。我在理解如何从子类访问超类中的数组时遇到了一点困难。我看了其他几个问题,由于我是java的新手,我仍然不太明白

这是特级

import java.text.NumberFormat;
/**
 * Bank represents a single Bank containing a number of BankAccounts.
 */
public class Bank {
    // Member variables:
    /** The array of BankAccount objects contained in this bank. */
    protected BankAccount[] myAccounts = new BankAccount[2000];
    /** The number of BankAccount objects stored in the array in this bank. */
    protected int numberOfAccounts = 0;

    // Constructors:
    /**
     * Creates a Bank.
     */
    public Bank() {}

    // Methods:
    /** 
     * Creates an account with the name and balance, and adds it to 
     * the bank's list of accounts.
     * If the name already exists, no account will be created.
     * @param aName The name for the new account.
     * @param aBalance The initial balance for the new account.
     */
    public void createAccount( String aName, double aBalance) {
        BankAccount existing = this.findAccount( aName);
        if( existing != null) return;
        BankAccount anAccount = new BankAccount( aBalance, aName);
        this.myAccounts[ numberOfAccounts] = anAccount;
        this.numberOfAccounts++;
    }
    /** 
     * Finds an account in the bank's list of accounts by name.
     * If no account is found, this method returns null.
     * @param aName The name of the BankAccount to search for.
     * @return The BankAccount bearing the given name, if found.
     */
    public BankAccount findAccount( String aName) {
        BankAccount answer = null;
        for( int index = 0; index < numberOfAccounts; index++) {
            BankAccount anAccount = this.myAccounts[ index];
            if( aName.equals( anAccount.getName())) {
                return( anAccount);
            }
        }
        return( answer);
    }
    /** 
     * Returns a String which represents a short summary of 
     * all the accounts in the bank.
     * @return A String representation of all accounts and their balances in the bank.
     */
    public String toString() {
        String answer = "";
        NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
        for( int index = 0; index < numberOfAccounts; index++) {
            BankAccount anAccount = this.myAccounts[ index];
            String money = currencyFormatter.format( anAccount.getBalance());
            answer += anAccount.getName() + " t" + money + "n";
        }
        return( answer);
    }
}

这是子类的开始

public class BankSubClass extends Bank{
    private double interestPaid;
    // Constructor
    public BankSubClass(String aName, double aBalance, double aInterest) {
        super();
        this.interestPaid = aInterest;
    }
    // Getters
    public double getInterestPaid() {return(this.interestPaid);}
    // Setters
    public void setInterestPaid(double setInterestPaid) {this.interestPaid = setInterestPaid;}
    // Other methods
    public double endOfYear() {
        for (i=0;i<BankAccount.length();i++) {
        }
    }
}

最后的循环是事情有点混乱的地方。Netbeans抛出错误,说"找不到符号:变量i"。也许这与我尝试使用的银行帐户数组无关,我不知道。非常感谢任何帮助

谢谢你抽出时间!

编辑

这里是相同作业的延续

谢谢大家的回复,你的建议解决了这个问题,不过我现在又遇到了一个减速带。for循环所在的这个方法背后的想法是运行BankAccount对象的数组,检查它们中是否有InterestAccount类型的(我以前构建的一个类),如果是,则从该类调用yearlyUpdate()方法

这是InterestAccount类

public class InterestAccount extends BankAccount {
    private double interestRate;
    // Constructor
    /**
     * Create and interest bearing bank account with a balance, name,
     * and interest rate
     * @param aBalance The balance of the account
     * @param aName The name tied to the account
     * @param myInterestRate The interest rate of the account
     */
    public InterestAccount(double aBalance, String aName, double myInterestRate) {
        super(aBalance, aName);
        this.interestRate = myInterestRate;
    }
    // Getters
    /**
     * Gets the interest rate of the account
     * @return the interest rate of the account
     */
    public double getInterestRate() {return(this.interestRate);}
    // Setters
    /**
     * Sets the interest rate of the account
     * @param interestSet The new interest rate of the account
     */
    public void setInterestRate(int interestSet) {this.interestRate = interestSet;}
    // Other Methods
    /**
     * Calculates the interest earned on the account over a year
     * @return the interest earned over a year
     */
    public double yearlyUpdate() {
        double answer = (super.getBalance()*this.interestRate);
        return answer;
    }
}

这是我目前与合作的超级课程

import java.text.NumberFormat;
/**
 * Bank represents a single Bank containing a number of BankAccounts.
 */
public class Bank {
    // Member variables:
    /** The array of BankAccount objects contained in this bank. */
    protected BankAccount[] myAccounts = new BankAccount[2000];
    /** The number of BankAccount objects stored in the array in this bank. */
    protected int numberOfAccounts = 0;

    // Constructors:
    /**
     * Creates a Bank.
     */
    public Bank() {}

    // Methods:
    /** 
     * Creates an account with the name and balance, and adds it to 
     * the bank's list of accounts.
     * If the name already exists, no account will be created.
     * @param aName The name for the new account.
     * @param aBalance The initial balance for the new account.
     */
    public void createAccount( String aName, double aBalance) {
        BankAccount existing = this.findAccount( aName);
        if( existing != null) return;
        BankAccount anAccount = new BankAccount( aBalance, aName);
        this.myAccounts[ numberOfAccounts] = anAccount;
        this.numberOfAccounts++;
    }
    /** 
     * Finds an account in the bank's list of accounts by name.
     * If no account is found, this method returns null.
     * @param aName The name of the BankAccount to search for.
     * @return The BankAccount bearing the given name, if found.
     */
    public BankAccount findAccount( String aName) {
        BankAccount answer = null;
        for( int index = 0; index < numberOfAccounts; index++) {
            BankAccount anAccount = this.myAccounts[ index];
            if( aName.equals( anAccount.getName())) {
                return( anAccount);
            }
        }
        return( answer);
    }
    /** 
     * Returns a String which represents a short summary of 
     * all the accounts in the bank.
     * @return A String representation of all accounts and their balances in the bank.
     */
    public String toString() {
        String answer = "";
        NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
        for( int index = 0; index < numberOfAccounts; index++) {
            BankAccount anAccount = this.myAccounts[ index];
            String money = currencyFormatter.format( anAccount.getBalance());
            answer += anAccount.getName() + " t" + money + "n";
        }
        return( answer);
    }
}

最后,这是我试图为循环运行这个的子类

public class BankSubClass extends Bank{
    private double interestPaid;
    // Constructor
    public BankSubClass(String aName, double aBalance, double aInterest) {
        super();
        this.interestPaid = aInterest;
    }
    // Getters
    public double getInterestPaid() {return(this.interestPaid);}
    // Setters
    public void setInterestPaid(double setInterestPaid) {this.interestPaid = setInterestPaid;}
    // Other methods
    public double endOfYear() {
        double trackInterest=0;
        for (int i=0;i<numberOfAccounts;i++) {
            BankAccount working = myAccounts[i];
            boolean hasInterest = working instanceof InterestAccount;
            if (hasInterest) {
                trackInterest = trackInterest + working.yearlyUpdate();
            }
            return trackInterest;
        }
    }
}

目前netbeans在尝试在"working"上调用"yearlyUpdate()"方法时找不到它。我不明白的是,由于之前的代码验证了工作对象是InterestAccount类型的,它应该有可用的方法

谢谢你的帮助!

// Other methods
public double endOfYear() {
    for (i=0;i<BankAccount.length();i++) {
    }
}

您需要申报i

// Other methods
public double endOfYear() {
    for (int i=0;i<BankAccount.length();i++) {
    }
}

在循环中,变量i未声明。此外,由于我认为您希望循环通过数组中的帐户,我认为您应该使用以下内容:

for(int i = 0; < numberOfAccounts; i++)
{
    BankAccount bankAccount = myAccounts[i];
    // other stuff
}

就像错误所说的:i是未定义的。

尝试:

for (int i=0;i<BankAccount.length();i++)

我猜这仍然很糟糕,因为你想要的是数组的长度,而不是BankAccount类(可能未定义)

for (int i=0;i<myAccounts.length();i++)

对于错误,您需要在BankSubClass.endOfYear中使用变量i之前定义变量i。该语句应该是

for (int i=0;i<BankAccount.length();i++)

您没有在for循环中声明i

for (int i=0;i<BankAccount.length();i++)

最新更新