代码返回节点而不是子类的值

时间:2016-01-02 05:07:10

标签: java class inheritance

我对编程非常陌生,而且我正在为我正在上课的某些代码遇到问题。我需要创建一个银行账户类,返回余额,存入一笔存款,提取,并打印一份包含当前利率的对账单。我很难尝试让主类返回储蓄账户类的价值。相反,它返回节点值,我无法弄清楚我做错了什么。任何帮助,将不胜感激。代码如下。 FinalExam.java

    import java.io.*;
    import java.util.Scanner;


public class FinalExam
{
    SavingsAccount savings;
    static String name;
    static double balance;    

    public static void main (String[] args) throws NegativeAmountException, InsufficientFundsException {
    double amount = 0;
    SavingsAccount savings = null;
    Scanner keyboard = new Scanner(System.in);
   try
   {
       savings = new SavingsAccount("Penny Saved", 500.00, .05);
       System.out.println(savings);
   }
   catch(NegativeAmountException e)
   {
      System.out.println("NegativeAmountException: " + e.getMessage());
      System.exit(1);

   }

   System.out.println(savings);
   Scanner input = new Scanner(System.in);
   System.out.print("Enter your deposit amount: ");
   amount = keyboard.nextDouble();
   System.out.println(savings);
   System.out.println("Enter your withdrawal amount:  ");
   amount = keyboard.nextDouble();
   savings.postInterest();
   System.out.println(savings);
}
}

BankAccount.java

import java.util.InputMismatchException;
import java.util.Scanner; //Import for scanner


public class BankAccount {
  public String name;
  public double balance;     

  //set name and balance 
  // make sure balance is not negative
  // throw exception if balance is negative

  public BankAccount(String name, double balance)throws NegativeAmountException {
      if (balance < 0)
        throw new NegativeAmountException("Cannot create a BankAccount with a negative balance");


  }

    public BankAccount(String name)
            throws NegativeAmountException 
  {
    // set name and use 0 balance 
        name = null;
        balance = 0;
  }


  public void deposit(double amount) throws NegativeAmountException {
      if (amount < 0)
        throw new NegativeAmountException("Cannot deposit a negative amount: " + amount);
      balance = balance + amount;
  }

  public void withdraw(double amount) throws InsufficientFundsException, NegativeAmountException {
    if (amount > balance)
        throw new InsufficientFundsException("Cannot withdraw more than the current balance of this BankAccount");
    if (amount < 0)
        throw new NegativeAmountException("Cannot withdraw a negative amount: " + amount);
    balance = balance - amount;
  }

  public double getBalance() {

    return balance;

  }
  // print bank statement including customer name
 // and current account balance

  public void printStatement() {
      System.out.println("BankAccount owned by: " + name +  "    balance: $" + balance);
    }
}

SavingsAcount.java

public class SavingsAccount extends BankAccount
{
    double interest;

    public SavingsAccount(String name, double balance, double interest) throws NegativeAmountException {

      super(name, balance);


    }
    public double getInterest()
    {
    return interest;
    }
    public void postInterest() {

       balance = balance + ((balance * interest)/12);
    }

    public void printStatement() {
        super.printStatement();
      System.out.println("Account for " + name +  " Saved" + balance + "    balance: $" + "Current Interest Rate is" + interest);
      }
 }

我知道FinalExam.java的最后一部分是不完整的,但是在我继续讨论其他问题之前,我试图将声明打印出来。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:1)

  

我很难尝试让主类返回储蓄帐户类的值。相反,它返回节点值,我无法弄清楚我做错了什么。

你的问题是你在打电话

savings = new SavingsAccount("Penny Saved", 500.00, .05);
System.out.println(savings);

println会自动在其参数上调用toString方法。由于您没有@Override toString SavingsAccount方法,因此会打印您所谓的&#34;节点值&#34;。

您的SavingsAccount有方法

public void printStatement()

似乎打印出您想要的信息。所以请调用它而不是println

答案 1 :(得分:1)

使用System.out.println(savings)方法打印对象时,它会在内部调用该对象上的toString()方法。您需要为类toString()SavingsAccount实施BankAccount方法。

对于SavingsAccount使用此:

@Override
public String toString() {
  return "SavingsAccount{" +
      super.toString() +
      ", interest=" + interest +
      '}';
}

BankAccount使用此:

@Override
public String toString() {
  return "BankAccount{" +
      "name='" + name + '\'' +
      ", balance=" + balance +
      '}';
}

目前您没有在类中设置实例变量。您正在检查负余额并抛出异常。 您还需要改进BankAccount类中的构造函数,如下所示:

public BankAccount(String name, double balance)throws NegativeAmountException {
  if (balance < 0) {
    throw new NegativeAmountException("Cannot create a BankAccount with a negative balance");
  }
  this.name = name;
  this.balance = balance;
}
// Update the SavingsAccount class constructor as well
public SavingsAccount(String name, double balance, double interest) throws NegativeAmountException {
  super(name, balance);
  this.interest = interest;  // this is missing in your code.
}

我观察到的其他事情是,您正在创建Scanner类的多个实例。您可以在main方法中的每个位置使用相同的keyboard实例。无需创建多个实例。其中一个是不必要的。

Scanner keyboard = new Scanner(System.in);
Scanner input = new Scanner(System.in);

答案 2 :(得分:1)

在FinalExam.java类中,您可以打印SavingsAccount.java类的值,但是您将获得该地址。这个id是因为在FinalExam.java类中System.out.println(savings);而不是你应该像savings.printStatement();那样使用。可能是我猜错了......

答案 3 :(得分:0)

已经给出了答案,但是你的BankAccount类构造函数中也存在问题,你没有将实例变量分配给构造函数参数,你只需要检查约束,

public BankAccount(String name, double balance)throws NegativeAmountException {
      if (balance < 0)
        throw new NegativeAmountException("Cannot create a BankAccount with a negative balance");
      this.name = name;
      this.balance = balance;
}

public BankAccount(String name) {
    // set name and use 0 balance 
        this.name = name;
        this.balance = 0;   
}

感谢:)