Вопрос-ответ

Is there a way to override class variables in Java?

Есть ли способ переопределить переменные класса в Java?
class Dad
{
protected static String me = "dad";

public void printMe()
{
System.out.println(me);
}
}

class Son extends Dad
{
protected static String me = "son";
}

public void doIt()
{
new Son().printMe();
}

Функция doIt напечатает "папа". Есть ли способ заставить ее печатать "сын"?

Переведено автоматически
Ответ 1

Короче говоря, нет, нет способа переопределить переменную класса.

Вы не переопределяете переменные класса в Java, вы их скрываете. Переопределение относится к методам экземпляра. Скрытие отличается от переопределения.

В приведенном вами примере, объявляя переменную класса с именем 'me' в class Son, вы скрываете переменную класса, которую она унаследовала бы от своего отца-суперкласса с тем же именем 'me'. Скрытие переменной таким образом не влияет на значение переменной класса 'me' в суперклассе Dad.

Что касается второй части вашего вопроса о том, как заставить его печатать "son", я бы установил значение через конструктор. Хотя приведенный ниже код довольно сильно отличается от вашего первоначального вопроса, я бы написал его примерно так;

public class Person {
private String name;

public Person(String name) {
this.name = name;
}

public void printName() {
System.out.println(name);
}
}

JLS дает гораздо больше подробностей о скрытии в разделе 8.3 - Объявления полей

Ответ 2

ДА. Но что касается переменной, то она перезаписывается (присваивается новое значение переменной. Переопределяется новое определение функции). Просто не объявляйте переменную, а инициализируйте (измените) в конструкторе или статическом блоке.

Значение будет отражено при использовании в блоках родительского класса

если переменная статическая, то измените значение во время самой инициализации с помощью static block,

class Son extends Dad {
static {
me = "son";
}
}

или же изменить в конструкторе.

Вы также можете изменить значение позже в любых блоках. Это будет отражено в суперклассе

Ответ 3

Да, просто переопределите printMe() метод:

class Son extends Dad {
public static final String me = "son";

@Override
public void printMe() {
System.out.println(me);
}
}
Ответ 4

Вы можете создать средство получения, а затем переопределить это средство получения. Это особенно полезно, если переопределяемая вами переменная сама по себе является подклассом. Представьте, что в вашем суперклассе есть Object член, но в вашем подклассе это теперь более точно определено как Integer.

class Dad
{
private static final String me = "dad";

protected String getMe() {
return me;
}

public void printMe()
{
System.out.println(getMe());
}
}

class Son extends Dad
{
private static final String me = "son";

@Override
protected String getMe() {
return me;
}
}

public void doIt()
{
new Son().printMe(); //Prints "son"
}
java inheritance