SORU
4 NİSAN 2013, PERŞEMBE


Neden bu Java kodu derlemek?

Yöntem veya sınıf kapsamı, sınırı altında derler (uyarı ile):

int x = x = 1;

Sınıf kapsamındadeğişkenleri varsayılan değerlerine getiraşağıdakileri verir 'tanımsız başvuru' hata:

int x = x   1;

Bu ilk x = x = 1 aynı 'başvurusu geçersiz' hatası? ile bitmelidir değil Ya da belki ikinci satır int x = x 1 derlemek gerekir? Ya da kaçırdığım bir şey mi var?

CEVAP
4 NİSAN 2013, PERŞEMBE


tl;dr

İçinalanlar, int b = b 1 b b yasadışı ileri bir referans olduğu için yasal değil. Aslında şikayet etmeden derler int b = this.b 1, yazarak düzeltebilirsiniz.

İçinyerel değişkenler, int d = d 1 d kullanmadan önce başlatılmadı, çünkü yasadışı. Budeğilher zaman varsayılan-başlatılmış olan alanlar için durum böyle.

Derleme deneyerek farkı görebilirsiniz

int x = (x = 1) x;

alan bir bildiri olarak ve yerel değişken bildirimi olarak. Eski başarısız olur, ama ikincisi, anlambilim farkından dolayı başarılı olur.

Giriş

Öncelikle, alan ve yerel değişken başlatıcılar için kurallar çok farklı. Bu cevap iki bölümden kuralları ele alınacak.

Bu test programı boyunca kullanacağız:

public class test {
    int a = a = 1;
    int b = b   1;
    public static void Main(String[] args) {
        int c = c = 1;
        int d = d   1;
    }
}

b ilanının geçersiz olduğu ve illegal forward reference bir hata ile başarısız olur.
d ilanının geçersiz olduğu ve variable d might not have been initialized bir hata ile başarısız olur.

Bu hatalar farklı olduğunu hatalar nedenleri de farklı ipucu.

Alanlar

Java alanında başlatıcılar JLS §8.3.2, Alanların Başlatma tarafından yönetilir.

kapsambir alan olarak tanımlanır JLS §6.3 bir Beyan Kapsamı.

İlgili kurallar şunlardır:

  • Üyesi ilanı kapsamında 20* *ilan veya sınıf bir tür tarafından devralınan C (§8.1.6) C, herhangi bir iç içe geçmiş bir tür bildirimleri de dahil olmak üzere tüm vücut.
  • Örnek değişkenleri başlatma ifadeler herhangi bir statik değişken veya sınıf, daha sonra sözel olarak ortaya çıkması bile tarafından bildirilen miras basit adını kullanabilir.
  • Ortaya çıkan örnek değişkenleri kullanımı sözel olarak kullanımından sonra bu örnek değişkenleri kapsam içinde olmasına rağmen bazen sınırlı kalıyor. Kesin kuralları örnek değişkenler için referans yöneten ileri §8.3.2.3 bakın.

Madde 8.3.2.3 diyor ki:

Üye ilanından önce sözel olarak görünmesi gerekiyor Eğer Üye bir örneği ise sadece kullanılan (sırasıyla) statik alan bir sınıf veya arabirim C ve aşağıdaki koşulların tümü tutun:

  • Kullanımı C. (sırasıyla statik) bir örnek başlatıcı C (sırasıyla statik) örnek değişken bir başlatıcı ya da oluşur
  • Kullanım sol taraftan atamanın tarafı değildir.
  • Kullanımı basit bir ad ile.
  • C en içteki sınıf veya arabirim kullanımı çevreleyen.

Aslında, bazı durumlar dışında ilan edilmiş olması önce alanlar için başvurabilirsiniz. Bu kısıtlamalar kodu gibi olmasını engellemek içindir

int j = i;
int i = j;

derleme. Java spec "kısıtlamalar üstünde yakalamak için, zaman, dairesel veya yoksa bozuk başlatmaları derleme tasarlanmıştır." diyor

Bu kurallar aslında mesele ne?

Kısacası, kuralları temelde söylüyorlargerekirilan bir alanda önceden bir başvuru alanı (a) referans olarak bir başlatıcı, (b) başvuru değil atanan, (c) başvurununbasit bir isim(this. gibi elemeleri) ve (d) varlık değildir, Bir iç sınıf içinde. erişilen Yani, dört koşulları karşılayan ileri bir referans yasadışı, ama en azından bir şartla başarısız olduğunu ileri başvuru TAMAM.

int a = a = 1; aykırı olduğu için derler (b): başvuru aatanmış, yani yasal a önceden a'In tam beyannamesi bakın.

Ayrıca bu ihlal nedeniyle, derler int b = this.b 1 (c): this.b basit bir ad (this. ile yetkili) değil referans. Hala mükemmel this.b değeri vardır, çünkü iyi tanımlanmış, bu tuhaf yapı sıfır.

Yani, temelde, başlatıcılar içinde alan referanslar kısıtlamalar başarıyla derlenmiş olmaktan int a = a 1 önlemek.

Bu alan bildirimi int b = (b = 1) b izleyebileceklerbaşarısızderlemek için, çünkü son b hala yasadışı ileri bir referanstır.

Yerel değişkenler

Yerel değişken bildirimi JLS §14.4 Yerel Değişken Bildirimi İfadeleri tarafından yönetilir.

kapsamyerel bir değişken tanımlanmış JLS §6.3 bir Beyan Kapsamı:

  • Kapsam yerel bir değişken bildirimi bir blok (madde 14.4) öteki blok bildiri görünür başlayarak, kendi başlatıcı ve dahil olmak üzere başka declarators hakkı yerel değişken bildirimi beyanı.

Başlatıcılar değişken bildirilmiş kapsamında olduğunu unutmayın. Neden mi int d = d 1; derleme değil?

Nedeni Java kuralı nedeniylekesin atama(JLS §16). Kesin atama yerel bir değişken için her giriş değişkeni için bir önceki atama olmalı yönelirler ve Java derleyici döngüler ve dalları bu atama emin olmak için denetlerher zamanoluşur, herhangi bir kullanımı (bu yüzden kesinlikle tüm özellikleri bir bölümü için ayrılmış olan) önce. Temel kural:

  • Yerel değişken veya boş son bir alanın her erişim için x, x kesinlikle erişim önce atanmış olmalı, ya da bir derleme zamanı hatası oluşur.

int d = d 1; erişim d çözümlendiğini yerel değişken, tamam, ama beri d kötü atanmış önce d erişilen, derleyici sorunları bir hata. int c = c = 1, c = 1 olur* *43, ve sonra c atama 1) sonucu başlatıldı atar önce.

Kesin atama kuralları nedeniyle, yerel değişken bildirimi 45* *unutmayınbaşarılı bir şekilde ( . derleme ^em>aksinealanı int b = (b = 1) b) bildirimi, d kesinlikle son d ulaşıldığında zaman tarafından atanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ama Jenna

    Ama Jenna

    29 NİSAN 2011
  • IGN

    IGN

    19 EYLÜL 2006
  • UKF Dubstep

    UKF Dubstep

    29 NİSAN 2009