Java android文档中的字段和常量有什么区别?

Java android文档中的字段和常量有什么区别?,java,android,Java,Android,android文档中的字段和常量有什么区别? 例如,我们有字段和常量,而我认为View类中的常量是字段。因为每个类中的每个变量都是字段。请给我举个例子,说明这种模糊性 编译应用程序时,任何常量值都会直接编译到应用程序中。以@commonware的评论为例,ACCESSIBILITY\u LIVE\u REGION\u ASSERTIVE是一个值为2的整数。即使在未来的Android版本中更新了View类,你的应用程序也会继续使用该值,这就是为什么你不能将“我当前运行的Android版本”作为常量

android文档中的字段和常量有什么区别?
例如,我们有字段和常量,而我认为View类中的常量是字段。因为每个类中的每个变量都是字段。请给我举个例子,说明这种模糊性

编译应用程序时,任何常量值都会直接编译到应用程序中。以@commonware的评论为例,
ACCESSIBILITY\u LIVE\u REGION\u ASSERTIVE
是一个值为2的整数。即使在未来的Android版本中更新了View类,你的应用程序也会继续使用该值,这就是为什么你不能将“我当前运行的Android版本”作为常量。相反,这是一种很好的方法来记录应用程序编译时所使用的SDK版本

这些字段是最终字段,这意味着您不能更改它们,除非您使用JNI,在这种情况下您可以。但是,由于编译器尽可能直接使用这些值,因此更改最终字段的值不会影响任何代码——除非它通过反射访问它们

因此,“常量”和“字段”之间的区别可能很重要


基本类型和字符串可以是常量。对于数组和其他对象类型,例如用于所选状态集的
int[]
,引用本身是只读的,但对象的内容不是只读的。这适用于任何可变对象类型,因此在“常量”下列出它们是没有意义的。

编译应用程序时,任何常量值都会直接编译到应用程序中。以@commonware的评论为例,
ACCESSIBILITY\u LIVE\u REGION\u ASSERTIVE
是一个值为2的整数。即使在未来的Android版本中更新了View类,你的应用程序也会继续使用该值,这就是为什么你不能将“我当前运行的Android版本”作为常量。相反,这是一种很好的方法来记录应用程序编译时所使用的SDK版本

这些字段是最终字段,这意味着您不能更改它们,除非您使用JNI,在这种情况下您可以。但是,由于编译器尽可能直接使用这些值,因此更改最终字段的值不会影响任何代码——除非它通过反射访问它们

因此,“常量”和“字段”之间的区别可能很重要


基本类型和字符串可以是常量。对于数组和其他对象类型,例如用于所选状态集的
int[]
,引用本身是只读的,但对象的内容不是只读的。任何可变对象类型都是如此,因此在“常量”下列出它们是没有意义的。

Java中没有常量。只有一些字段可以将标记为static成为类字段(即,对于同一类的所有对象,每个类一个实例,而不是每个对象一个实例,好像没有“static”)。您可以通过类名引用访问静态字段,而无需实例化该类(即MyClassName.sMyStaticField) 此外,您还可以将字段标记为“最终”。这意味着在初始化代码中指定的字段值永远不会更改。如果要为静态最终字段指定一个常量值(例如,一个数字),该值将保持不变,并且对于所有类实例都是相同的。因此,在Java中,它被用作常量值,将特定值分配给特定名称。 由于它们的值在编译时已知,因此可以使用它们进行条件编译。根据这些常量值,部分代码可能在编译时被排除

public static final boolean ENABLE_MY_SUPER_DUPER = false;

...


if (ENABLE_MY_SUPER_DUPER) {
    doSuperDuper(); // Not just never executed, but not even compiled
}
如果在运行时无法知道分配给字段的值(例如,对对象或数组的引用),则不会发生这种情况

因此,从技术上讲,静态最终字段和所谓的“常量”是相同的,但在文档中,“常量”表示一些预定义的常量值,对于所有应用程序(即数字、字符串常量等)都是相同的。 虽然在“static final”下的“field”中有一些对象,它们在应用程序启动后实例化一次,但在编译时无法知道其值。例如,数组、一些对象实例等。
从技术上讲,您不能更改它们的值,因为它们是最终版本,但您可以更改它们的内部内容。也就是说,您不能创建新对象或数组并将其分配给同一字段,但可以更改已创建的数组/对象的项或字段。

Java中没有常量。只有一些字段可以将标记为static成为类字段(即,对于同一类的所有对象,每个类一个实例,而不是每个对象一个实例,好像没有“static”)。您可以通过类名引用访问静态字段,而无需实例化该类(即MyClassName.sMyStaticField) 此外,您还可以将字段标记为“最终”。这意味着在初始化代码中指定的字段值永远不会更改。如果要为静态最终字段指定一个常量值(例如,一个数字),该值将保持不变,并且对于所有类实例都是相同的。因此,在Java中,它被用作常量值,将特定值分配给特定名称。 由于它们的值在编译时已知,因此可以使用它们进行条件编译。根据这些常量值,部分代码可能在编译时被排除

public static final boolean ENABLE_MY_SUPER_DUPER = false;

...


if (ENABLE_MY_SUPER_DUPER) {
    doSuperDuper(); // Not just never executed, but not even compiled
}
如果在运行时无法知道分配给字段的值(例如,对对象或数组的引用),则不会发生这种情况

因此,从技术上讲,静态最终字段和所谓的“常量”是相同的,但在文档中,“常量”表示一些预定义的常量值,对于所有应用程序都是相同的(即NUB
public int height
public layoutAnimationParameters
public int width