2013-08-16 2 views
0

Я начинающий Java, и я изучаю подклассы и суперклассы.Java Beginner: Подклассы и суперклассы. Можете ли вы удалить значения?

Я знаю, что вы можете добавлять значения/атрибуты/поведение, которые не находятся в суперклассе, в подкласс, чтобы сделать его более «специфичным для задачи».

Но мой вопрос: могу ли я удалить атрибут или значение поведения, принадлежащее суперклассу из подкласса?

+2

Что вы подразумеваете под удалением атрибута? Можете ли вы объяснить это для этого? Зачем тебе это? –

ответ

0

extend предполагает наследование. У вас нет точного выбора по тому, что вы можете наследовать, а что нет.

Если родительский класс решил разоблачить некоторые общедоступные переменные и т. Д., Подкласс не может изменить это.

Если родительский класс не хочет выставлять некоторые поля, они могут быть помечены как private.

Также: класс должен быть открыт для его расширения, но закрыт для его изменения.

+0

Это неправильный способ сделать это, на мой взгляд ... 'private' просто отмечает видимость. видимость! = существование –

+0

@PhilippSander Конечно, подкласс не сможет удалить поле из суперкласса. 'private' является рекомендуемым решением, существование этого поля никогда не будет раскрыто снаружи. Решение должно быть создателем родительского класса, а не тем, кто его использует. –

6

простой ответ:

Нет, вы не можете И не должны!

Должно быть всегда, что суперкласс имеет атрибут.

Взгляните на это: Liskov Substitution Principle

+0

+1 для Принципа замещения Лискова. –

0

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

class Employee { 
    String name = "Employee"; 
    public void work() { 
     System.out.println("Do some work"); 
    } 
} 

class Programmer extends Employee { 
    String name = "Programmer"; 
    public void work() { 
     System.out.println("Write programs"); 
    } 
} 
+1

Это не главное. Он скрывается. Поле, объявленное в суперклассе, также существует в экземплярах подкласса. –

+0

Стивен, может быть, я ошибся с терминологией. Вы имеете в виду, что поле «имя» Employee скрыто в Programmer (мы можем получить его в Programmer по super.name в любом случае), но метод работы() переопределен, правильно? –

+1

Это правильно. Но разные термины имеют разные значения. Скрытый метод можно увидеть, но переопределенный метод не может быть вызван извне. –