Android文档中的字段和常量有什么区别? 例如在View Class中我们有Fields和Constants.Whiles,我认为View类中的常量是Fields。因为每个类中的每个变量都是Field。请举例说明这种含糊之处。
答案 0 :(得分:3)
编译应用程序时,任何常量值都会直接编译到应用程序中。使用来自@CommonsWare评论的示例,ACCESSIBILITY_LIVE_REGION_ASSERTIVE
是一个值为2的整数。即使View类在Android的未来版本中更新,您的应用程序仍将继续使用该值,这就是为什么你可以使用不要说“我目前正在运行什么版本的Android”。相反,它是记录您的应用程序编译的SDK的哪个版本的好方法。
字段是最终的,这意味着您无法更改它们,除非您使用JNI,在这种情况下您可以使用JNI。但是,因为编译器会尽可能直接使用这些值,所以更改最终字段的值不会影响任何代码 - 除非它通过反射访问它们。
因此,“常数”和“场”之间的区别可能很重要。
原始类型和字符串可以是常量。对于数组和其他对象类型,例如int[]
用于SELECTED_STATE_SET
,引用本身是只读的,但对象的内容不是。对于任何可变对象类型都是如此,因此将它们列在“常量”下是没有意义的。
答案 1 :(得分:1)
Java中没有Constant这样的东西。只有字段可以标记 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
}
如果在运行时无法识别分配给字段的值(例如,对对象或数组的引用),则不可能发生这种情况
因此,从技术上讲,静态最终字段和所谓的“常量”是相同的,但在文档中“常量”表示一些预定义的常量值,对于所有应用程序都是相同的(即数字,字符串)常数等)。 在“静态最终”下的“字段”中有一些对象,它们在应用程序启动后立即实例化,但它的值在编译时无法知道。例如,数组,一些对象实例等。 从技术上讲,你不能改变他们的价值观,因为他们是决赛,但你可以改变他们的内部内容。即您无法创建新对象或数组并将其分配给同一字段,但您可以更改已创建的数组/对象的项目或字段。
答案 2 :(得分:0)
尽管得到了正确答案,但也有同样的疑问。在ViewGroup.LayoutParams类中,有三个常量和三个字段
常量:
int WRAP_CONTENT
int FILL_PARENT
int MATCH_CONTENT
字段:
public int height
public layoutAnimationParameters
public int width
区别可以在android的源代码中看到
我们在这里看到
public static final int FILL_PARENT = -1;
所以常量不过是最终字段而已
希望这会有所帮助!