如果您不允许两次初始化final
非static
数据成员,那么如何在以下示例中将x
设置为我想要的内容?
class Temp6
{
final int x;
Temp6()
{
System.out.println(this.x);
this.x=10;
}
public static void main(String[]s)
{
Temp6 t1 = new Temp6();
System.out.println(t1.x);
}
}
默认情况下,Java会将x
的值设为0
,那么如何将其更改为10
?
答案 0 :(得分:0)
Java中标记为final
的变量只能初始化一次。
简单地用x
声明final int x;
不会初始化它。因此,在x
构造函数中分配给Temp6
是合法的。但是,您无法在构造函数之后为x
分配不同的值。
即,在以下内容中分配给t1.x
:
public static void main(String[] s) {
Temp6 t1 = new Temp6();
t1.x = 11; // ERROR
}
不合法。
答案 1 :(得分:0)
在类构造函数中初始化最终变量。
public class Blam
{
private final int qbert;
public Blam(int qbertValue)
{
qbert = qbertValue;
}
}
答案 2 :(得分:0)
在代码中阅读this.x
应该会出错,因为final
变量在声明时未初始化。 t1.x
应为10
,因为x
在唯一构造函数的末尾明确赋值。
你必须在构造函数中交换两行才能编译它,那里就是10行。
class Temp {
int x; // declaration and definition; defaulted to 0
final int y; // declaration, not initialized
Temp() {
System.out.println(x); // prints 0
x = 1;
System.out.println(x); // prints 1
x = 2; // last value, instance.x will give 2
System.out.println(y); // should be a compiler error: The blank final field y may not have been initialized
y = 3; // definite assignment, last and only value, instance.y will be 3 whereever used
System.out.println(y); // prints 3
y = 4; // compile error: The final field y may already have been assigned
}
}
我之前从未想过这个,有趣的一点在这里。 Final field variables的行为与local variables in methods相似,在使用前必须为explicitly assigned(明确赋值很难形式化,请参阅JLS参考,但这很合乎逻辑)。
如果你想从外面给x
一个值,你可以这样做:
public class Temp {
private final int x;
public Temp(int x) {
this.x = x;
}
public int getX() { return this.x; }
public static void main(String[] args) {
Temp temp = new Temp(10);
System.out.println(temp.getX()); // 10
}
}
答案 3 :(得分:-1)
final
变量是java常量。它们应该在类加载之前初始化。
final int x=10;
如果你的最终变量是静态的,那么你不必在声明本身给出值,你可以有类似的东西 -
class Demo {
static final int x;
static {
x = 10;
}
}
静态块仅在类加载时执行一次