【问题标题】:error: cannot assign a value to final variable错误:无法为最终变量赋值
【发布时间】:2015-12-23 20:46:22
【问题描述】:

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

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

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 很陌生,显然不是计算机专家,所以请尽可能用最简单的术语解释问题/解决方案。非常感谢。

【问题讨论】:

  • 一旦赋值,final变量就不能修改了。

标签: java variables variable-assignment


【解决方案1】:

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

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

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

【讨论】:

  • 这是这里唯一实际引用 Java 语言规范的答案。 +1
【解决方案2】:

当你声明一个变量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”变量时也会收到此错误,而其他时候它可以工作。这是为什么呢?
【解决方案3】:

这是抛出错误,因为您已将 count 声明为最终变量。最终变量只不过是常量。 final 变量一旦初始化就不能改变它的值。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • +1 建议使用此方法,因为实际上我们并没有更改“a”,因为它仍然是一个整数数组,但它的元素可以更改
    【解决方案5】:

    'final' 关键字作为常量工作。您可以在声明时然后在那里分配一个值,或者您可以在构造函数中分配一个值,但也只能分配一次。您不能在代码的后面进一步增加它的值。因此count++会产生错误。

    还知道“final”与类或函数一起使用时,会阻止它们被继承到子类中。

    【讨论】:

    • 您可以拥有受保护的最终变量。
    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多