Может ли абстрактный класс иметь конструктор? - PullRequest
557 голосов
/ 04 ноября 2008

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

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

Ответы [ 21 ]

2 голосов
/ 06 декабря 2013

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

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

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

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

2 голосов
/ 04 ноября 2008

Учтите это:

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;
    }
}

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

1 голос
/ 30 августа 2017

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

1 голос
/ 18 июля 2013

Как описано 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
   }
}
1 голос
/ 14 июля 2015

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

1 голос
/ 21 апреля 2015

Да, у абстрактных классов могут быть конструкторы!

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

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

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

1 голос
/ 24 июня 2015

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

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

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

1 голос
/ 24 апреля 2018

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

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

0 голосов
/ 24 января 2018

Назначение конструктора в классе используется для инициализации полей , но не для "создания объектов". Когда вы пытаетесь создать новый экземпляр абстрактного суперкласса, компилятор выдаст вам ошибку. Однако мы можем наследовать абстрактный класс 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;
 }
}
0 голосов
/ 17 февраля 2015

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

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