2010-03-17 37 views

cevap

23

Davranış, yöntemlerle ortaya çıkar ve bu yüzden geçersiz kılınabilirler.

Alanlar davranış değil, durumdur. Bunu değiştirmek zorunda değilsiniz, ayrıca süper sınıfın kullandığı özel yöntemler. Üst sınıfın işi yapmasına izin vermesi amaçlanmıştır.

28

alanını bir alana gizleyebilirsiniz, ancak geçersiz kılma it.

Gizleme, bir alanın hangi sınıfa eriştiğine bağlı olarak farklı bir değere sahip olacağı anlamına gelir. Alt sınıftaki alan, süper sınıftaki alanı "gizler", ancak her ikisi de var.

alanını gizlemek için son derece kötü bir uygulama, ama işleri

: yöntem A veya B yılında, saha overriden edildi bağlı olarak

public class HideField { 

    public static class A 
    { 
     String name = "a"; 

     public void doIt1() { System.out.println(name); }; 
     public void doIt2() { System.out.println(name); }; 
    } 

    public static class B extends A 
    { 
     String name = "b"; 

     public void doIt2() { System.out.println(name); }; 
    } 

    public static void main(String[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doIt1(); // print a 
     b.doIt1(); // print a 
     a.doIt2(); // print a 
     b.doIt2(); // print b <-- B.name hides A.name 
    } 
} 

erişilir.

Bunu asla yapmayın! Bu sizin probleminizin çözümü değildir ve miras ile ilgili çok ince hatalar yaratır.

+0

Bu işlemi yapmamanın zorunlu önerisi için birden çok yükseltmedir. Bir yılana dönüşen şeytani bir lütuf gibi bir şey .... Bu asla yardımcı olmaz. –

+0

Özellikle neden süper veya alt sınıf adını kullanarak eriştiğiniz statik sınıf alanları ile yapmak isteyebileceğiniz ince nedenler vardır. "Asla" asla söylemek için iyi bir şey değildir;) – RichieHH

+0

Statik kullanmak tamamen başka bir şeydir, Oracle @ewernli ile aynı öneriye sahiptir: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT

1

Çünkü:

  • O parent class kodu kırabilir. Örneğin kod aşağıdakileri dikkate (Aşağıdaki kodda hattının obB.getInt(); davranışı ne olurdu basan örnek değişkenler izin verilir ise):

    class A 
    { 
        int aInt; 
    
        public int getInt() 
        { 
         return aInt; 
        } 
    } 
    
    class B extends A 
    { 
        int aInt; 
    
        public int getInt2() 
        { 
         return aInt; 
        } 
    
        public static void main(String[] args) 
        { 
         B obB = new B(); 
    
         //What would be behavior in following line if, 
         //instance variables overriding is allowed 
         obB.getInt(); 
        } 
    } 
    
  • O mantıksalchild class çünkü tüm davranışlar/var yansıtmalıdır değil parent class'un.

Yani, child class içinde kalıtsal yöntemler/değişkenleri gizleme sadece ama override yapamam olabilir.

ardından Java doc from Oracle bir özü neyi işlem, child class beklemek/gerçekleştirebilir belirterek geçerli:

Sen olarak, bunları gizlemek, bunların yerine, ya da yeni üyelerle bunları tamamlayacak kalıtsal üyeleri kullanabilirsiniz :

  • Devralınan alanlar, diğer tüm alanlar gibi doğrudan kullanılabilir.
  • Alt sınıfta, süper sınıftakiyle aynı ada sahip bir alanı bildirebilir ve gizleyebilirsiniz (önerilmez).