error: cannot assign a value to final variable

error: cannot assign a value to final variable

我正在做一项作业,但遇到了这个错误:无法为最终变量计数赋值

到目前为止,这是我的代码...

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 的新手,显然我不是计算机高手,所以请尽可能用最简单的术语解释 problem/solution。非常感谢。

count++; 会抛出错误。根据 Oracle,

A final variable may only be assigned to once. Declaring a variable final can serve as useful documentation that its value will not change and can help avoid programming errors.

您可以跟着那篇文章一起看 here。查看您的代码,您似乎真的不希望 count 成为最终代码。您希望能够在整个程序中更改其值。解决方法是删除 final 修饰符。

当你声明一个变量时final你基本上告诉编译器这个变量是常量并且不会改变。你声明了 count final,但你还没有初始化(设置一个值)它。这就是为什么你被允许在你的构造函数中设置它的值 public List() {}:final 变量可以被初始化一次,之后就不能被修改。

不过也有例外,例如,如果您创建了一个 int 值为 count 的对象,并添加了一个 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' 关键字用作常量。您可以在声明时分配一个值,或者您可以在构造函数中分配一个值,但也只能分配一次。您不能在代码的下方进一步增加它的值。因此count++会产生错误。

还知道 'final' 与 classes 或函数一起使用时,可以防止它们被继承到子 class。

有一种方法可以使用数组而不是变量并使用它的第一个元素。

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