Ответ 1
Потому что, если вы изменили реализацию элемента данных, это вполне возможно сломало бы суперкласс (представьте, что вы меняете член данных суперкласса от float до String).
Почему мы не можем переопределить переменную экземпляра суперкласса в подклассе?
Потому что, если вы изменили реализацию элемента данных, это вполне возможно сломало бы суперкласс (представьте, что вы меняете член данных суперкласса от float до String).
Он, возможно, хотел попробовать и переопределить значение, используемое для инициализировать переменную. Например,
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";
// ...
}
Потому что вы можете только переопределить поведение, а не структуру. Структура создается в камне, как только объект был создан, и для него выделена память. Конечно, это обычно верно для статически типизированных языков.
Полимеры не получают доступ к переменным. Что бы вы хотели сделать с этим, что вы не можете сделать с защищенной переменной? (Не то, чтобы я лично поощрял использование не-частных изменяемых переменных лично.)
class Dad{
public String name = "Dad";
}
class Son extends Dad{
public String name = "Son";
public String getName(){
return this.name;
}
}
Из метода main(), если вы вызываете
new Son().getName();
вернет "Сын" Вот как вы можете переопределить переменную суперкласса.
Вы имеете в виду переопределение, которое вы хотите изменить тип данных, например?
Что вы делаете с этим выражением
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 ++ без перегрузки оператора или что-то вроде этого.
Если вам нужно переопределить переменную экземпляра, вы почти наверняка наследуете класс 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 (как вы видите, грязное программирование провоцирует более грязное програмирование).
Лучшее решение - найти другое имя для переменной.
вы можете переопределить метод, это все в порядке но что вы имеете в виду, переопределяя переменную? если вы хотите использовать переменную в любом другом месте, а не суперкласс u можете использовать супер. как в супер (имена переменных); почему вы хотите переопределить переменную? я имею в виду, есть ли необходимость?
мы не можем переопределять структуру переменных экземпляра, но мы избегаем их поведения: -
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.