我一直在浏览String.class文件(java.lang.String),我有几个问题。
该类的char[]声明为final,变量名为value。下面有一个构造函数,通过它设置char[]的值。
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}我的问题是:
1)如何通过构造函数设置最终变量的值?
第二,等量法。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}在此方法中,如果anObject是String的实例,则该方法将anotherString.value分配给char数组。但是,当我尝试执行String.value时,我会得到一个错误“值不可见”。我假设是因为它在String类中声明为私有,但是String类如何能够在String实例上使用anotherString.value呢?
发布于 2016-06-10 15:55:07
1.)在构造函数中设置最终变量的值是允许的,因为每次调用构造函数时,最终变量都是新变量。换句话说,每次调用构造函数时,都会生成一个新对象,该对象具有可以设置的新的最终变量。
2.)就像@ControlAltDel所说的,“在类中,可以在其他对象中访问私有方法和字段”,但是如果您只想将字符串设置为一个字符数组,只需使用"anotherString.toCharArray()“
希望这能有所帮助!用Java玩得开心
发布于 2016-06-10 15:58:05
static final,那么它将被静态地设置为该类和该类的所有实例。如果它声明的final是非静态的,那么它必须由每个实例初始化和设置,但在初始化后不能进一步修改。value成员不可见,因为它可能已声明为私有。另外,它是final,所以它是不可修改的。这是一个重要的概念,因为Java字符串是不可变的。发布于 2016-06-10 16:48:50
1)最终变量不需要在声明时初始化,但必须在使用之前初始化(指定值)一次。可以用任何一种方式,即只给最终实例变量赋值一次。( a)声明本身。b)实例初始化程序块。( c)建设者。
如果变量在声明期间被赋值,则Java编译器不允许在实例初始化器或构造器中重新分配。
如果在声明期间没有为实例变量赋值,那么Java编译器将允许在初始化器块中初始化值。在这种情况下,将不允许在构造函数中初始化。
如果在声明期间或在实例初始化程序块中未初始化值,则必须在Constructor中初始化值,否则将出现编译时错误,说明空白最终字段可能尚未初始化。
2)在类中,如果另一个对象是同一个类的实例,则可以访问另一个对象的私有成员变量。
https://stackoverflow.com/questions/37752237
复制相似问题