Может ли абстрактный class иметь конструктор?

Может ли абстрактный class иметь конструктор?

Если да, то как это можно использовать и для каких целей?

Да, абстрактный class может иметь конструктор. Учти это:

abstract class Product { int multiplyBy; public Product( int multiplyBy ) { this.multiplyBy = multiplyBy; } public int mutiply(int val) { return multiplyBy * val; } } class TimesTwo extends Product { public TimesTwo() { super(2); } } class TimesWhat extends Product { public TimesWhat(int what) { super(what); } } 

Product суперclassа является абстрактным и имеет конструктор. Конкретный class TimesTwo имеет конструктор, который просто кодирует значение 2. Конкретный class TimesWhat имеет конструктор, который позволяет вызывающему указать значение.

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

ПРИМЕЧАНИЕ. Поскольку в родительском абстрактном classе нет конструктора по умолчанию (или no-arg), конструктор, используемый в подclassе, должен явно вызвать родительский конструктор.

Вы определяете конструктор в абстрактном classе, если вы находитесь в одной из следующих ситуаций:

  • вы хотите выполнить некоторую инициализацию (для полей абстрактного classа) до того, как на самом деле произойдет создание подclassа
  • вы определили конечные поля в абстрактном classе, но вы не инициализировали их в самом объявлении; в этом случае вы должны иметь конструктор для инициализации этих полей

Обратите внимание, что:

  • вы можете определить более одного конструктора (с разными аргументами)
  • вы можете (должны?) определить все защищенные ваши конструкторы (сделать их общедоступными в любом случае бессмысленными)
  • ваш конструктор (ы) подclassа может вызвать один конструктор абстрактного classа; он может даже потребовать его вызова (если в абстрактном classе нет конструктора no-arg)

В любом случае, не забывайте, что если вы не определяете конструктор, то компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргументов и ничего не делает).

Да, он может иметь конструктор, и он определяется и ведет себя так же, как любой конструктор другого classа. За исключением того, что абстрактные classы не могут быть непосредственно инстанцированы, только расширены, поэтому использование всегда происходит из конструктора подclassа.

Да ! Абстрактные classы могут иметь конструкторы !

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

Когда мы создаем объект любого подclassа, все конструкторы в соответствующем дереве наследования вызываются в подходе сверху вниз. Тот же случай применяется к абстрактным classам. Хотя мы не можем создать объект абстрактного classа, когда мы создаем объект classа, который является конкретным и подclassом абстрактного classа, конструктор абстрактного classа автоматически вызывается. Следовательно, мы можем иметь конструктор в абстрактных classах.

Примечание. Не абстрактный class не может иметь абстрактных методов, но абстрактный class может иметь не абстрактный метод. Причина аналогична конструкции конструкторов, разница заключается в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего похожего на абстрактный конструктор, поскольку это не имеет никакого смысла.

Он не только может это делать, но всегда. Если вы не укажете один, то у него есть конструктор arg по умолчанию, как и любой другой class. Фактически, ВСЕ classы, включая вложенные и анонимные classы, получат конструктор по умолчанию, если он не указан (в случае анонимных classов его невозможно указать, поэтому вы всегда получите конструктор по умолчанию).

Хорошим примером абстрактного classа, имеющего конструктор, является class Calendar . Вы получаете объект Calendar, вызывая Calendar.getInstance (), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что только их подclassы могут вызывать их (или classы в одном пакете, но поскольку они абстрактны, это не применяется). GregorianCalendar – это пример classа, расширяющего календарь.

Да, это возможно, конструкторы абстрактных classов обычно используются для супервызов для событий инициализации, общих для всех подclassов

Абстрактный class может иметь конструктор, но вы не можете создать объект абстрактного classа, так как вы используете этот конструктор?

Вещь – это когда вы наследуете этот абстрактный class в своем подclassе, вы можете передать значения его конструктору (абстрактам) с помощью метода super (value) в вашем подclassе и не наследовать конструктор.

поэтому, используя super, вы можете передавать значения в конструкторе абстрактного classа, и, насколько я помню, это должен быть первый оператор в вашем методе или конструкторе.

