Czy klasa abstrakcyjna może mieć konstruktor?

Czy klasa abstrakcyjna może mieć konstruktor?

Jeśli tak, to w jaki sposób można go wykorzystać i do jakich celów?

Author: Community, 2008-11-04

21 answers

Tak, klasa abstrakcyjna może mieć konstruktor. Rozważ to:

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

Klasa nadrzędna {[1] } jest abstrakcyjna i ma konstruktor. Klasa concrete TimesTwo ma konstruktor, który po prostu twardo koduje wartość 2. Klasa concrete TimesWhat ma konstruktor, który pozwala wywoływaczowi określić wartość.

Konstruktory abstrakcyjne będą często używane do wymuszania ograniczeń klas lub niezmienników, takich jak minimalne pola wymagane do skonfigurowania klasy.

Uwaga: Jak tam nie jest konstruktorem domyślnym (lub nie-arg) w rodzicu klasa abstrakcyjna, konstruktor użyty w podklasie musi jawnie wywoływać konstruktor nadrzędny.

 531
Author: Michael Rutherfurd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 01:19:42

Zdefiniowałbyś konstruktor w klasie abstrakcyjnej, jeśli znajdujesz się w jednej z takich sytuacji:

  • chcesz wykonać kilka inicjalizacja (do pól z klasa abstrakcyjna) przed instancjacja podklasy odbywa się
  • zdefiniowałeś końcowe pola w klasa abstrakcyjna, ale nie inicjalizuj je w deklaracji siebie; w tym przypadku musisz mieć konstruktora do inicjalizacji tych pola

Zauważ, że:

  • można zdefiniować więcej niż jeden konstruktor (z różnymi argumenty)
  • Możesz (powinieneś?) zdefiniuj wszystkie swoje konstruktorów chronionych (czyniąc je public i tak jest bez sensu)
  • twój konstruktor podklasy może wywołanie jednego konstruktora abstrakcji klasa; może nawet musi nazwać (jeśli nie ma konstruktora no-arg w klasie abstrakcyjnej)

W każdym razie nie zapominaj, że jeśli nie zdefiniujesz konstruktora, wtedy kompilator automatycznie wygeneruje go dla Ciebie (ten jest publicznych, nie ma argumentów i nic nie robi).

 137
Author: jfpoilpret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 07:30:30

Tak może mieć konstruktor i jest zdefiniowany i zachowuje się tak jak każdy inny konstruktor klasy. Poza tym, że klasy abstrakcyjne nie mogą być bezpośrednio instancjonowane, tylko rozszerzone, więc użycie jest zawsze z konstruktora podklasy.

 51
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 02:59:52

Tak! klasy abstrakcyjne mogą mieć konstruktory !

Tak, Kiedy definiujemy klasę jako klasę abstrakcyjną, nie może ona zostać utworzona, ale to nie znaczy, że klasa abstrakcyjna nie może mieć konstruktora. Każda klasa abstrakcyjna musi mieć konkretną podklasę, która zaimplementuje metody abstrakcyjne tej klasy.

Kiedy tworzymy obiekt dowolnej podklasy, wszystkie konstruktory w odpowiednim drzewie dziedziczenia są wywoływane w podejściu od góry do dołu. Ten sam przypadek dotyczy klas abstrakcyjnych. Chociaż nie możemy utworzyć obiektu klasy abstrakcyjnej, kiedy tworzymy obiekt klasy, który jest konkretny i podklasa klasy abstrakcyjnej, konstruktor klasy abstrakcyjnej jest automatycznie wywoływany. Stąd możemy mieć konstruktor w klasach abstrakcyjnych.

Uwaga: Klasa nieabstraktowa nie może mieć metod abstrakcyjnych, ale klasa abstrakcyjna może mieć metodę nieabstraktową. Rozum jest podobny do konstruktorów, różnica jest zamiast wywołanie automatycznie możemy wywołać super (). Ponadto nie ma to jak abstrakcyjny konstruktor, ponieważ nie ma to żadnego sensu.

 30
Author: Aniket Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 17:27:13

Nie tylko może, ale zawsze tak jest. Jeśli nie podasz żadnej z nich, to ma ona domyślnie konstruktor no arg, tak jak każda inna klasa. W rzeczywistości, wszystkie klasy, włączając w to Klasy zagnieżdżone i anonimowe, otrzymają domyślny konstruktor, jeśli taki nie jest określony (w przypadku klas anonimowych nie można go określić, więc zawsze otrzymasz domyślny konstruktor).

