在什么时候Java中的最终变量不再被修改?

时间:2014-03-31 01:32:14

标签: java initialization variable-assignment final

以此代码块为例:

private final House house;

public static void main(String[] args)
{
    house = new House("Robinsons");
    house.setColor("Red");
}

这是否有效使用最终变量?一旦它在技术上被初始化但是在构造函数中被修改时修改它是否合法?

3 个答案:

答案 0 :(得分:2)

对变量的

final表示该变量在第一次分配后无法重新分配。

假设您的代码已编译,此

house = new House("Robinsons");

是一项作业,因此首次分配house

house.setColor("Red");

是一种不影响变量house的方法调用。它会影响变量house引用的对象。

答案 1 :(得分:0)

我假设你遗漏了一些,这是完整的代码吗?

public class House {
    private final House house;

    public static void main(String[] args)
    {
        house = new House("Robinsons");
        house.setColor("Red");
    }

    public House(String houseName) {
        // do something
    }

    public void setColor(String color) {
        // do something 
    }
}

如果是这样,这有很多问题。

  1. 最终变量需要在声明时赋予正确的值。并且为了回答你的问题,一旦给出一个最终变量值(当声明它时),这将是你最后一次修改它。(参考下面的评论,感谢exception1!)。 / LI>
  2. House不是静态变量,因此无法从main方法中访问它,要么使house成为静态变量,我不建议这样做。或者在使用它之前在main方法中声明一个实例。

答案 2 :(得分:0)

来自JLS §8.1.3

  

必须在声明它的类的每个构造函数(第8.8节)的末尾明确赋值(第16.9节)空白的最终实例变量;否则会发生编译时错误。

实际上,这意味着,在构建对象后,使用自己的自定义构造函数或默认的无参数构造函数,您的final变量 必须 < / strong>被赋予一个值。

就目前而言,这不是final的有效用途;默认的no-arg构造函数无法在构造期间为其赋值。

稍微更恰当的用法是:

public class PersonsHome {
    private final House house;

    public PersonsHome(String houseName) {
        house = new House(housename);
    }
}

house肯定在构造 1 结束时分配,因此final的合同得到满足。

1:我确实提到了默认的no-arg构造函数;那只是创建了if there's no other constructor around.