Хотя есть много хороших ответов, я хотел бы дать свои 2 цента.

Конструктор НЕ СОЗДАЕТ ОБЪЕКТ . Он используется для инициализации объекта.

Да, у абстрактного classа всегда есть конструктор. Если вы не определяете свой собственный конструктор, компилятор предоставит конструктор по умолчанию для classа Abstract. Выше выполняется для всех classов – вложенных, абстрактных, анонимных и т. Д.

Абстрактный class (в отличие от интерфейса) может иметь не конечные нестатические поля, которые нуждаются в инициализации. Вы можете написать свой собственный конструктор в абстрактном classе для этого. Но в этом случае конструктор по умолчанию не будет.

 public abstract class Abs{ int i; int j; public Abs(int i,int j){ this.i = i; this.j = j; System.out.println(i+" "+j); } } 

Будьте осторожны при расширении выше абстрактного classа, вам нужно явно вызвать super из каждого конструктора. Первая строка любого конструктора вызывает super (). если вы явно не вызываете super (), Java сделает это за вас. Ниже код не будет компилироваться:

 public class Imp extends Abs{ public Imp(int i, int j,int k, int l){ System.out.println("2 arg"); } } 

Вы должны использовать его, как показано ниже:

 public class Imp extends Abs{ public Imp(int i, int j,int k, int l){ super(i,j); System.out.println("2 arg"); } } 

Учти это:

 abstract class Product { int value; public Product( int val ) { value= val; } abstract public int multiply(); } class TimesTwo extends Product { public int mutiply() { return value * 2; } } 

Суперclass является абстрактным и имеет конструктор.

Разумеется, абстрактный class может иметь конструктор. Обычно для инициализации полей используется конструктор classа. Поэтому для инициализации полей абстрактного classа используется абстрактный конструктор classов. Вы бы предоставили конструктор абстрактного classа, если вы хотите инициализировать определенные поля абстрактного classа до того, как будет создан экземпляр дочернего classа. Конструктор абстрактного classа также может использоваться для выполнения кода, который имеет отношение к каждому дочернему classу. Это предотвращает дублирование кода.

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

Ссылка: Эта статья

В конкретном classе объявление конструктора для конкретного типа Fnord эффективно раскрывает две вещи:

  • Средство, с помощью которого код может запрашивать создание экземпляра Fnord

  • Средство, с помощью которого экземпляр типа, производного от Fnord, который находится в стадии разработки, может запросить инициализацию всех функций базового classа.

Хотя, возможно, должны быть средства, с помощью которых эти две способности можно было бы контролировать отдельно, для каждого конкретного типа одно определение позволит обоим. Хотя первая способность не имеет смысла для абстрактного classа, вторая способность столь же значима для абстрактного classа, как и для любого другого, и, следовательно, его объявление столь же необходимо и полезно.