Dobrym przykładem klasy abstrakcyjnej posiadającej konstruktor jest klasa Calendar . Otrzymujesz obiekt kalendarza przez calling Calendar.getInstance (), ale posiada również konstruktory, które są chronione. Powodem, dla którego jego konstruktory są chronione, jest to, że tylko jego podklasy mogą je wywoływać (lub klasy w tym samym pakiecie, ale ponieważ jest to abstrakcyjne, nie ma to zastosowania). GregorianCalendar jest przykładem klasy rozszerzającej Kalendarz.

 13
Author: MattC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-13 16:06:29

Tak, konstruktory klas abstrakcyjnych są zwykle używane do super wywołań dla zdarzeń inicjalizacyjnych wspólnych dla wszystkich podklas

 5
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 04:56:45

Klasa abstrakcyjna może mieć konstruktor, ale nie można utworzyć obiektu klasy abstrakcyjnej, więc jak używać tego konstruktora?

Rzecz w tym, że kiedy dziedziczysz klasę abstrakcyjną w swojej podklasie, możesz przekazać wartości do jej konstruktora (abstrakcyjnego) za pomocą metody super(value) w swojej podklasie i Nie, Nie dziedziczysz konstruktora.

Więc używając super można przekazać wartości w konstruktorze klasy abstrakcyjnej i z tego co pamiętam musi to być pierwsze stwierdzenie w Twoim metoda lub konstruktor.

 5
Author: Alok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 16:59:16

Chociaż jest wiele dobrych odpowiedzi, chciałbym dać moje 2 centy.

Konstruktor nie buduje obiektu . Służy do inicjalizacji obiektu.

Tak, klasa abstrakcyjna zawsze ma konstruktor. Jeśli nie zdefiniujesz własnego konstruktora, kompilator da domyślny konstruktor klasie abstrakcyjnej. Powyższe dotyczy wszystkich klas-zagnieżdżonych, abstrakcyjnych, anonimowych itp.

Klasa abstrakcyjna (w przeciwieństwie do interfejsu) może mieć niekończące się niestatyczne pola wymagające inicjalizacji. Możesz napisać własny konstruktor w klasie abstrakcyjnej, aby to zrobić. Ale w takim przypadku nie będzie żadnego domyślnego konstruktora.

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

Bądź ostrożny rozszerzając klasę abstrakcyjną, musisz jawnie wywołać super z każdego konstruktora. Pierwsza linia dowolnego konstruktora wywołuje super (). jeśli nie wywołasz jawnie super(), Java zrobi to za Ciebie. Poniższy kod nie będzie kompilowany:

public class Imp extends Abs{

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

Musisz go użyć jak poniżej przykład:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    super(i,j);
    System.out.println("2 arg");
}
}
 4
Author: Harshil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 15:48:11

Rozważ to:

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

Klasa nadrzędna jest abstrakcyjna i ma konstruktor.

 3
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 03:07:26

Oczywiście, klasa abstrakcyjna może mieć konstruktor.Ogólnie konstruktor klasy jest używany do inicjalizacji fields.So, konstruktor klasy abstrakcyjnej służy do inicjalizacji pól klasy abstrakcyjnej. Możesz podać konstruktor dla klasy abstrakcyjnej, jeśli chcesz zainicjować pewne pola klasy abstrakcyjnej przed utworzeniem instancji klasy potomnej. Abstrakcyjny konstruktor klasy może być również użyty do wykonania kodu, który jest istotny dla każdej klasy potomnej. Zapobiega to kodowaniu duplikacja.

Nie możemy utworzyć instancji klasy abstrakcyjnej, ale możemy utworzyć instancje klas, które pochodzą z klasy abstrakcyjnej. Tak więc, gdy instancja klasy pochodnej jest tworzona, konstruktor abstrakcyjnej klasy nadrzędnej jest wywoływany automatycznie.

Odniesienie: Ten Artykuł

 3
Author: Raj Baral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 00:26:17

W klasie betonowej deklaracja konstruktora dla betonu typu Fnord skutecznie eksponuje dwie rzeczy:

  • Sposób, za pomocą którego kod może zażądać utworzenia instancji Fnord

  • Sposób, za pomocą którego instancja typu wywodzącego się z Fnord, która jest w budowie, może zażądać zainicjowania wszystkich funkcji klasy bazowej.

