2

これを投稿する前に、以前の投稿のいくつかを読みましたが、ロジックに問題はありません。(私はすでに3時間ですが、おそらくハッピーアワーを殺すでしょう)*答えを知りたくありません、私は一生懸命働くことを楽しんでいるので、誰かが私がそれを達成しようとしていることについて質問できるかもしれませんあなたの手がかりやヒントを使って答えを考えるように私を導くことができます。よろしくお願いします。* obj2はクローンを作成していないため、例外stackTraceの背後で、同じ行にnullpointer例外があることがわかりました。これは、obj2がクローンされないことを意味します。もう少し考え直すのを手伝ってください。

package testbankaccount;

/**
 *
 * @author 
 */
public interface Cloneable {

}

私の親クラス

package testbankaccount;

/**
 *
 * @author 
 */
public abstract class BankAccount implements Cloneable, Comparable {
    private double balance; 
    private int numberofDeposits; 
    private int numberofWithdrawals; 
    private double annualInterestRate; 
    private double monthlyServiceCharges; 
    private String customerName;



protected BankAccount(){
    this(1.0, 1.0);
}

protected BankAccount(double balance, double annualInterestRate){
    this.balance = balance;
    this.annualInterestRate = annualInterestRate;
}

public void deposit(double deposit){
    balance += deposit;
    numberofDeposits++; 
}

public void withdraw(double withdrawal){
    balance -= withdrawal;
    numberofWithdrawals++;
}

public void calcInterest(){
    double monthlyInterestRate = annualInterestRate/1200;
    double monthlyInterest = balance * monthlyInterestRate;
    balance += monthlyInterest; 
}

public void setMonthlyServiceCharge(double serviceCharge){
    monthlyServiceCharges = serviceCharge;
}

public void monthlyProcess(){
    balance -= monthlyServiceCharges;
    calcInterest();
    numberofWithdrawals = 0;
    numberofDeposits = 0;
    monthlyServiceCharges = 0.0;
}
public void setBalance(double balance){
     this.balance = balance;
}

public double getBalance(){
    return balance;
}

public int getNumberWithdraws(){
    return numberofWithdrawals;
}

@Override
    public Object clone() throws CloneNotSupportedException {

        return super.clone();

      }



    @Override
public abstract String toString();

    @Override
public abstract boolean equals(Object obj);

}

私のサブクラス

package testbankaccount;

/**
 *
 * @author Darren Wright
 */
public class SavingsAccount extends BankAccount implements Cloneable, Comparable {

private boolean status;


public SavingsAccount(){
    this(1.0,1.0);
}

public SavingsAccount(double balance, double annualInterestRate){
    super(balance,annualInterestRate);

}

public void setActivity(){
    if (getBalance() > 25.0)
     status = true;
    else status = false;
}

    @Override
public void withdraw(double withdrawal){
    if (status = true)
    super.withdraw(withdrawal);     
}

@Override
public void deposit(double deposit){
    if (status = false && (deposit + getBalance()) > 25.0)
    {
            status = true;
            super.deposit(deposit);
    }
    else if (status = true)
            super.deposit(deposit);
}

    @Override
public void monthlyProcess(){
        double result = 0.0;
        if(getNumberWithdraws() >4)
        result = getNumberWithdraws() - 4;
        setMonthlyServiceCharge(result);
        setActivity();
}
@Override
    public String toString() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

@Override
    public Object clone() throws CloneNotSupportedException {

        return super.clone();

      }

    @Override
    public boolean equals(Object obj) {
        return (getBalance() == ((SavingsAccount)obj).getBalance());
    }


  public int compareTo(Object obj) {
    if (getBalance() > ((SavingsAccount)obj).getBalance())
      return 1;
    else if (getBalance() < ((SavingsAccount)obj).getBalance())
      return -1;
    else
      return 0;
  }


}

私のテストクラス

package testbankaccount;

/**
 *
 * @author 
 */
public class TestBankAccount{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)  throws CloneNotSupportedException {
        SavingsAccount obj1 = new SavingsAccount(500,8.25); 
        try{
            SavingsAccount obj2 = (SavingsAccount)obj1.clone();
            System.out.println(obj1.compareTo(obj2));
            System.out.println(obj1.equals(obj2));
         }
         catch (CloneNotSupportedException ex) {
             ex.printStackTrace();
        }

    }
}

エラー出力

java.lang.CloneNotSupportedException: testbankaccount.SavingsAccount
    at java.lang.Object.clone(Native Method)
    at testbankaccount.BankAccount.clone(BankAccount.java:69)
    at testbankaccount.SavingsAccount.clone(SavingsAccount.java:60)
    at testbankaccount.TestBankAccount.main(TestBankAccount.java:16)
BUILD SUCCESSFUL (total time: 0 seconds)

思考過程で何が欠けていますか?インターフェイスを作成し、実装して、スーパークラスとサブクラスでオーバーライドしました。私のサブクラスはsuper.clone()をスーパークラスに参照し、スーパークラスのsuper.clone()はオブジェクトのクローンメソッドを参照していると思います。私はテストクラスで正しくキャストしましたが、obj2はcompareToともちろんequalsの両方でnullになります。私は何を考えていませんか?

4

2 に答える 2

5

Cloneable独自のインターフェースを作成するべきではありません。組み込みのものを使用する必要があります。

于 2012-04-27T17:58:55.517 に答える
1

独自のパブリックインターフェイスCloneableを作成しないでください。これで、システムではなく、定義したものを取得できます。したがって、「実際の」クローン可能オブジェクトを実装する代わりに、独自のクローン可能オブジェクトを実装します。これにより、Object.clone関数はオブジェクトをクローン可能にするものとして認識しません。

また、プライベートからパブリックへの保護をオーバーライドするために、クローンを作成できるようにするクラスごとにパブリッククローン関数を作成する必要があります。

私が理解していない理由で、Javaはオブジェクトをクローン可能にすることを非常に苦痛にします。

于 2012-04-27T18:02:41.053 に答える