Как описано javafuns здесь , это пример:

 public abstract class TestEngine { private String engineId; private String engineName; public TestEngine(String engineId , String engineName) { this.engineId = engineId; this.engineName = engineName; } //public gettors and settors public abstract void scheduleTest(); } public class JavaTestEngine extends TestEngine { private String typeName; public JavaTestEngine(String engineId , String engineName , String typeName) { super(engineId , engineName); this.typeName = typeName; } public void scheduleTest() { //do Stuff } } 

Да, абстрактные classы могут иметь конструкторы!

Вот пример использования конструктора в абстрактном classе:

 abstract class Figure { double dim1; double dim2; Figure(double a, double b) { dim1 = a; dim2 = b; } // area is now an abstract method abstract double area(); } class Rectangle extends Figure { Rectangle(double a, double b) { super(a, b); } // override area for rectangle double area() { System.out.println("Inside Area for Rectangle."); return dim1 * dim2; } } class Triangle extends Figure { Triangle(double a, double b) { super(a, b); } // override area for right triangle double area() { System.out.println("Inside Area for Triangle."); return dim1 * dim2 / 2; } } class AbstractAreas { public static void main(String args[]) { // Figure f = new Figure(10, 10); // illegal now Rectangle r = new Rectangle(9, 5); Triangle t = new Triangle(10, 8); Figure figref; // this is OK, no object is created figref = r; System.out.println("Area is " + figref.area()); figref = t; System.out.println("Area is " + figref.area()); } } 

Поэтому я думаю, что вы получили ответ.

Абстрактный class может иметь конструктор, хотя он не может быть создан. Но конструктор, определенный в абстрактном classе, может быть использован для создания конкретного classа этого абстрактного classа. Проверьте JLS :

Это ошибка времени компиляции, если делается попытка создать экземпляр абстрактного classа с использованием выражения создания экземпляра classа .

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

да. И конструктор абстрактного classа вызывается, когда создается экземпляр унаследованного classа. Например, следующая действительная Java-программа.

 // An abstract class with constructor abstract class Base { Base() { System.out.println("Base Constructor Called"); } abstract void fun(); } class Derived extends Base { Derived() { System.out.println("Derived Constructor Called"); } void fun() { System.out.println("Derived fun() called"); } } class Main { public static void main(String args[]) { Derived d = new Derived(); } } 

Это результат приведенного выше кода,

Вызывается вызываемый конструктор

ссылки: введите ссылку здесь

Поскольку абстрактный class может иметь переменные всех модификаторов доступа, они должны быть инициализированы значениями по умолчанию, поэтому необходим конструктор. Когда вы создаете экземпляр дочернего classа, вызывается конструктор абстрактного classа и инициализируются переменные.

Напротив, интерфейс содержит только постоянные переменные, поскольку они уже инициализированы. Так что интерфейсу не нужен конструктор.

Для достижения цепочки конструкторов абстрактный class будет иметь конструктор. Компилятор сохраняет оператор Super () внутри конструктора подclassа, который вызывается конструктором суперclassа. Если бы не было конструкторов для абстрактных classов, тогда нарушаются правила Java, и мы не можем добиться цепочки конструкторов.

Да, абстрактный class может иметь конструктор. Вы можете перегрузить столько конструкторов, сколько хотите в абстрактном classе. Эти Подрядчики могут использоваться для инициализации исходного состояния объектов, расширяющих абстрактный class. Как мы знаем, мы не можем создать объект абстрактного classа, потому что объекты создаются «новыми» ключевыми словами, а не конструкторами … они присутствуют только для инициализации состояния подclassа «Объекты».

Да, конечно, вы можете добавить один, как уже упоминалось, для инициализации абстрактных переменных classа. НО, если вы явно не объявляете одно, у него всегда есть неявный конструктор для «Constructor Chaining».

Назначение конструктора в classе используется для инициализации полей, но не для «создания объектов». Когда вы пытаетесь создать новый экземпляр абстрактного SuperClass, компилятор даст вам ошибку. Однако мы можем наследовать абстрактного classа Employee и использовать его конструктор, задав его переменные. См. Пример ниже

 public abstract class Employee { private String EmpName; abstract double calcSalary(); Employee(String name) { this.EmpName = name;// constructor of abstract class super class } } class Manager extends Employee{ Manager(String name) { super(name);// setting the name in the constructor of sub class } double calcSalary() { return 0; } } 

Да .. Это похоже на любой другой class. Он может иметь конструктор и вызывается после создания объекта для базового classа.

  • В каком порядке выполняются статические блоки и блоки инициализации при использовании наследования?
  • Когда правильно для конструктора выбрасывать исключение?
  • Порядок вызова конструкторов / деструкторов в наследовании
  • Конструктор UserControl с параметрами в C #
  • Построение конструктора копирования в Java
  • Наследование конструкторов
  • тривиальный или стандартный макет против POD
  • Кто удаляет память, выделенную во время «новой» операции, которая имеет исключение в конструкторе?
  • Как инициализировать поле const в конструкторе?
  • Защищенный конструктор и доступность
  • Вызов виртуальных функций внутри конструкторов
  • Давайте будем гением компьютера.