我知道这不会奏效,但它只是一个例子,所以我能理解为什么它不会起作用。
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!");
都会出错。我想知道为什么会这样?我认为在方法中实例化最终变量是可以的。
答案 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)
必须直接初始化静态最终变量(靠近变量)或使用静态块。
最终变量(非静态)必须直接声明(靠近变量)或使用初始化块,或者在对象构造函数中声明。