Java将变量视为“final”,即使它不是
我正在为我的cs101课程编写一个代码,其中包括使用数组创建一个BigNum类,因此不需要寻找性能;我对代码进行了一些裁剪,使其更具可读性Java将变量视为“final”,即使它不是,java,arrays,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
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)));
}
}
我担心我没有理解这个概念,因为我很确定我没有将任何对象定义为final,也没有触及该部分中的任何final变量。有没有办法摆脱这种情况
任何帮助都是有用的。谢谢你的进步 您不能为此分配任何内容,它不是实变量,只是访问与局部变量同名的实例成员或获取对当前对象的引用的一种方式。粗略地说 我怀疑您试图用结果更新当前对象,在这种情况下,您需要做的是分别用新值更新对象bigNumber和numberLength的所有实字段 我的建议是编写如下方法:
private void updateFromString(String s) {
bigNumber = ...;
numberLength = ...;
}
您可以从add方法和构造函数调用它。方法必须是私有的,因为它是从构造函数调用的,但这是另一个主题;是无效语法。这只能引用为其调用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)));
}
这不是一个变量,您不能分配给它
如果您想创建一个新的BigNum作为add操作的结果,这在像这样的类中很常见,请参阅Java自己的BigInteger和BigDecimal,您只需要这样做:创建一个新的BigNum,并返回它。然后做一些其他事情来提供您当前返回的内容
或者,如果要添加以修改现有BigNum实例的状态,请像在构造函数中那样为其字段numberLength和bigNumber赋值,而不是为其本身赋值。使用此选项不正确:
this = new BigNum(stringResult);
但你可以这样做:
BigNum bigNum= new BigNum(stringResult);
因为在java中,这是一个引用当前对象的引用变量 这不是一个变量,而是一个关键字
我引用的是:
关键字this只能在实例方法、实例初始值设定项或构造函数的主体中使用,或者在类的实例变量的初始值设定项中使用。如果它出现在其他地方,则会发生编译时错误
此外:
当用作主表达式时,关键字this表示一个值,该值是对调用实例方法的对象的引用§15.12,或对正在构造的对象的引用
可以说这是一个最终实例引用变量
实例引用变量->默认情况下,JVM分配的当前对象引用是这个关键字
final->您不能为该关键字分配任何新值
所以如果你愿意做这个s.o.p
然后J.V.M将打印该对象的一些哈希代码。这是你无法改变的
因此,使用this=new BigNumstringResult是非法的 你试图用这个=…,做什么?如果你在一个对象上执行一个方法时改变了它本身的实例,那该怎么办?哪一行是第86行?这就是你调用该方法的对象。你不能把自己从下面分配出去。我正在尝试将两个数字之和作为一个新定义的对象添加到由方法初始化的引用中。比如:bigNumber1.addbigNumber2;[bigNumber1应在方法末尾保留总和。]这是一个令人满意的答案。谢谢哦,就是这样!非常感谢。
BigNum bigNum= new BigNum(stringResult);