Java将变量视为" final"即使不是

时间:2015-12-15 15:40:00

标签: java arrays

我正在为我的cs101课程编写一个代码,它包括用数组创建一个BigNum类(所以,没有必要寻找性能;我已经裁掉了一些代码以使其更具可读性)

 public class BigNum{

    public static final int SIZE = 8;
    public static final int BASE = 10;   
    private int[] bigNumber;
    private int numberLength;

    public BigNum(String number){  //One of the constructors
       numberLength = number.length();
       bigNumber = new int[SIZE];
       for(int i = 0; i < SIZE; i++){
          if(SIZE-i > number.length()){
             bigNumber[i] = 0;
          }
          else{
             bigNumber[i] = Character.getNumericValue(number.charAt(SIZE-1-i));
          }          
       }
    }

    public String toString(){  //toString function for the class
       String bigNum;
       bigNum = "";
       for(int i = 0; i < this.numberLength; i++){
          bigNum = bigNum + Integer.toString(bigNumber[SIZE-1-i]); 
       }
       return bigNum;
    }

    public int add(BigNum other){  //adds one number to another and
       int sum;                    //returns the overflowed digit
       String stringResult;
       sum = Integer.parseInt(this.toString()) + Integer.parseInt(other.toString());
       stringResult = Integer.toString(sum);
       this = new BigNum(stringResult);
       return (sum/((int)Math.pow(10,SIZE)));
     }  

  }

在最后一种方法中,我使用&#34;这个&#34;表达式重新定义我之前初始化的对象(在main方法中,我将其用作[bigNumber1.add(bigNumber2);])。我得到的错误是:

1 error found:
File: H:\Java\cs101\lab10\BigNum.java  [line: 86]
Error: cannot assign a value to final variable this 

我担心我没有理解&#34;这个&#34;的概念,因为我很确定我没有将任何对象定义为最终对象并且没有触及任何对象该部分的最终变量。有没有办法摆脱这种情况?

任何帮助都会有用。谢谢你提前!

6 个答案:

答案 0 :(得分:3)

您不能为this分配任何内容,它不是真正的变量,只是访问与本地变量同名的实例成员或获取对当前对象的引用的方法。 (粗略地说。)

我怀疑您尝试做的是使用结果更新当前对象,在这种情况下,您需要做的是更新对象的所有实际字段(bigNumbernumberLength)分别使用新值。

我的建议是写一个这样的方法:

private void updateFromString(String s) {
   bigNumber = ...;
   numberLength = ...;
}

你可以从add()方法和构造函数中调用它们。 (重要的是该方法是私有的,因为它是从构造函数中调用的,但这是一个不同的主题。)

答案 1 :(得分:3)

this = new BigNum(stringResult);是invali语法。 this只能引用调用add方法的实例。

如果您希望修改该实例的状态,并希望执行与构造函数中相同的逻辑,则应将该逻辑提取到常规方法。

public BigNum(String number){  //One of the constructors
    init (number);
}

private void init (String number) {
   numberLength = number.length();
   bigNumber = new int[SIZE];
   for(int i = 0; i < SIZE; i++){
      if(SIZE-i > number.length()){
         bigNumber[i] = 0;
      }
      else{
         bigNumber[i] = Character.getNumericValue(number.charAt(SIZE-1-i));
      }          
   }
}

public int add (BigNum other) {  //adds one number to another and
   int sum;                    //returns the overflowed digit
   String stringResult;
   sum = Integer.parseInt(this.toString()) + Integer.parseInt(other.toString());
   stringResult = Integer.toString(sum);
   init (stringResult);
   return (sum/((int)Math.pow(10,SIZE)));
 }

答案 2 :(得分:2)

this 不是变量,它是关键字。

我在引用JLS - 15.8.3. this

  

关键字 this只能在实例方法,实例初始化程序或构造函数的主体中使用,或者在类的实例变量的初始化程序中使用。如果它出现在任何其他地方,则会发生编译时错误。

此外:

  

当用作主要表达式时,关键字 this表示值,该值是对调用实例方法的对象的引用(§) 15.12),或正在建造的物体。

答案 3 :(得分:1)

this不是变量,您无法分配它。

如果您想要BigNum操作的结果创建一个新的add(在这样的类中很常见,请参阅Java自己的BigIntegerBigDecimal) ,你需要这样做:创建一个 new ,并返回它。 (然后做一些事情来提供你目前正在返回的东西。)

或者,如果您希望add修改现有BigNum实例的状态,请指定其字段numberLengthbigNumber(就像您在构造函数中所做的那样) ,而不是this本身。

答案 4 :(得分:1)

您可以说这是最终实例引用变量。

实例引用变量 - &gt;默认情况下,JVM指定当前对象引用是此关键字。

最终 - &gt;您无法为此关键字指定任何新值 所以,如果你要做s.o.p(this);

然后J.V.M将打印该对象的一些哈希码。你无法改变。

因此使用this = new BigNum(stringResult);

是违法的

答案 5 :(得分:0)

使用此方法不正确:

   this = new BigNum(stringResult);

但你可以这样做:

   BigNum bigNum= new BigNum(stringResult);

因为在java中,this是引用当前对象的引用变量。