Java中静态variables和最终静态variables的区别
一般来说,最终的静态成员,特别是variables(或静态最后,当然,它们可以以任意顺序使用,而不会重叠含义)被广泛用于Java中的接口以定义实现类的协议行为 ,这意味着实现(inheritance)接口必须包含该接口的所有成员。
我无法区分最终静态成员和最终静态成员。 最终的静态成员是一个静态成员声明为最终或其他东西? 在哪些特定的情况下,他们应该具体使用?
静态variables或最终静态variables不能在静态方法内或实例方法内部在方法中声明。 为什么?
下面的代码片段将不会被编译,编译器会发出编译时错误,如果试图编译它。
public static void main(String args[]) { final int a=0; //ok int b=1; //ok static int c=2; //wrong final static int x=0; //wrong }
你正在混合许多不同的概念。 即使是标题中的问题也不符合正文中的问题。
无论如何,这些是你正在混合的概念:
- variables
- 最终variables
- 领域
- 最后的领域
- 静态字段
- 最终静态字段
static
关键字只适用于字段,但是在显示的代码中,您试图在函数内部使用它,在这里不能声明字段(字段是类的成员;variables是在方法中声明的)。
我们试着快速描述它们。
-
variables在方法中声明,并用作某种可变本地存储 (
int x; x = 5; x++
) -
finalvariables也在方法中声明,并用作不可变的本地存储 (
final int y; y = 0; y++; // won't compile
)。 他们是有用的捕捉错误,有人会试图修改不应该被修改的东西。 我个人使我的大部分本地variables和方法参数final
。 而且,当你从内部的匿名类引用它们时,它们是必要的。 在一些编程语言中,唯一一种variables是一个不可变variables(在其他语言中,“默认”types的variables是不可变variables) – 作为练习,试图找出如何编写一个循环来运行在初始化后不允许改变任何东西的指定次数! (例如,尝试用最终variables解决fizzbuzz !)。 -
字段定义对象的可变状态 ,并在类中声明(
class x { int myField; }
)。 -
final字段定义对象的不可变状态,在类中声明,并且必须在构造器完成之前初始化(
class x { final int myField = 5; }
)。 他们不能被修改。 它们在进行multithreading时非常有用,因为它们具有与在线程之间共享对象相关的特殊属性(如果对象在构造函数完成之后共享,则可以保证每个线程都能看到对象最终字段的正确初始化值,即使它与数据竞赛共享)。 如果你想要另一个练习,试着再次使用final字段解决fizzbuzz ,没有其他的字段,也没有任何variables和方法参数(显然,你可以在构造函数中声明参数,但这就是全部!)。 -
静态字段 在任何类的所有实例之间共享 。 你可以把它们看作某种全局可变的存储(
class x { static int globalField = 5; }
)。 最微不足道(通常没用)的例子就是计算一个对象的实例(例如class x { static int count = 0; x() { count++; } }
,这里构造函数在每次调用时递增计数,即每次使用new x()
创buildx
的实例时。 请注意,与final字段不同,它们本质上不是线程安全的; 换句话说,如果你是从不同的线程实例化的话,你肯定会得到上面的代码的错误计数x
的实例。 为了使其正确,你必须添加一些同步机制或者为此使用一些专门的类,但这是另一个问题(实际上,它可能是整本书的主题)。 -
最终的静态字段是全局常量 (
class MyConstants { public static final double PI = 3.1415926535897932384626433; }
)。
还有许多其他的细微特征(比如:编译器可以自由地将引用最终静态字段replace为它们的值,这使得reflection在这些字段上是无用的;最终的字段实际上可以用reflection来修改,但这很容易出错;等等),但是我想说在挖掘之前还有很长的路要走。
最后,还有其他关键字可能与字段一起使用,如transient
, volatile
和访问级别( public
, protected
, private
)。 但是,这是另一个问题(事实上,如果你想问他们,还有很多其他问题,我会说)。
静态成员是可以在不创build对象的情况下访问的成员。 这意味着这些是类成员,与任何实例无关。 因此在该方法中不能被定义。
最后换句话说,是一个常数(如C)。 你可以在方法里面以及在课堂上有最终的variables。 如果你把最后的静态变成“一个不变的类成员” 。
我无法区分最终静态成员和最终静态成员。 最终的静态成员是一个静态成员声明为最终或其他东西? 在哪些特定的情况下,他们应该具体使用?
当你希望它是static
时候使用final static
static
。 当你不希望它是static
时候使用final
(非静态)。
静态variables或最终静态variables不能在静态方法内或实例方法内部在方法中声明。 为什么?
devise决定。 没有问詹姆斯·高斯林就没有办法回答这个问题。
下面的代码片段将不会被编译,编译器会发出编译时错误,如果试图编译它。
因为它违反了刚刚描述的规则。
final关键字只是意味着“这个不能被改变”。它可以和方法中的字段和variables一起使用。当一个variables声明为final时,试图改变这个variables将导致编译时错误。例如,如果我声明一个variables为final int x = 12; 试图增加x就是(++ x)将会产生一个错误。简而言之,final是一个常量。 另一方面,静态只能应用于字段,而不能应用于方法。最终静态的字段只有一个存储区,最后一个字段表示它是一个常量(不能改变),静态表示它只有一个。