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

时间:2016-06-02 19:42:36

标签: java final

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

class MyClass{

    public final int x = newMethod1();

    public int newMethod1(){
        return 10;
    }

}

上面的代码符合并运行正常。 我的问题是,当我们将变量声明为final时,我们需要在具有常量值的同一行中初始化它。现在,动态调用该方法,简单地说,变量没有以常规方式初始化,或者是吗?为什么我们没有抛出编译错误?

5 个答案:

答案 0 :(得分:4)

  

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

不,你没有。初始化后,您无法重新分配它。你甚至不需要在声明的范围内初始化它。

答案 1 :(得分:1)

在java中,如果你在premitive变量之前使用final,这意味着一旦它被赋值,就无法重新赋值。

实施例。 final int a = 5;

如果您在引用类型之前使用final,则无法更改其分配的对象。

实施例。最终动物动物=新狗();

let predicate = NSPredicate(format: "integerAttribute == %d", 1)

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

答案 2 :(得分:0)

声明一个变量 final 只是意味着该对象只能初始化一次,无论什么时候都无关紧要。当您想要确保某人不会错误地覆盖它的值时,这尤其有用。此外,它有助于编译器在某些情况下表现更好,this answer可能会让您感兴趣。要描述我所说的这是使用final关键字的完全有效的方法。

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

答案 3 :(得分:0)

  

当我们将变量声明为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 HERE

上指向Java规范的链接

答案 4 :(得分:0)

最终变量常量且值无法重新分配。我们可以声明最终变量在类标签处,或者我们可以将其声明为方法/块标签。

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

如果要在任何方法/初始化块中声明任何最终变量等,则第二个,那么您可以在不初始化的情况下声明该方法。因为变量范围是该块的本地,并且在其他地方无法使用的可能性。所以编译器不会强迫你初始化它。

现在回答你的问题,调用方法只是初始化最终变量。所以编译器不会给出错误,因为你正在做编译器要你做的事情。