为什么我的输出不如预期? Java ACM

时间:2016-12-08 16:01:26

标签: java class-hierarchy 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 个答案:

答案 0 :(得分:1)

对象正在变异,因为当您调用multiplyWithPowerOfTwo()方法时,您更改了对象factorexp的内部。此外,您的result指向与factor相同的对象。