2010-03-17 4 views

ответ

23

Поскольку наследование предназначено для изменения поведения. Поведение проявляется через методы, и именно поэтому их можно переопределить.

Поля не являются поведением, а состоянием. Вам не нужно изменять это, а также частные методы, используемые суперклассом. Они предназначены для того, чтобы позволить суперклассу выполнять свою работу.

28

Вы можете скрыть a поле, но не переопределить it.

Скрытие означает, что поле будет иметь другое значение, в зависимости от того, к какому классу он обращается. Поле в подклассе «скроет» поле в суперклассе, но оба они существуют.

Это очень плохая практика, чтобы скрыть поле, но работает:

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 
    } 
} 

В зависимости от того, метод перекрываться, поле в A или B доступ.

Никогда не делайте этого! Это никогда не является решением вашей проблемы и создает очень тонкие ошибки, связанные с наследованием.

+0

О, для множественных upvotes для императивного совета НЕ ДЕЛАЙТЕ ЭТО. Это похоже на злого повелителя, превращающегося в змею ... Это никогда не помогает. –

+0

Есть тонкие причины, по которым вам может понравиться: особенно со статическими полями классов, к которым вы обращаетесь, специально используя имя супер или подкласса. «Никогда» никогда не бывает хорошо говорить;) – RichieHH

+0

Использование статики - это совсем другое дело, Oracle имеет такое же предложение с @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT

1

Потому что:

  • Это может нарушить parent class код. Для примера рассмотрим следующий код (Что бы поведение линии obB.getInt(); в следующем коде, если переменные экземпляра переопределяете разрешено):

    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(); 
        } 
    } 
    
  • Это не логично потому child class должны иметь/отражать все поведение от parent class.

Таким образом, вы только можете скрыть наследуемые методы/переменные в child class, но не может override.

Ниже приводится выдержка из Java doc from Oracle указания какую операцию вы можете выполнить/ожидать от child class:

Вы можете использовать унаследованные как заменить их, скрывать их, или дополнять их новыми членами :

  • Унаследованные поля могут использоваться напрямую, как и любые другие поля.
  • Вы можете объявить поле в подклассе с тем же именем, что и в суперклассе, тем самым скрывая его (не рекомендуется).
Смежные вопросы