1

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

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!"); 我想知道这是为什么?我认为可以在方法中实例化最终变量。

4

5 回答 5

7

当您将静态字段声明为 时final,必须在静态初始化程序块中或使用初始化程序表达式对其进行静态初始化。您不能在构造函数中对其进行初始化。

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

于 2012-05-08T21:14:42.513 回答
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();
    }
}
于 2012-05-08T21:18:33.100 回答
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调用的时候已经太晚了,因为预计此时您的类已经初始化,并且您希望相关字段也已初始化。

于 2012-05-08T21:19:56.850 回答
1

有些人应该重新阅读 static 和 final 的真正含义。

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

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

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

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

给你!

于 2012-05-08T21:25:56.123 回答
0

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

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

于 2012-05-08T21:15:48.867 回答