У меня есть вопрос, похожий на В Java, почему я не могу объявить конечный член (без его инициализации) в родительском классе и установить его значение в подклассе?Как я могу обойти? , но требует другого решения.Как и в приведенном выше случае, я хочу объявить переменную как Final в суперклассе, но я хочу, чтобы подкласс дал ей значение.Однако моя проблема отличается тем, что я не хочу, чтобы значение передавалось подклассу, я хочу, чтобы подкласс «знал» его значение, поэтому приведенное выше решение не работает для меня.Затем я попытался сделать это:
public class Superclass{ public final int x; public Superclass(int x){ this.x = x; } } public class Subclass extends Superclass{ public Subclass(){ x = 1; super(x); } }
... который не работал (вызов super () должен быть в первой строке: /).Но это в основном то поведение, которое я хочу.Есть ли хороший способ сделать это?Спасибо!
Вы можете сделать
super(1);
, поэтому вместо установки x вы передаете значение.
Альтернатива вышеупомянутой:
class Superclass{ public final int x; public Superclass(int x){ this.x = x; } public static Superclass createNew(Integer y) { return new Superclass(y); } public void print() { System.out.println(this.x); } } class Subclass extends Superclass{ public Subclass(int x) { super(process(x)); } public static Integer process(Integer y) { if (y < 100) y += 100; return y; } }
У меня нет удобного компилятора Java, но вы пытаетесь установить x = 1 дважды в этом коде.
x = 1;
И
super(x); //==> this.x = x
Делайте, как сказал @Kal, и выполняйте super (1), так как x = 1 не будет работать.