Как вы гарантируете, что унаследованное статическое поле всегда берет свое значение из подкласса, а не из базового класса? - PullRequest
3 голосов
/ 22 августа 2011

Я пытаюсь поместить метод hello в базовый класс A, и я хочу, чтобы он отображал значение x, установленное в подклассе.

Метод hello никогда не вызывается экземпляром A - этот класс является чистым базовым классом и никогда не создается.

Переменная x является классификатором для указания, откуда вызывается метод hello (это значение фактически сохраняется в базе данных);

Если в подклассе вызывается hello, как вы гарантируете, что значение x является значением, установленным в подклассе?

public class A{

  protected static String x = "A";

  public void hello(){
    System.out.println(x);
  }
}

public class B extends A{

  protected static String x = "B";

  //...
  hello();
}

public class C extends A{

  protected static String x = "C";

  //...
  hello();
}

Ответы [ 3 ]

4 голосов
/ 22 августа 2011

Вы не можете. Вы пытаетесь получить полиморфное поведение от полей, но они просто не ведут себя полиморфно. x в hello() привязан во время компиляции к полю в A.

Если вам нужно полиморфное поведение, вам нужно будет ввести неконечный (возможно, абстрактный) метод и переопределить его в каждом подклассе. Тогда hello() может вызвать этот метод, и полиморфизм обеспечит вызов правильного переопределения. Конечно, hello() не может быть статическим методом, поскольку полиморфизм также не применяется к статическим методам ... цель вызова метода (объект, который вы вызываете) будет определять реализацию б.

2 голосов
/ 22 августа 2011

Я бы сделал несколько изменений:

Сначала сделайте класс A abstract.Это гарантирует, что он никогда не будет создан.

Во-вторых, я бы изменил вашу переменную protected static на абстрактный метод в классе A.

Итак, вы бы получили

protected String x();

в классе A.И тогда вы будете вынуждены реализовать это в подклассах:

@Overrides
protected String x() {
   return "B";
}
0 голосов
/ 22 августа 2011

Вы не можете переопределить статическую переменную, фактически вы не можете переопределить любые переменные.Переопределение - для методов, скрытие - для переменных.

Чтобы сделать то, что вы хотите сделать (я думаю), в конструкторах вашего класса установите для частной переменной (избавьтесь от статики) значение «A»"ДО НАШЕЙ ЭРЫ".Избавьтесь от строк в классах B и C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...