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

Java中的最后一个变量在什么时候不再被修改?,java,initialization,variable-assignment,final,Java,Initialization,Variable Assignment,Final,以这段代码为例: private final House house; public static void main(String[] args) { house = new House("Robinsons"); house.setColor("Red"); } 这是对最终变量的有效使用吗?一旦在技术上对其进行了初始化,但仍在构造函数中进行修改,则修改该变量是否合法?final对于变量,意味着在首次分配该变量后,无法重新分配该变量 假设您的代码已编译,则 house =

以这段代码为例:

private final House house;

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

这是对最终变量的有效使用吗?一旦在技术上对其进行了初始化,但仍在构造函数中进行修改,则修改该变量是否合法?

final
对于变量,意味着在首次分配该变量后,无法重新分配该变量

假设您的代码已编译,则

house = new House("Robinsons");
是一项任务,因此将首次分配
house

这个


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

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

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!)
  • House不是静态变量,因此无法从
    main
    方法内部访问它,或者将
    House
    设置为静态变量,我不建议这样做。或者在使用前在
    main
    方法中声明一个实例
  • 从:

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

    实际上,这意味着,在使用您自己的自定义构造函数或默认的无参数构造函数构造对象之后,必须为您的
    final
    变量赋值

    目前来看,这不是
    final
    的有效用法;默认的无参数构造函数无法在其构造期间为其赋值

    更合适的用法是:

    public class PersonsHome {
        private final House house;
    
        public PersonsHome(String houseName) {
            house = new House(housename);
        }
    }
    
    房屋
    在施工结束时明确分配1,因此满足了
    最终
    合同


    1:我提到了默认的无参数构造函数;这只是创建的

    请将该代码放入IDE或
    .java
    文件中并尝试编译它…
    非静态变量不能从静态上下文中引用
    ,因此在代码中的任何一点上,对最终变量的那种操作都是有效的?@SaxSalute如果所指的操作类型是方法调用或字段访问,然后是的,只要变量在代码中的该点被明确初始化。@SAXSALLETE final意味着您不能将变量重新分配给新对象,但如果方法或字段访问在您的上下文中可见,您可以调用它们。final变量需要在声明时立即给定一个值。从技术上讲,这对于Java1.0是正确的。由于Java 1.1可以使用空白的最终变量,请参见
    public class PersonsHome {
        private final House house;
    
        public PersonsHome(String houseName) {
            house = new House(housename);
        }
    }