通过调用方法初始化java中的最终变量

通过调用方法初始化java中的最终变量,java,final,Java,Final,下面是初始化最终变量的代码 class MyClass{ public final int x = newMethod1(); public int newMethod1(){ return 10; } } 上述代码符合要求,运行良好。 我的问题是,当我们声明一个变量为final时,我们需要在同一行中用一个常量值初始化它。现在该方法将被动态调用,简言之,变量不是以常规方式初始化的,或者是吗?为什么不在这里抛出编译错误 当我们将变量声明为final时

下面是初始化最终变量的代码

class MyClass{

    public final int x = newMethod1();

    public int newMethod1(){
        return 10;
    }

}
上述代码符合要求,运行良好。 我的问题是,当我们声明一个变量为final时,我们需要在同一行中用一个常量值初始化它。现在该方法将被动态调用,简言之,变量不是以常规方式初始化的,或者是吗?为什么不在这里抛出编译错误

当我们将变量声明为final时,需要用常量值在同一行中初始化它

不,你没有。初始化后,您无法重新分配它。您甚至不需要在其声明行对其进行初始化

当我们将一个变量声明为final时,我们需要在同一行中用一个常量值初始化它


不,你没有。初始化后,您无法重新分配它。您甚至不需要在声明行对其进行初始化。

声明变量final只意味着对象只能初始化一次,无论何时初始化。当您希望确保某人不会错误地覆盖它的值时,这尤其有用。此外,在某些情况下,它可以帮助编译器更好地执行,这可能会引起您的兴趣。为了描述我所说的,这是使用final关键字的一种非常有效的方法

final String var;
if(condition){
    var = "some value";
} else{
    var = "some other value";
}

声明变量final只意味着对象只能初始化一次,而与何时初始化无关。当您希望确保某人不会错误地覆盖它的值时,这尤其有用。此外,在某些情况下,它可以帮助编译器更好地执行,这可能会引起您的兴趣。为了描述我所说的,这是使用final关键字的一种非常有效的方法

final String var;
if(condition){
    var = "some value";
} else{
    var = "some other value";
}
当我们声明一个变量为final时,我们需要在 具有常量值的同一行

一个反例是:

public class QuickTest {

    private final int x;
    {
        x = 5;
    }

    private final static int y;
    static {
        y = 5;
    }

    public QuickTest() {
    }
}
有时,当我想设置一个包含多行代码的
final
字段(即不仅仅是一个方法调用)时,我会这样做。如果我愿意,这些
{}
附件还让我有机会将所有内容包装在适当的
try catch
中。请记住,在您的示例中-如果
#newMethod1()
抛出错误,那么您的类将无法实例化。仅举一个例子来说明:

public class QuickTest {

    private final int x;
    {
        try {
            int someCalculation = 5 + 3;
            someCalculation += 10;

            // set it
            x = someCalculation;
        } catch (Exception e) {
            // handle exception if we can
            ;

            // unrecoverable error, so let the calling code fail :(
            // LogManager.error(this, e);
            throw new RuntimeException(e);
        }
    }

    public QuickTest() {
    }
}
指向
final
Java规范的链接

当我们声明一个变量为final时,我们需要在 具有常量值的同一行

一个反例是:

public class QuickTest {

    private final int x;
    {
        x = 5;
    }

    private final static int y;
    static {
        y = 5;
    }

    public QuickTest() {
    }
}
有时,当我想设置一个包含多行代码的
final
字段(即不仅仅是一个方法调用)时,我会这样做。如果我愿意,这些
{}
附件还让我有机会将所有内容包装在适当的
try catch
中。请记住,在您的示例中-如果
#newMethod1()
抛出错误,那么您的类将无法实例化。仅举一个例子来说明:

public class QuickTest {

    private final int x;
    {
        try {
            int someCalculation = 5 + 3;
            someCalculation += 10;

            // set it
            x = someCalculation;
        } catch (Exception e) {
            // handle exception if we can
            ;

            // unrecoverable error, so let the calling code fail :(
            // LogManager.error(this, e);
            throw new RuntimeException(e);
        }
    }

    public QuickTest() {
    }
}

指向Java中
final

上Java规范的链接如果在前置变量之前使用final,这意味着一旦赋值,就不能重新赋值

例如,最终积分a=5

第二点如果使用“引用前最终”类型,则无法更改其指定的对象

例:最终动物=新狗()


在您的情况下,您只分配最后一个变量一次。所以编译器并没有给出任何错误。

在java中,若使用final before前置变量,这意味着一旦赋值,就不能重新赋值

例如,最终积分a=5

第二点如果使用“引用前最终”类型,则无法更改其指定的对象

例:最终动物=新狗()


在您的情况下,您只分配最后一个变量一次。所以编译器没有给出任何错误。

最终变量是常量,不能将值重新分配给它。我们可以将最后一个变量声明为at class label,也可以将其声明为method/block label

第一个是,如果您将任何最终变量声明为类标签变量,则必须在变量声明本身的第一行对其进行初始化。因为编译器认为这个类标签变量可能会在类中的任何地方被使用,如果在声明时它本身没有初始化,那么如果它在任何地方被使用,就会导致异常。为了安全起见,编译器将强制您声明它

第二个是如果要在任何方法/初始化块等内部声明任何最终变量,则可以在不初始化的情况下声明该方法。因为变量作用域是该块的局部,它有可能在不可能的其他地方使用。所以编译器不会强制您初始化它


现在来回答您的问题,调用该方法只是初始化最后一个变量。所以编译器不会为此给出错误,因为您正在执行编译器希望您执行的操作。

最终变量是常量,并且不能将值重新分配给它。我们可以将最后一个变量声明为at class label,也可以将其声明为method/block label

第一个是,如果您将任何最终变量声明为类标签变量,则必须在变量声明本身的第一行对其进行初始化。因为编译器认为这个类标签变量可能会在类中的任何地方被使用,如果在声明时它本身没有初始化,那么如果它在任何地方被使用,就会导致异常。为了安全起见,编译器将强制您声明它

第二个是如果要在任何方法/初始化块等内部声明任何最终变量,则可以在不初始化的情况下声明该方法。因为变量作用域是该块的局部,它有可能在不可能的其他地方使用。所以编译器不会强制您初始化它