Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何初始化循环中的数据字段?_Java_Oop - Fatal编程技术网

Java 如何初始化循环中的数据字段?

Java 如何初始化循环中的数据字段?,java,oop,Java,Oop,以下代码将无法编译,因为编译器不要求初始化数据字段f。你怎么解决这个问题 导入java.util.Scanner public class Foo { private final int f; /*constructor*/ public Foo() { Scanner sc = new Scanner(System.in); for(int i = 0; i < 10; i++) {

以下代码将无法编译,因为编译器不要求初始化数据字段
f
。你怎么解决这个问题

导入java.util.Scanner

public class Foo
{
    private final int f;
    /*constructor*/
    public Foo()
    {
        Scanner sc = new Scanner(System.in);
        for(int i = 0; i < 10; i++)
                {
                    if(i == 5)
                        f = sc.nextInt();//error: variable f might be assigned in a loop
                }
    }

    public Foo(int i)
    {
             j = i;//no problem
    }
}
公共类Foo
{
私人终审法院;
/*建造师*/
公共食物(
{
扫描仪sc=新的扫描仪(System.in);
对于(int i=0;i<10;i++)
{
如果(i==5)
f=sc.nextInt();//错误:变量f可能在循环中赋值
}
}
公共食物(国际一)
{
j=i;//没问题
}
}
这不是语言中的一个小故障吗?因为在我的另一个构造函数中,我可以将
f
设置为
final
,并且仅仅因为它不是在循环中完成的,它就可以工作。我知道编译器(是哑巴)看到一个循环并认为
f
将被重新分配,但程序中的逻辑确保它只发生一次。这是Java如何“保护”程序员的一个例子吗

对于想知道为什么
f
被声明为最终Netbeans的人来说,大概是在代码大不相同的时候

private final int f;
        ↑
删除
final
关键字。编译器不知道只满足一次
if
,并且您会在多次尝试更改
f
时出错:

最后一个字段f可能已经分配

删除
final
关键字。编译器不知道只满足一次
if
,并且您会在多次尝试更改
f
时出错:

最后一个字段f可能已经分配


首先,最后一个字段是不能更改分配给它的值的字段。在每次循环移动中,您都会更改该值,因此无法对其进行编译。删除f前面的最后一个单词

public class Foo
{
    private int f;
    /*constructor*/
    public Foo()
    {
        Scanner sc = new Scanner(System.in);
        for(int i = 0; i < 10; i++)
                {
                    if(i == 5)
                        f = sc.nextInt();
                }
    }
}
公共类Foo
{
私人INTF;
/*建造师*/
公共食物(
{
扫描仪sc=新的扫描仪(System.in);
对于(int i=0;i<10;i++)
{
如果(i==5)
f=sc.nextInt();
}
}
}

首先,最后一个字段是您不能更改分配给它的值的字段。在每次循环移动中,您都会更改该值,因此无法对其进行编译。删除f前面的最后一个单词

public class Foo
{
    private int f;
    /*constructor*/
    public Foo()
    {
        Scanner sc = new Scanner(System.in);
        for(int i = 0; i < 10; i++)
                {
                    if(i == 5)
                        f = sc.nextInt();
                }
    }
}
公共类Foo
{
私人INTF;
/*建造师*/
公共食物(
{
扫描仪sc=新的扫描仪(System.in);
对于(int i=0;i<10;i++)
{
如果(i==5)
f=sc.nextInt();
}
}
}
您在声明中使用final,这将不允许为f重新分配另一个值

最后一个变量只能初始化一次,可以通过 初始值设定项或赋值语句

阅读更多有关期末考试的信息

所以只要使用

private int f;
您在声明中使用final,这将不允许为f重新分配另一个值

最后一个变量只能初始化一次,可以通过 初始值设定项或赋值语句

阅读更多有关期末考试的信息

所以只要使用

private int f;

当您将任何变量声明为final时,该值的值不应更改。顺便问一下,是否需要将您的变量声明为final?

当您将任何变量声明为final时,该值的值不应更改。顺便问一下,是否需要将您的变量声明为final?

您。。不要

我知道编译器(是哑的)看到一个循环并认为f将被重新分配,但程序中的逻辑确保它只发生一次。这是Java如何“保护”程序员的一个例子吗

这种行为,无论是否“保护”程序员,都是Java语言如何定义(根据)以及编译器如何正确实施语言规范的结果

:

最后一个变量只能赋值一次。。如果将最终变量赋值给,则为编译时错误,除非在赋值之前明确未赋值(§16)

请参阅详细讨论此有限静态分析案例规则的内容。

。。不要

我知道编译器(是哑的)看到一个循环并认为f将被重新分配,但程序中的逻辑确保它只发生一次。这是Java如何“保护”程序员的一个例子吗

这种行为,无论是否“保护”程序员,都是Java语言如何定义(根据)以及编译器如何正确实施语言规范的结果

:

最后一个变量只能赋值一次。。如果将最终变量赋值给,则为编译时错误,除非在赋值之前明确未赋值(§16)


请参阅详细讨论此有限静态分析案例规则的内容。

这里是一个问题,您可以在同一位置或构造函数内部初始化任何最终实例,但不能在方法(method)内部初始化。
所以你会说我正在构造函数内部初始化!!但问题是,您正在为编译器识别并抛出编译器错误的循环多次更改最终实例变量的值。

编译器内联最终代码如下

private final int f = 10  //even if you initialize it inside the constructor only one time.


这里有一个问题,您可以在同一位置或构造函数内部初始化任何最终实例,但不能在方法(method)内部初始化。
所以你会说我正在构造函数内部初始化!!但问题是,您正在为编译器识别并抛出编译器错误的循环多次更改最终实例变量的值。

编译器内联最终代码如下

private final int f = 10  //even if you initialize it inside the constructor only one time.


为什么f是最终的?当您每隔一次迭代并赋值时?原因是f是final。为什么f是final?当你