2011-04-12 27 views
48
public enum MyUnits 
{ 
    MILLSECONDS(1, "milliseconds"), SECONDS(2, "seconds"),MINUTES(3,"minutes"), HOURS(4, "hours"); 

    private MyUnits(int quantity, String units) 
    { 
     this.quantity = quantity; 
     this.units = units; 
    } 

    private int quantity; 
    private String units; 

public String toString() 
{ 
    return (quantity + " " + units); 
} 

public static void main(String[] args) 
{ 
    for (MyUnits m : MyUnits.values()) 
    { 
     System.out.println(m.MILLSECONDS); 
     System.out.println(m.SECONDS); 
     System.out.println(m.MINUTES); 
     System.out.println(m.HOURS); 
    } 
} 
} 

Bu, post numaralı telefonu referans alıyor .. herhangi bir şekilde cevap yazdı veya ona yorum yapamadı. Neden benimStatik alana neden statik bir şekilde erişilmelidir?

System.out.println(m.MILLSECONDS); 

veren uyarılar-statiktir alan MyUnits.MILLSECONDS statik biçimde erişilebilir olmalıdır? Teşekkürler.

+7

"Java Code Optimization" olan başlığı değiştirdim. Lütfen soru başlığı hakkında daha fazla dikkat edin. –

+0

ya benim kötü, bir dahaki sefere bakacak :) – Ava

cevap

84

Statik bir alana eriştiğinizde, bunu sınıfta yapmanız gerekir (veya bu durumda enum). Eğer static olarak bir şeyler beyan zaman Java'da, sen öyle diyorsun: neden

m.MILLISECONDS; 

Düzenleme

gibi bir örneğinde
MyUnits.MILLISECONDS; 

Değil

olduğu gibi sorusunu ele almak Nesnenin bir üyesi değil, nesne (dolayısıyla neden sadece bir tane vardır). Bu nedenle, nesne üzerinde erişilmesi mantıklı değildir, çünkü o belirli veri üyesi sınıfla ilişkilidir.

+0

Çok teşekkürler! Anladım. – Ava

+7

Evet ... ama * Statik alana statik yoldan NEDEN *? – dokaspar

+0

@Dominik benim düzenlemelerime göz atın –

10

... o (MILLISECONDS) statik bir alandır (bir numaralandırma saklanırken, ama bu budur) ... ancak bir örneği Belirli bir türde üzerine çağrılan ediliyor (ama aşağıya bakınız Çünkü Bu gerçekten gerçek).

javac bunu "kabul" edecek, ancak gerçekten MyUnits.MILLISECONDS olmalıdır (veya geçerli kapsamda önceden eklenmemiş).

Aslında Javac tercih formuna kodu "yeniden yazar" - m olması oldu null o çalışma anında bir NPE atmak olmaz - aslında Örneğin üzerine çağrılan asla).

Mutlu kodlama.


dinlenme :-) Daha doğru ve uzman başlıklar muhtemel kaput soru artırmak ile Soru başlığı sığar nasıl Gerçekten görmüyorum/cevaplar diğer programcıları yararlanabilir.

48

iyi bir neden aslında var:
daima belirsizlik nedeniyle, çalışmıyor statik olmayan erişimi.

iki sınıfları, A ve B sahip varsayalım, ikincisi aynı isimde statik alanları ile A sınıfının bir alt sınıfı, varlık:

public class A { 
    public static String VALUE = "Aaa"; 
} 

public class B extends A { 
    public static String VALUE = "Bbb"; 
} 

statik değişkene doğrudan erişim:

A.VALUE (="Aaa") 
B.VALUE (="Bbb") 
bir örneğini kullanarak

dolaylı erişim (bu değer, bir uyarı derleyici statik erişilebilir olmalıdır verir):

new B().VALUE (="Bbb") 

Şimdiye kadar, çok iyi, derleyici hangi statik değişkeni kullanacağını tahmin edebilir, üst sınıftakiler bir şekilde uzaklaşıyor, bir şekilde mantıklı görünüyor.

Şimdi zorlaştığı noktaya: Arayüzler de statik değişkenlere sahip olabilir.

  • B implements C, D
  • B extends A implements C
  • B extends A implements C, D
  • B extends A implements CA implements D
  • :

    public interface C { 
        public static String VALUE = "Ccc"; 
    } 
    
    public interface D { 
        public static String VALUE = "Ddd"; 
    } 
    

    en aşağıdaki durumları B'den statik değişkeni kaldırmak ve gözlemlemek edelimderleyici statik değişken olması gerekenden karar veremez olarak

  • C extends D ...

açıklamada new B().VALUE, şimdi belirsiz olduğunu. Statik değişkenlerin statik bir şekilde erişilmesinin nedeni tam da budur.

+8

Doğru cevap IMO olmalı, bunun neden tehlikeli olduğunu gösteriyor. – Water

+3

@ChrisThompson'un "neden" in yanıtı sadece "mantıklı değil - statik olarak nitelendirdiniz, bu yüzden onu statik olarak kullan" - BU cevap gerçekten neden haklı gösteriyor? kötü sonuç – mmcrae

+3

Bu cevabın kabul edilene göre çok daha faydalı olduğunu kabul ediyorum. SO her zaman sanırım gerektiği gibi çalışmıyor! Yine de harika. Son olarak, bir sonraki ilginç soru sanırım: ilk etapta örneklerden statik alanlara veya yöntemlere erişmek neden mümkündür? – Dici

İlgili konular