我正在为我的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;的概念,因为我很确定我没有将任何对象定义为最终对象并且没有触及任何对象该部分的最终变量。有没有办法摆脱这种情况?
任何帮助都会有用。谢谢你提前!
答案 0 :(得分:3)
您不能为this
分配任何内容,它不是真正的变量,只是访问与本地变量同名的实例成员或获取对当前对象的引用的方法。 (粗略地说。)
我怀疑您尝试做的是使用结果更新当前对象,在这种情况下,您需要做的是更新对象的所有实际字段(bigNumber
和numberLength
)分别使用新值。
我的建议是写一个这样的方法:
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自己的BigInteger
和BigDecimal
) ,你需要这样做:创建一个 new ,并返回它。 (然后做一些事情来提供你目前正在返回的东西。)
或者,如果您希望add
修改现有BigNum
实例的状态,请指定其字段numberLength
和bigNumber
(就像您在构造函数中所做的那样) ,而不是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
是引用当前对象的引用变量。