最终的非静态数据成员

时间:2014-07-29 17:45:47

标签: java final non-static

如果您不允许两次初始化finalstatic数据成员,那么如何在以下示例中将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

4 个答案:

答案 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;
   }
}

静态块仅在类加载时执行一次