以下是初始化最终变量的代码。
class MyClass{
public final int x = newMethod1();
public int newMethod1(){
return 10;
}
}
上面的代码符合并运行正常。 我的问题是,当我们将变量声明为final时,我们需要在具有常量值的同一行中初始化它。现在,动态调用该方法,简单地说,变量没有以常规方式初始化,或者是吗?为什么我们没有抛出编译错误?
答案 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
答案 4 :(得分:0)
最终变量常量且值无法重新分配。我们可以声明最终变量在类标签处,或者我们可以将其声明为方法/块标签。
第一个是,如果将任何最终变量声明为类标签变量,则必须在变量声明本身的第一行初始化它。因为编译器认为这个类标签变量可能在类中的任何地方被使用,并且如果它在声明本身时没有被初始化,那么如果它在任何地方被使用它将导致异常。对于更安全的侧编译器将强制您声明它。
如果要在任何方法/初始化块中声明任何最终变量等,则第二个,那么您可以在不初始化的情况下声明该方法。因为变量范围是该块的本地,并且在其他地方无法使用的可能性。所以编译器不会强迫你初始化它。
现在回答你的问题,调用方法只是初始化最终变量。所以编译器不会给出错误,因为你正在做编译器要你做的事情。