以此代码块为例:
private final House house;
public static void main(String[] args)
{
house = new House("Robinsons");
house.setColor("Red");
}
这是否有效使用最终变量?一旦它在技术上被初始化但是在构造函数中被修改时修改它是否合法?
答案 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
}
}
如果是这样,这有很多问题。
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.