错误:无法将值分配给最终变量

8
我正在处理一个任务,但遇到了这个错误:无法将值分配给最终变量计数。
以下是我目前的代码...
public class List
{
    private final int Max = 25;
    private final int count; 
    private Person list[];

    public List()
    {
        count = 0; 
        list = new Person[Max];
    }

    public void addSomeone(Person p)
    {
        if (count < Max){
            count++; // THIS IS WHERE THE ERROR OCCURS 
            list[count-1] = p;
        }
    }

    public String toString()
    {
        String report = "";

        for (int x=0; x < count; x++)
            report += list[x].toString() + "\n"; 

        return report;
    }
}  

我对Java非常陌生,显然不是计算机高手,所以请尽可能用最简单的语言解释问题/解决方案。非常感谢。


4
一旦被指定,final变量就不能被修改。 - rgettman
5个回答

11

count++;会抛出一个错误。根据Oracle的规定,

一个final(最终)变量只能被赋值一次。声明一个final变量可以作为有用的文档说明其值不会改变,并且可以帮助避免编程错误。

您可以按照这里的文章进行操作。查看您的代码,似乎您真的不想让count成为final变量。您想要在整个程序中能够更改它的值。解决方法是删除final修饰符。


2
这是唯一一个实际引用了Java语言规范的答案。+1 - Daniel Pryden

5
当您声明变量为final时,您基本上告诉编译器此变量是常量且不会更改。您已经声明了count为final,但是您尚未初始化它(即没有设置值)。这就是为什么您被允许在构造函数public List() {}中设置其值的原因:final变量可以初始化一次,之后便无法修改。
不过也有例外情况,例如如果您创建了一个带有int值的对象并添加了setter,您仍然可以修改最终对象。
以下是示例:
public class ExampleObject {
    private int count;

    public ExampleObject(int count) {
        this.count = count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getCount() {
        return count;
    }
}

public class ExampleDemo {

    private static final ExampleObject obj = new ExampleObject(25);

    public static void main(String[] args) {
        obj = new ExampleObject(100); //not allowed: cannot assign a value to final variable
        obj.setCount(100); //allowed
    }
}

有时候我发现,即使在内部类中赋值时从未初始化“final”变量,有时也会出现此错误,而有时却可以正常工作。为什么会这样? - Michael

3

有一种方法,你可以使用数组代替变量并且操作它的第一个元素。

final int[] a = new int[1];

1
+1 建议使用这种方法,因为实际上我们并没有改变“a”,它仍然是一个整数数组,但它的元素可以改变。 - DrMaxB

2

因为您将count声明为final变量,所以它会抛出错误。Final变量就是常数。一旦初始化,我们不能更改final变量的值。


0

'final'关键字作为常量使用。您可以在声明时立即分配一个值,也可以在构造函数中分配一个值,但仅限一次。您不能在代码的后面进一步增加或减少它的值。因此,count++将生成错误。

还要知道,当与类或函数一起使用时,'final'会防止它们被继承到子类中。


您可以使用protected final变量。 - Robert White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接