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
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)
Java statik başlatıcı...
Java idam statik blok...
Sonunda hep Java çalıştırmak mı?...
Java iç sınıf ve statik iç içe sınıf...
Hangi @NotNull açıklama Java kullanmal...