SORU
5 Ocak 2010, Salı


Hangi sırayla Java statik başlatıcı blok çalıştırmak mı?

Bir proje her statik başlatıcı bir blok var birkaç sınıfı içerir söylüyorlar. Hangi sırayla bu bloklar kullanıyor? Bir sınıf içinde, bu blok kodu olarak göründükleri sırayla çalıştırmak olduğunu biliyorum. Sınıflar arasında aynı olduğunu okudum, ama yazdığım bazı örnek kod ile aynı fikirde değil. Bu kodu kullandım

package pkg;

public class LoadTest {
    public static void main(String[] args) {
        System.out.println("START");
        new Child();
        System.out.println("END");
    }
}

class Parent extends Grandparent {
    // Instance init block
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }

    // Static init block
    static {
        System.out.println("static - parent");
    }
}

class Grandparent {
    // Static init block
    static {
        System.out.println("static - grandparent");
    }

    // Instance init block
    {
        System.out.println("instance - grandparent");
    }

    // Constructor
    public Grandparent() {
        System.out.println("constructor - grandparent");
    }
}

class Child extends Parent {
    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }

    // Static init block
    static {
        System.out.println("static - child");
    }

    // Instance init block
    {
        System.out.println("instance - child");
    }
}

ve bu çıkış var:

BAŞLAYIN
statik - büyükbaba
statik ana - baba
statik - çocuk
örnek - büyükbaba
kurucu - büyükbaba
örnek - veli
kurucu - üst
örnek bir çocuk
kurucu - çocuk
SONUNDA

Bunun cevabı ebeveynlerin' blok çocuklarını önce çalışacak, ama bu sadece bir tesadüf olabilir ve eğer iki sınıf aynı hiyerarşi içinde değilse yardımcı olmuyor.

DÜZENLEME:

Bu loadtest.java ekleyerek örnek Şifremi değiştirdim:

class IAmAClassThatIsNeverUsed {
    // Constructor
    public IAmAClassThatIsNeverUsed() {
        System.out.println("constructor - IAACTINU");
    }

    // Instance init block
    {
        System.out.println("instance - IAACTINU");
    }

    // Static init block
    static {
        System.out.println("static - IAACTINU");
    }
}

Sınıf adı ile dolaylı olarak, hiçbir yerde yeni sınıf başvuruyor. Yeni program eskisinin aynı çıktıyı üretti.

CEVAP
5 Ocak 2010, Salı


Bu konuda kanlı detaya giderler Java 7 Language Specification Bölüm 12.4 ve 12.5 (örnek değişkenler için statik için 12.4 ve 12.5).

Başlatma (bölüm 12.4): statik

Sınıf veya arabirim tipi bir T hemen aşağıdaki birini ilk geçtiği önce başlatılmış olacak:

  • T sınıfı ve T bir örneği oluşturulur.
  • T bir sınıf statik bir yöntem T tarafından ilan çağrılır.
  • Statik bir alan T tarafından ilan atanır.
  • Statik bir alan T tarafından ilan kullanılır ve alanı sabit bir değişken (§4.12.4) değildir.
  • T üst düzey bir Sınıf (Madde 7.6) ve bir açıklama (§14.10 geçerli) lexically iç içe geçmiş T içinde (§8.1.3) yürütülür iddia.

(gelincik-word çok sayıda madde)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011