Прежде чем я разместил это, я прочитал некоторые из предыдущих сообщений, и я действительно ничего не вижу в своей логике. (Я уже 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, так и, конечно же, равным. О чем я не думаю?
Почему вы создаете свой собственный Cloneable интерфейс, а не используете тот, который является частью основной библиотеки Java? –
реализует java.lang.Cloneable скорее testbankaccount.Cloneable, который вы создали. –