Chociaż być może powinien istnieć sposób, za pomocą którego te dwie zdolności mogą być kontrolowane oddzielnie dla każdego typu betonu jedna definicja umożliwi oba. Chociaż pierwsza zdolność nie jest znacząca dla klasy abstrakcyjnej, druga zdolność jest tak samo znacząca dla klasy abstrakcyjnej, jak dla każdej innej, a zatem jej deklaracja jest równie konieczna i użyteczna.

 2
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 00:21:00

Jak opisuje javafuns tutaj , Oto przykład:

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
Author: jaideep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 17:08:32

Tak, klasy abstrakcyjne mogą mieć konstruktory !

Oto przykład użycia konstruktora w klasie abstrakcyjnej:

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()); 
    } 
}
Więc myślę, że masz odpowiedź.
 1
Author: Ketan G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 18:27:25

Klasa abstrakcyjna może mieć konstruktor, choć nie może być utworzona. Ale konstruktor zdefiniowany w klasie abstrakcyjnej może być użyty do utworzenia konkretnej klasy tej klasy abstrakcyjnej. Sprawdź JLS :

Jest to błąd w czasie kompilacji, jeśli podejmowana jest próba utworzenia instancji klasy abstrakcyjnej przy użyciu tworzenia instancji klasy wyrażenie .

Podklasa klasy abstrakcyjnej, która sama w sobie nie jest abstrakcyjna, może być instancja, w wyniku czego wykonanie konstruktora dla klasa abstrakcyjna, a zatem wykonanie inicjalizatorów pola na przykład zmienne tej klasy.

 1
Author: i_am_zero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 03:03:26

Tak. Konstruktor klasy abstrakcyjnej jest wywoływany, gdy tworzona jest instancja odziedziczonej klasy. Na przykład poniżej znajduje się poprawny program 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();
    }

}

Jest to wynik powyższego kodu,

Konstruktor Bazowy Zwany Konstruktor Pochodny O Nazwie

Bibliografia: Tutaj wpisz opis linku

 1
Author: chamzz.dot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 06:39:07

Ponieważ klasa abstrakcyjna może mieć zmienne o wszystkich modyfikatorach dostępu, muszą one zostać zainicjowane na wartości domyślne, więc konieczny jest konstruktor. Podczas tworzenia instancji klasy potomnej wywoływany jest konstruktor klasy abstrakcyjnej i inicjowane są zmienne.

Przeciwnie, Interfejs zawiera tylko stałe zmienne, co oznacza, że są już zainicjalizowane. Więc interfejs nie potrzebuje konstruktora.

 1
Author: Arun Raaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 16:58:17

W celu uzyskania łańcucha konstruktora, klasa abstrakcyjna będzie miała konstruktor. Kompilator przechowuje instrukcję Super() wewnątrz konstruktora podklasy, który wywoła konstruktor superclass. Jeśli nie ma konstruktorów dla klas abstrakcyjnych, reguły Javy są łamane i nie możemy uzyskać łańcucha konstruktorów.

 1
Author: Anilkumar K S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 17:15:54

Tak, klasa abstrakcyjna może mieć Konstruktor. Możesz przeciążać tyle konstruktorów, ile chcesz w klasie abstrakcyjnej. Wykonawcy te mogą być użyte do zainicjalizowania stanu początkowego obiektów rozszerzających klasę abstrakcyjną. Jak wiemy, nie możemy utworzyć obiektu klasy abstrakcyjnej, ponieważ obiekty są tworzone przez "nowe" słowa kluczowe, a nie przez konstruktory...służą one jedynie do inicjalizacji stanu obiektów podklasy.

 1
Author: Shubham Soni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 05:58:24

Tak na pewno możesz dodać jedną, jak już wspomniano dla inicjalizacji abstrakcyjnych zmiennych klasy. Ale jeśli nie zadeklarujesz jawnie jednego, to i tak ma ukryty konstruktor do działania "Constructor Chaining".

 0
Author: Kedar Parikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 11:07:58

Celem konstruktora w klasie jest inicjalizacja pól , ale nie "budowanie obiektów". Gdy próbujesz utworzyć nową instancję abstrakcyjnej klasy nadrzędnej, kompilator wyświetli błąd. Możemy jednak dziedziczyć abstrakcyjny Pracownik klasy i korzystać z jego konstruktora, ustawiając jego zmienne patrz przykład poniżej

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
Author: karto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 19:03:39

Yes..It jest jak każda inna klasa. Może mieć konstruktor i jest wywoływany po wytworzeniu obiektu dla klasy bazowej.

 -5
Author: Sandeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-20 22:01:45