java: "son" Sistemi.dışarı, Sistemi.ve Sistem.err?
System.out
public static final PrintStream out
olarak ilan edilmiştir.
Ama System.setOut()
yeniden atama için arayabilirsiniz.
Değil mi? Nasıl olursa final
Eğer bu mümkün müdür?
(aynı nokta System.in
System.err
için geçerlidir)
Ve eğer son kamu alanları statik mutasyona eğer daha da önemlisi, ne bu final
sana verdiği kadarıyla garanti (varsa) anlamına mı geliyor? (Ben hiç farketmemiştim, ne de Sistem bekleniyor.dışarı//final
değişkenler) gibi davrandım hata
CEVAP
JLS 17.5.4 Write Protected Fields:
Normalde, son statik alanlar değiştirilemez. Ancak
System.in
,System.out
System.err
final static alanlar, eski nedenler olmalı hakkı verilerek değiştirilmiştir yöntemleriSystem.setIn
,System.setOut
System.setErr
. Olarak bu alanlara bakınyazma korumalısıradan son alanları ayırmak için.Derleyici bu alanlar farklı diğer final alanlardan tedavi etmesi gerek. Örneğin, sıradan bir final alan bir okuma" için senkronizasyon: bariyer kilit ya da uçucu bir okuma dahil son bir alan. okunur etkiler yok "bağışıklık Yazma korumalı alan değerini değiştirmek için olabilir bu yana, eşitleme olayları üzerinde bir etkiye sahip olmalıdır. Bu nedenle, anlambilim bu alanlar kullanıcı kodu
System
sınıfta olmadığı sürece, kullanıcı kodu tarafından değiştirilemez normal alanlar gibi muamele ediyordu.
Bu arada, aslında onlara setAccessible(true)
(ya da Unsafe
yöntemler kullanarak) çağırarak yansıma) final
alanlar mutasyona edebilirsiniz. Bu tür teknikler kullanılır seri kaldırma sırasında, Hazırda bekleme ve diğer çerçeveler, vb, ama onlar bir sınırlama: kod gördük değeri son alan değişikliği önce değil garantili görmeye değer sonra yeni bir değişiklik. Söz konusu alanları özel derleyici tarafından özel bir şekilde tedavi oldukları için bu sınırlama serbest olmasıdır.
önleme "kaynak dosya sistemi"...
Neden't "Sistem değil.dışarı...
@Html.BeginForm Görüntüleme "Sist...
Windows update "tür veya ad alanı...
sistemi("pause"); - Neden ya...