Java: финальные переменные в абстрактных классах - PullRequest
13 голосов
/ 02 июля 2011

В Java я не могу создавать экземпляры абстрактных классов. Так почему же не затмить крик о следующем коде?

public abstract class FooType {
    private final int myvar;

    public FooType() {
        myvar = 1;
    }
}

Ответы [ 5 ]

16 голосов
/ 02 июля 2011

Код в порядке, финальная переменная инициализируется в конструкторе FooType.

Вы не можете создать экземпляр FooType из-за его абстрактности.Но если вы создадите неабстрактный подкласс FooType, будет вызван конструктор.

Если у вас нет явного вызова super(...) в конструкторе, компилятор Java добавит его автоматически.Поэтому гарантируется, что конструктор каждого класса в цепочке наследования вызывается.

3 голосов
/ 02 июля 2011

Вы можете иметь конструкторы, методы, свойства, все в абстрактных классах, что вы можете иметь и в неабстрактных классах.Вы просто не можете создать экземпляр класса.Так что в этом коде нет ничего плохого.

В производном классе вы можете вызвать конструктор и установить конечное свойство:

public class Foo extends FooType
{
  public Foo()
  {
    super(); // <-- Call constructor of FooType
  }
}

, если вы не указали вызов super (), он все равно будет вставлен компилятором.

0 голосов
/ 16 сентября 2017

Нет, вы не можете объявить конечные переменные внутри класса Abstract.Пример ниже.

public abstract class AbstractEx {
    final int x=10;
    public abstract void AbstractEx();
}

public class newClass extends AbstractEx{

    public void AbstractEx(){
        System.out.println("abc");
        }
    }  

public class declareClass{
   public static void main(String[] args) {
       AbstractEx obj = new newClass ();
       obj.AbstractEx();
      // System.out.println(x);
    }
}

Этот код работает правильно и производит вывод как

abc

Но если мы удалим символ комментария

System.out.println (x);

это приведет к ошибке.

0 голосов
/ 02 июля 2011

Хорошо.Видите, абстрактный класс может иметь конструктор.Это всегда там - неявное или явное.Фактически, когда вы создаете объект подкласса абстрактного класса, первое, что делает конструктор подкласса, - это вызывает конструктор его абстрактного суперкласса с помощью super ().Это просто понятно, поэтому вам не нужно писать super() явно, если вы не используете параметризованные конструкторы.Каждый класс, даже если он абстрактный, имеет неявный конструктор, который вы не можете видеть.Он вызывается, если вы не создадите своего собственного конструктора.До тех пор, пока вы создавали абстрактные классы, не создавая в них никакого собственного конструктора, вы не знали о существовании неявного конструктора.

0 голосов
/ 02 июля 2011

Вы можете создать конкретные подклассы FooType, и все они будут иметь конечное поле с именем myvar.

Кстати: конструктор public в абстрактном классе такой же, как конструктор protectedон может быть вызван только из подкласса.

В чем вы сомневаетесь?

...