@daMage

Как работает наследование классов в java?

Помогите понять почему код возвращает 0 вместо 12:
class App {
	public static void main(String[] args) throws Exception {
		Params params = new Params();
		params.MACDFast = 12;
		params.MACDSlow = 16;
		params.MACDMA = 9;

		DSO dso = new DSO(params);
	}
}

class TSParams {
	public int MACDFast;
}

class Params extends TSParams {
	public int MACDFast, MACDSlow, MACDMA;
}

class TS {
	public TS(TSParams params) {
		System.out.println(params.MACDFast);
	}
}

class DSO extends TS {
	public DSO(Params params) {
		super(params);
	}
}


Такое ощущение, что конструктор класса TS работает не с обьектом, а со статической переменной класса TSParams. Собственно, как вывести истинное значение MACDFast из класса TS?
  • Вопрос задан
  • 2446 просмотров
Решения вопроса 2
@bimeg
В вашем случае поле Params.MACDFast спрятало (hided) поле TSParams.MACDFast (их стало два).
Более того, поля разруливаются используя compile-time type.
Поэтому в main вы задали поле Params.MACDFast, а поле TSParams.MACDFast осталось с дефолтным значением - 0.
Но во конструкторе TS у вас compile-time type - TSParams, поэтому вы прочитали поле TSParams.MACDFast (0), а не Params.MACDFast (12).

Чтобы это исправить в вашем примере достаточно удалить MACDFast из класса Params.
Ответ написан
anyd3v
@anyd3v
У вас в классах
class TSParams {
public int MACDFast;
}

class Params extends TSParams {
public int MACDFast, MACDSlow, MACDMA;
}

одинаковое поле MACDFast, уберите его из Params и будет работать как ожидается.

When you declare a field with the same name as an existing field in a superclass, the new field hides the existing field. The existing field from the superclass is still present in the subclass, and can even be used ... subject to the normal Java access rules.

References:

docs.oracle.com/javase/tutorial/java/IandI/hidevar...
docs.oracle.com/javase/specs/jls/se7/html/jls-8.ht...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы