Подтвердить что ты не робот

Переопределение переменных экземпляра суперкласса

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

4b9b3361

Ответ 1

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

Ответ 2

Он, возможно, хотел попробовать и переопределить значение, используемое для инициализировать переменную. Например,

Вместо этого (что является незаконным)

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";
    // ...
}

Ответ 3

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

Ответ 4

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

Ответ 5

class Dad{
    public String name = "Dad";
}
class Son extends Dad{
    public String name = "Son";
    public String getName(){
        return this.name;
    }
}

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

new Son().getName();

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

Ответ 6

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

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

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 ++ без перегрузки оператора или что-то вроде этого.

Ответ 7

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

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

class A has variable V1 of type X;

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

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

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

Ответ 8

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

Ответ 9

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

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.