可以表达
private static final String[] ARRAY = new String[]{"Word1", "Word2"};
在Java中被视为常量?不是常数只是原始类型?在这种情况下使用大写字母是否不恰当和误导?
编辑:添加了我最初忘记的private static final
部分。显然可以改变给定的阵列。这个问题的原因是我在代码中看到了(不正确的)用法,我想确认我的假设。
答案 0 :(得分:3)
特别是,这不是常数,因为如果你可以访问数组,你可以轻松地做到:
ARRAY = new String[]({"Word3"};
大写字母不能使变量成为常数。但是,final
修饰符可以:
final String[] ARRAY = new String[]{"Word1", "Word2"};
作为旁注,您可以查看difference between constant and immutable objects。
的内容答案 1 :(得分:2)
它可以被认为是Java中的常量吗?
没有
首先,由于变量不是final
,您可以分配给它。
其次,即使将变量声明为final
,也可以轻松更改数组的内容。所有Java数组都是可变的。
不仅仅是原始类型的常量吗?
实际上,没有。 final String
字段也是常量。 (它甚至可以用在常量表达式中。)
事实上,任何包含对不可变对象的引用的final
变量也可以被认为是常量。
在这种情况下使用大写字母是否不恰当和误导?
是。根据Java样式指南,大写+下划线模式仅适用于属性的变量,即static
和final
,它们是基元或对不可变对象的引用。您的示例至少在三个(如果不是全部四个)要求中失败。
答案 2 :(得分:1)
虽然String不是直接的原始数据类型(虽然是Char),但它在某些方面可以作为原始数据类型。因此,如果您对此类型使用final关键字,则会使其保持不变。
final String[] ARRAY = new String[]{"Word1", "Word2"};
但对于非基本类型,final关键字不会使对象属性为final,它只是对对象的最终引用。
想想Bird类型。说,它有像腿一样的属性。
Public class Bird{
int leg=2;
setLegs(int legs){
this.legs=legs};
}
现在,如果你初始化一个Bird,比如说Parrot带有关键字final,默认情况下它会有像leg = 2这样的属性。现在,引用是final(Parrot将始终引用Bird类型),但您仍然可以更改此对象的属性,如:
final Bird Parrot = new Bird();
Parrot.setlegs(3);
将腿数改为3.
如果你想保持腿数最终,那么你也需要将它用于腿变量,如:
Public class Bird{
final int leg=2;
setLegs(int legs){
this.legs=legs};
}
无论如何,我自己也不喜欢玩鸟腿,仅举例来说!