Java - 静态和最终变量

时间:2012-05-08 21:11:52

标签: java static final

我知道这不会奏效,但它只是一个例子,所以我能理解为什么它不会起作用。

public class MyClass {

    final static JButton b;

 public void myMethod() {
   b = new JButton("Hello!");
 }
 }

1)为什么final static JButton b;行有错误?当我删除static关键字时,为什么此错误会消失?

2)无论有没有static关键字,行b = new JButton("Hello!");都会出错。我想知道为什么会这样?我认为在方法中实例化最终变量是可以的。

5 个答案:

答案 0 :(得分:7)

当您将静态字段声明为final时,必须静态初始化它,无论是在静态初始化程序块中还是在初始化程序表达式中。你不能在构造函数中初始化它。

当您将非静态字段声明为final时,必须在每个构造函数中初始化它,或者使用初始化表达式或在实例初始化程序块中初始化它。

答案 1 :(得分:1)

只有final赋值才能立即或在构造函数中使用。 所以只允许以下内容。

class A {
    static final B b = new B();
    static final C c;
    static { // Static initializer block.
         c = new C();
    }
    final B b2 = new B();
    final C c2;
    { // Initializer block.
         c2 = new C();
    }
    final D d2;
    A() {
        d2 = new D();
    }
}

答案 2 :(得分:1)

由于字段为static final,因此需要使用类本身进行初始化,编译器会请求您提供默认值以外的值。您可以提供默认初始值设定项或在初始化块中提供值:

要么

public class MyClass {
  final static JButton b = new JButton("Hello!");
}

public class MyClass {
  final static JButton b;

  static{
      b = new JButton("Hello!");
  }
}

有效。

当调用yourMethod时,它已经太晚了,因为预计到那时你的类已经被初始化了,你会期望有问题的字段也被初始化了。 / p>

答案 3 :(得分:1)

有些人应该重新阅读静态和最终的内容。

静态变量对于其类的每个实例都是全局的。如果你有一个Person类,其中有一个“int static age = 0”,你说的是age ++;在你的构造函数中,age在每个实例中都会有相同的值!意味着3x new Person()期望年龄为3,在每个Person实例中! michael.age == 3和susan.age == 3和tom.age == 3

因此你需要为该变量保留一些空间,并且必须初始化并声明它!因为这意味着“你的所有类的实例都有一个变量”......

接下来,最后一个变量必须填写其声明的数据,因为你可能不会!稍后编辑该变量!像const(常数)

所以最后有静态最终。您可能已经了解到,此变量适用于类的每个实例,在其声明中初始化,并且总体上不可更改!这解释了java的类综合“const”(常量)变量!

你去吧!

答案 4 :(得分:0)

必须直接初始化静态最终变量(靠近变量)或使用静态块。

最终变量(非静态)必须直接声明(靠近变量)或使用初始化块,或者在对象构造函数中声明。