Почему мы не можем переопределить переменную экземпляра суперкласса в подклассе?
Переопределение переменных экземпляра суперкласса
Ответ 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.