android文档中字段和常量之间有什么区别?

时间:2015-06-14 16:58:48

标签: java android

Android文档中的字段和常量有什么区别? 例如在View Class中我们有Fields和Constants.Whiles,我认为View类中的常量是Fields。因为每个类中的每个变量都是Field。请举例说明这种含糊之处。

3 个答案:

答案 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的源代码中看到

  

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java#7857

     

我们在这里看到

     

public static final int FILL_PARENT = -1;

所以常量不过是最终字段而已

希望这会有所帮助!