[英]Java - Static and Final variables
我知道这是行不通的,但这只是一个例子,所以我可以理解为什么它行不通。
public class MyClass {
final static JButton b;
public void myMethod() {
b = new JButton("Hello!");
}
}
1)为什么final static JButton b;
出错final static JButton b;
线? 当我删除static
关键字时,为什么此错误消失了?
2)有或没有static
关键字, b = new JButton("Hello!");
我想知道为什么会这样吗? 我认为在方法中实例化最终变量是可以的。
当您将静态字段声明为final
,必须在静态初始化程序块中或使用初始化程序表达式对其进行静态初始化。 您不能在构造函数中对其进行初始化。
当您将非静态字段声明为final
,必须在每个构造函数中,使用初始化程序表达式或实例初始化程序块中对其进行初始化。
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();
}
}
由于该字段是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
已经为时已晚,因为期望那时您的类已被初始化,并且您希望所涉及的字段也已被初始化。
有些人应该重读静态和最终的真实含义。
对于其类的每个实例, 静态变量都是全局变量 。 如果您有一个Person类,其中包含“ int static age = 0”,则您说age ++; 在构造函数中,age在每种情况下都具有相同的值! 意味着在每个人实例中3x new Person()预期年龄为3岁! michael.age == 3和susan.age == 3 and tom.age == 3
因此,您需要为该变量保留一些空间,并且必须初始化并声明它! 因为这意味着“对于一个类的所有实例,您都有一个变量”。
接下来, 最终变量必须在其声明中填充数据,因为您可能不会! 稍后编辑该变量! 像const(constant)
所以有最后一个静态的final 。 您可能已经了解到,该变量适用于类的每个实例,并在其声明时进行初始化,并且整体上不可更改! 解释了Java类的综合“ const”(常量)变量!
你去!
静态最终变量必须直接(在变量附近)或使用静态块进行初始化。
最终变量(非静态)必须直接声明(在变量附近),也可以使用初始化块或在对象构造函数中声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.