Переопределение переменных экземпляра суперкласса - PullRequest
27 голосов
/ 09 января 2009

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

Ответы [ 9 ]

48 голосов
/ 14 октября 2011

Возможно, он хотел переопределить значение, используемое для инициализации переменной. Например,

Вместо этого (что незаконно)

public abstract class A {
    String help = "**no help defined -- somebody should change that***";
    // ...
}
// ...
public class B extends A {
    // ILLEGAL
    @Override
    String help = "some fancy help message for B";
    // ...
}

Нужно сделать

public abstract class A {
    public String getHelp() {
        return "**no help defined -- somebody should change that***";
    }
    // ...
}
// ...
public class B extends A {
    @Override
    public String getHelp() {
        return "some fancy help message for B";
    // ...
}
21 голосов
/ 09 января 2009

Потому что, если вы измените реализацию элемента данных, вполне возможно, что он сломает суперкласс (представьте, что элемент данных суперкласса может быть изменен с плавающего на String).

9 голосов
/ 09 января 2009

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

5 голосов
/ 09 января 2009

Переменные не доступны полиморфно. Что бы вы хотели сделать с этим, что вы не можете сделать с защищенной переменной? (Не то чтобы я вообще поощрял использование непубличных изменяемых переменных).

2 голосов
/ 31 марта 2015
class Dad{
    public String name = "Dad";
}
class Son extends Dad{
    public String name = "Son";
    public String getName(){
        return this.name;
    }
}

Из метода main (), если вы вызываете

new Son().getName();

вернется "Сын" Вот как вы можете переопределить переменную суперкласса.

0 голосов
/ 07 сентября 2013

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

class A
{
int x = 5;
}

class B extends A
{
int x = 7:
}

class Main
{
public static void main(String dh[])
{
A obj = new B();
System.out.println(obj.x);
}
}

в этом случае вывод равен 5.

0 голосов
/ 04 августа 2009

вы можете переопределить метод, все в порядке но что вы подразумеваете под переопределением переменной? если вы хотите использовать переменную в любом другом месте, а не суперкласса ты можешь использовать супер. как в супер (имена переменных); почему вы хотите переопределить переменную? Я имею в виду, есть ли необходимость?

0 голосов
/ 09 января 2009

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

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

class A has variable V1 of type X;

class B inherits from A, but reintroduces V1 of type Y.

Методы класса A все еще могут получить доступ к исходному V1. Методы класса B могут получить доступ к новому V1. И если они хотят получить доступ к оригиналу, они могут привести себя к классу А (как вы видите, грязное программирование вызывает более грязное программирование).

Лучшее решение - найти другое имя для переменной.

0 голосов
/ 09 января 2009

Вы имеете в виду, что при переопределении вы хотите изменить тип данных, например?

Что вы делаете с этим выражением

public class A {
   protected int mIndex;

   public void counter(){
      mIndex++;
   }

}

public class B extends A {
   protected String mIndex; // Or what you mean with overloading
}

Как вы хотите изменить выражение mIndex ++ без перегрузки операторов или чего-то подобного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...