İlk olarak, bir bulmaca: Aşağıdaki kod ne yazdırıyor?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
Cevap:
0
Aşağıdaki spoiler.
Eğer yazdırmak için X
ölçek (uzun) ve yeniden tanımlamak içinde X = scale(10) + 3
, baskılar olacak X = 0
o zaman X = 3
. Bu X
, geçici olarak 0
ve daha sonra olarak ayarlandığı anlamına gelir 3
. Bu bir ihlaldir final
!
Statik değiştirici, son değiştirici ile birlikte sabitleri tanımlamak için de kullanılır. Son değiştirici, bu alanın değerinin değiştirilemeyeceğini gösterir .
Kaynak: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [vurgu eklendi]
Sorum: Bu bir hata mı? Is final
kötü tanımlanmış?
İşte ben ilgilendiğim kod.
X
İki farklı değer atanır: 0
ve 3
. Bunun bir ihlali olduğuna inanıyorum final
.
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
Bu soru, Java statik son alan başlatma sırasının olası bir kopyası olarak işaretlendi . Bu soru olduğuna inanıyoruz değil benim sorum ile birlikte halkalı başlatma adresleri ise diğer soru adresleri başlatma sırası beri yinelenen final
etiketi. Sadece diğer sorudan, sorumun neden bir hata yapmadığını neden anlayamıyorum.
Bu özellikle ernesto'nun elde ettiği çıktıya bakarak açıktır: a
etiketlendiğinde final
aşağıdaki çıktıyı alır:
a=5
a=5
sorumun ana kısmını içermiyor: Bir final
değişken kendi değişkenini nasıl değiştirir?
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
X
üyeye gönderme yapmanın yolu , süper sınıf kurucusu bitmeden önce bir alt sınıf üyesine başvurmak gibidir, bu sizin probleminizdir ve tanımı değilfinal
.