首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将最终字段与其声明位置分开初始化,但这不适用于Java中的最终静态字段。为什么?

将最终字段与其声明位置分开初始化,但这不适用于Java中的最终静态字段。为什么?
EN

Stack Overflow用户
提问于 2011-11-16 06:22:39
回答 3查看 292关注 0票数 3

最后一个字段必须按照约定在Java中初始化一次。不允许进行其他初始化。下面的程序演示如何在类中使用最终最终静态字段。

代码语言:javascript
运行
复制
package main;

import java.util.ArrayList;
import java.util.List;

final public class Main
{
    private final static int a=10;
    private final List<String> list;

    public Main()
    {
        list=new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
    }

    private void show()
    {
        for(String l:list)
        {
            System.out.println(l);
        }
    }

    public static void main(String[] args)
    {
        new Main().show();
    }
}

在上面的代码中,类型为字段list是在构造函数本身内初始化的。但是,同样的情况不适用于最终的静态字段a。在构造函数体中初始化a的尝试会导致编译时错误,指示“无法将值赋给最终变量a”。为什么同样的事情不适用于最终的静态字段列表,它允许在构造函数内初始化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-16 06:30:37

同样的情况也适用于最终的静态字段,但在与构造函数最接近的静态字段中,即静态初始化程序:

代码语言:javascript
运行
复制
private final static int x;

static {
    x = 10;
}

(可以说,这更接近实例初始化程序,而不是构造函数,但它是静态的最接近的。它不像你可以指定参数或任何东西。)

构造函数是在类的每个实例化上运行的--如果能够更改最终的静态字段,它将不是非常最终的,对吗?请记住,只有一个与类型关联的静态变量的“副本”,而不是像与实例变量一样与类型的每个实例关联的一个“副本”。

票数 6
EN

Stack Overflow用户

发布于 2011-11-16 06:37:58

如果您单独声明了final,那么它是每个实例的常量,并且可以像以前一样在构造函数中初始化它。但是,如果声明最终静态,所有实例都将共享相同的变量。因此,您不能在构造函数中初始化,因为每当创建实例时,您都试图更改值。

票数 2
EN

Stack Overflow用户

发布于 2011-11-16 06:30:58

您已经用它的定义初始化了a,因为您将它设置为10。之后,您不能在构造函数中修改它。

运行两次构造函数也会给列表带来问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8147577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档