Подтвердить что ты не робот

Java: конечные переменные в абстрактных классах

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

public abstract class FooType {
    private final int myvar;

    public FooType() {
        myvar = 1;
    }
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Ok. См., Абстрактный класс может иметь конструктор. Он всегда там - неявный или явный. Фактически, когда вы создаете объект подкласса абстрактного класса, первое, что делает конструктор подкласса, вызывает конструктор его абстрактного суперкласса, используя super(). Просто понятно, почему вам не нужно писать super() явно, если вы не используете параметризованные конструкторы. Каждый класс, даже если он абстрактный, имеет неявный конструктор, который вы не видите. Он вызывается, если вы не создаете собственный собственный конструктор. так долго вы создали абстрактные классы, не создавая в нем какой-либо пользовательский конструктор, поэтому вы не знали о существовании неявного конструктора.

Ответ 5

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

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(х);

он выдает ошибку.