2016-12-08 9 views
1

Для следующей программы я ожидал выход как:Почему мой вывод не так, как ожидалось? Java ACM

5 * 2^3 = 40

Но выход:

40 * 2^0 = 40

Первый Я строю «HandyInt» класса:

/** 
* An integer that provides arithmetic operations for great glory. 
*/ 
public class HandyInt { 

/** The integer represented by an instance of this class. */ 
private int theInt; 

/** 
* Constructs a new handy integer representing the given int. 
* 
* @param theInt 
*   the integer to be represented by this instance. 
*/ 
public HandyInt(int theInt) { 
    this.theInt = theInt; 
} 

/** 
* Constructs a new handy integer representing the integer represented by 
* the given handy integer. 
* 
* @param handyInt 
*   the handy integer to intialize the new object with. 
*/ 
public HandyInt(HandyInt handyInt) { 
    this.theInt = handyInt.theInt; 
} 

/** 
* Returns the integer represented by this instance. 
* 
* @return the represented integer. 
*/ 
public int getInt() { 
    return theInt; 
} 

/** 
* Returns a handy integer that represents the sum of this and the other 
* handy integer. 
* 
* @param other 
*   the handy integer to add. 
* @return sum of the two handy integers. 
*/ 
public HandyInt add(HandyInt other) { 
    theInt += other.theInt; 
    return this; 
} 

/** 
* Returns a handy integer that represents the result of subtracting the 
* other integer from this one. 
* 
* @param other 
*   the handy integer to subtract from this one. 
* @return difference of the two handy integers. 
*/ 
public HandyInt sub(HandyInt other) { 
    theInt -= other.theInt; 
    return this; 
} 

@Override 
public String toString() { 
    return Integer.toString(theInt); 
} 
} 

И когда я построить код общественного бежать, строящие на моем классе «HandyInt»:

import acm.program.ConsoleProgram; 

public class ComplexMathSolver extends ConsoleProgram { 
@Override 
public void run() { 
    HandyInt factor = new HandyInt(5); 
    HandyInt exp = new HandyInt(3); 

    HandyInt result = multiplyWithPowerOfTwo(factor, exp); 

    println(factor + " * 2^" + exp + " = " + result); 
} 

/** 
* Returns the result of multiplying {@code factor} with 2 to the power of 
* {@code exp}. 
* 
* @param factor 
*   the handy integer to multiply with the power. 
* @param exp 
*   the exponent of the power. 
* @return the result of the multiplication. 
*/ 
private HandyInt multiplyWithPowerOfTwo(HandyInt factor, HandyInt exp) { 
    HandyInt one = new HandyInt(1); 

    while (exp.getInt() > 0) { 
     factor = factor.add(factor); 
     exp = exp.sub(one); 
    } 

    return factor; 
} 
} 

Что не так в моем классе «HandyInt», чтобы исправить выход? Спасибо!

+1

Ваши объекты мутируют – GurV

ответ

1

Объекты мутируют, потому что, когда вы вызвали метод multiplyWithPowerOfTwo(), вы изменили внутренние объекты объектов factor и exp. Кроме того, ваш result указывает на тот же объект, что и factor.

+0

Спасибо, я исправлю это в классе «HandyInt». В методе 'add()' и 'sub()' я создал новый HandyInt: \t \t 'HandyInt sub = new HandyInt (theInt); \t \t sub.theInt - = other.theInt; \t \t return sub; ' –