webentwicklung-frage-antwort-db.com.de

Zweck eines Konstruktors in Java?

Was ist der Zweck eines Konstruktors? Ich habe Java in der Schule gelernt und es scheint mir, als ob ein Konstruktor in Sachen, die wir bisher gemacht haben, weitgehend überflüssig ist. Es bleibt abzuwarten, ob ein Zweck zustande kommt, aber bisher erscheint es mir bedeutungslos. Was ist beispielsweise der Unterschied zwischen den folgenden zwei Codefragmenten?

public class Program {    
    public constructor () {
        function();
    }        
    private void function () {
        //do stuff
    }    
    public static void main(String[] args) { 
        constructor a = new constructor(); 
    }
}

Auf diese Weise wurde uns beigebracht, Dinge für Aufträge zu tun, aber würde das Folgende nicht den gleichen Deal machen?

public class Program {    
    public static void main(String[] args) {
        function();
    }        
    private void function() {
        //do stuff
    }
}

Der Zweck eines Konstrukteurs entgeht mir, aber alles andere, was wir bisher gemacht haben, war äußerst rudimentär.

19
gator

Konstruktoren werden verwendet, um die Instanzen Ihrer Klassen zu initialisieren. Sie verwenden einen Konstruktor, um häufig neue Objekte mit Parametern zu erstellen, die den Anfangsstatus oder andere wichtige Informationen zum Objekt angeben

Aus dem offiziellen Java-Tutorial :

Eine Klasse enthält Konstruktoren, die zum Erstellen von Objekten aus dem Klassen-Blueprint aufgerufen werden. Konstruktordeklarationen sehen aus wie Methodendeklarationen - außer dass sie den Namen der Klasse verwenden und keinen Rückgabetyp haben. Zum Beispiel hat Bicycle einen Konstruktor:

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}

Um ein neues Bicycle-Objekt mit dem Namen myBike zu erstellen, wird vom neuen Operator ein Konstruktor aufgerufen:

Fahrrad myBike = neues Fahrrad (30, 0, 8);

new Bicycle(30, 0, 8) schafft Platz im Speicher für das Objekt und initialisiert seine Felder.

Obwohl Bicycle nur einen Konstruktor hat, kann es auch andere Konstrukte geben, darunter einen Konstruktor ohne Argumente:

öffentliches Fahrrad () { Gang = 1; Kadenz = 10; Geschwindigkeit = 0; }

Bicycle yourBike = new Bicycle(); ruft den Konstruktor ohne Argumente auf, um ein neues Fahrradobjekt namens yourBike zu erstellen.

45
LotusUNSW

Ein Konstruktor ist im Grunde eine Methode, mit der Sie sicherstellen können, dass Objekte Ihrer Klasse gültig sind . Dies ist die Hauptmotivation für einen Konstruktor.

Angenommen, Sie möchten, dass Ihre Klasse ein einzelnes ganzzahliges Feld hat, das immer größer als Null sein sollte. Wie machen Sie das auf eine zuverlässige Art und Weise?

public class C {
     private int number;

     public C(int number) {
        setNumber(number);
     }

     public void setNumber(int number) {
        if (number < 1) {
            throws IllegalArgumentException("C cannot store anything smaller than 1");
        }
        this.number = number;
     }
}

Im obigen Code kann es so aussehen, als würden Sie etwas überflüssiges tun, aber tatsächlich stellen Sie sicher, dass die Nummer immer gültig ist, egal was passiert.

"Die Instanzen einer Klasse initialisieren" ist was ein Konstruktor, aber nicht der Grund warum wir haben Konstruktoren. Die Frage betrifft den Zweck eines Konstruktors. Sie können Instanzen einer Klasse auch extern initialisieren, indem Sie im obigen Beispiel c.setNumber(10) verwenden. Ein Konstruktor ist also nicht die einzige Möglichkeit, Instanzen zu initialisieren.

Der Konstruktor tut das aber auf eine Weise, die safe ist. Mit anderen Worten, eine Klasse allein löst das gesamte Problem, dass sichergestellt ist, dass sich ihre Objekte immer in gültigen Zuständen befinden. Wenn Sie keinen Konstruktor verwenden, wird diese Überprüfung der Außenwelt überlassen, was ein schlechtes Design darstellt.

Hier ist ein anderes Beispiel:

public class Interval {
    private long start;
    private long end;

    public Interval(long start, long end) {
        changeInterval(start, end);
    }

    public void changeInterval(long start, long end) {
        if (start >= end) {
            throw new IllegalArgumentException("Invalid interval.");
        }
        this.start = start;
        this.end = end;
    }
    public long duration() {
        return end - start;
    }
}

Die Interval-Klasse repräsentiert ein Zeitintervall. Zeit wird mit lang gespeichert. Es macht keinen Sinn, ein Intervall zu haben, das endet, bevor es beginnt. Wenn Sie einen Konstruktor wie den obigen verwenden, ist es unmöglich, zu irgendeinem Zeitpunkt im System eine Instanz von Interval zu haben, in der ein Intervall gespeichert wird, das keinen Sinn ergibt.

29
Akira

Wie in LotusUNSW erwähnt, werden answer Konstruktoren verwendet, um die Instanzen einer Klasse zu initialisieren.  

Beispiel:

Angenommen, Sie haben eine Animal-Klasse, die ungefähr so ​​aussieht

class Animal{
   private String name;
   private String type;
}

Mal sehen, was passiert, wenn Sie versuchen, eine Instanz der Animal-Klasse zu erstellen, beispielsweise eine Dog mit dem Namen Puppy. Nun müssen Sie name = Puppy und type = Dog initialisieren. Wie kannst du das tun? Eine Möglichkeit, dies zu tun, besteht darin, einen Konstruktor wie

    Animal(String nameProvided, String typeProvided){
         this.name = nameProvided;
         this.type = typeProvided;
     }

Wenn Sie nun ein Objekt der Klasse Animal erstellen, wird etwas wie Animal dog = new Animal("Puppy", "Dog"); aufgerufen, und Ihr Konstruktor wird aufgerufen, und Name und Typ werden mit den von Ihnen angegebenen Werten, d. H. Puppy und Dog, initialisiert.

Nun könnten Sie fragen, was wäre, wenn ich meinem Konstruktor so etwas nicht geben würde 

Animal xyz = new Animal();

Dies ist ein default Constructor, der das Objekt mit Standardwerten initialisiert, d. H. In unserer Animal-Klasse name- und type-Werte, die dem xyz-Objekt entsprechen, wäre name = null und type = null.

9
Prateek

Ein Konstruktor initialisiert ein Objekt, wenn es erstellt wird. Sie hat den gleichen Namen wie ihre Klasse und ist einer Methode syntaktisch ähnlich, aber der Konstruktor hat keinen Expicit-Rückgabetyp .Normalerweise verwenden wir den Konstruktor, um den von der Klasse definierten Instanzvariablen einen Anfangswert zu geben oder einen anderen Start auszuführen erforderliche Prozeduren, um ein vollständig geformtes Objekt herzustellen.

Hier ist ein Beispiel eines Konstruktors:

class queen(){
   int beauty;

   queen(){ 
     beauty = 98;
   }
 }


class constructor demo{
    public static void main(String[] args){
       queen arth = new queen();
       queen y = new queen();

       System.out.println(arth.beauty+" "+y.beauty);

    }
} 

ausgabe ist:

98 98

Hier ist der Konstrukteur:

queen(){
beauty =98;
}

Jetzt ist der parametrisierte Konstruktor an der Reihe.

  class queen(){
   int beauty;

   queen(int x){ 
     beauty = x;
   }
 }


class constructor demo{
    public static void main(String[] args){
       queen arth = new queen(100);
       queen y = new queen(98);

       System.out.println(arth.beauty+" "+y.beauty);

    }
} 

ausgabe ist:

100 98
4
Ashish Thapa
  • Über einen Konstruktor (mit Parametern) können Sie den Benutzer dieser Klasse nach den erforderlichen Abhängigkeiten fragen.
  • Es wird verwendet, um Instanzvariablen zu initialisieren
  • und Argumente an den Konstruktor einer Superklasse (super(...)) übergeben, die im Grunde dasselbe tut
  • Es kann Instanzvariablen mit Code initialisieren, der Exceptions auslösen kann, im Gegensatz zu den Bereichen Instanzinitialisierer
  • Man sollte not Methoden blind aus dem Konstruktor heraus aufrufen, da die Initialisierung in der lokalen oder einer abgeleiteten Klasse möglicherweise nicht ausreichend ist.
3
Sam

Ein Java-Konstruktor hat denselben Namen wie der Name der Klasse, zu der er gehört.

Die Syntax des Konstruktors enthält keinen Rückgabetyp, da Konstruktoren niemals einen Wert zurückgeben. 

Der Konstruktor wird immer aufgerufen, wenn ein Objekt erstellt wird. Beispiel: - Standardkonstruktor

class Student3{  
    int id;  
    String name;  
    void display(){System.out.println(id+" "+name);}  
    public static void main(String args[]){  
        Student3 s1=new Student3();  
        Student3 s2=new Student3();  
        s1.display();  
        s2.display();  
    }  
} 

Ausgabe:

0 null
0 null

Erläuterung: In der obigen Klasse erstellen Sie keinen Konstruktor. Der Compiler stellt Ihnen einen Standardkonstruktor zur Verfügung. Der Standardkonstruktor enthält 0 und NULL-Werte.

Beispiel eines parametrisierten Konstruktors

In diesem Beispiel haben wir den Konstruktor der Student-Klasse mit zwei Parametern erstellt. Im Konstruktor können beliebig viele Parameter vorhanden sein.

class Student4{  
    int id;  
    String name;  
    Student4(int i,String n){  
        id = i;  
        name = n;  
    }  
    void display(){System.out.println(id+" "+name);}  
    public static void main(String args[]){  
        Student4 s1 = new Student4(111,"Karan");  
        Student4 s2 = new Student4(222,"Aryan");  
        s1.display();  
        s2.display();  
    }  
}  

Ausgabe:

111 Karan
222 Aryan
1
Naresh Kumar

Der Konstruktor ist hilfreich, um zu verhindern, dass Instanzen unwirkliche Werte erhalten. Für ein Beispiel setzen Sie eine Personenklasse mit Höhe, Gewicht. Es kann keine Person mit 0m und 0kg geben

1
rinjan

Es wird verwendet, um den Inhalt und den Status Ihrer Klasse festzulegen. Obwohl es wahr ist, können Sie das einfachere Beispiel mit der Hauptmethode erstellen. Sie haben jedoch nur eine Hauptmethode pro App, so dass es keine sinnvolle Vorgehensweise bleibt.

Betrachten Sie die Hauptmethode, um Ihr Programm einfach zu starten, und Sie sollten nicht mehr wissen, als dies zu tun ist. Beachten Sie auch, dass main () statisch ist. Sie können daher keine Funktionen aufrufen, die eine Klasseninstanz und den zugehörigen Status erfordern. Die main-Methode sollte new Program (). Function () aufrufen, und der Program-Konstruktor sollte function () nicht aufrufen, es sei denn, dies ist für das Einrichten der Klasse erforderlich.

1
ajwillia.ms

Konstruktor wird grundsätzlich zum Initialisieren der Variablen zum Zeitpunkt der Objekterstellung verwendet

1

Die Klassendefinition definiert die API für Ihre Klasse. Mit anderen Worten, es ist eine Blaupause, die den zwischen der Klasse und ihren Kunden bestehenden Vertrag definiert - den übrigen Code, der diese Klasse verwendet. Der Vertrag gibt an, welche Methoden verfügbar sind, wie sie aufgerufen werden sollen und was als Gegenleistung zu erwarten ist.

Aber die Klassendefinition ist eine Spezifikation. Bis Sie einen tatsächlichen Gegenstand dieser Klasse haben, ist der Vertrag nur "ein Stück Papier". Hier kommt der Konstruktor ins Spiel.

Mit einem Konstruktor können Sie eine Instanz Ihrer Klasse erstellen, indem Sie ein Objekt im Speicher erstellen und eine Referenz darauf zurückgeben. Etwas, das sollte im Konstruktor passieren sollte, ist, dass sich das Objekt in einem ordnungsgemäßen Anfangszustand befindet, damit die nachfolgenden Operationen für das Objekt sinnvoll sind. 

Dieses vom Konstruktor zurückgegebene Objekt erfüllt jetzt den in der Klassendefinition angegebenen Vertrag, und Sie können dieses Objekt für die eigentliche Arbeit verwenden.

Denk darüber so. Wenn Sie sich die Porsche-Website einmal ansehen, werden Sie sehen, was sie kann - die Leistung, das Drehmoment usw. Aber es macht keinen Spaß, bis Sie einen echten Porsche haben.

Hoffentlich hilft das.

1
Vidya

Ich dachte, ein Konstruktor könnte wie eine Datenbank funktionieren, in der nur Variablen und Methoden zur Steuerung definiert werden

Dann sah ich Objekte, die Variablen und Methoden verwenden, die nicht im Konstruktor definiert sind. Daher ist die Diskussion, die für mich am sinnvollsten ist, die, in der Variablenwerte auf Gültigkeit geprüft werden. Die Klasse kann jedoch Variablen und Methoden erstellen, die nicht im Konstruktor definiert sind - weniger wie eine Datenbank und eher wie ein Überdruckventil auf einem Dampf Lokomotive. Es kontrolliert nicht die Räder usw.

Weit weniger eine Definition als ich dachte.

1
user6646964

Nehmen wir an, wir speichern die Studentendaten von 3 Studenten. Diese 3 Schüler haben unterschiedliche Werte für Sno, Sname und Sage, aber alle 3 Schüler gehören derselben Abteilung CSE an. Daher ist es besser, die Variable "dept" innerhalb eines Konstruktors zu initialisieren, damit dieser Wert von allen 3 Schülerobjekten übernommen werden kann.

Um dies klar zu verstehen, sehen Sie das folgende einfache Beispiel:

class Student
{
    int sno,sage;
    String sname,dept;
    Student()
    {
        dept="CSE";
    }
    public static void main(String a[])
    {
        Student s1=new Student();
        s1.sno=101;
        s1.sage=33;
        s1.sname="John";

        Student s2=new Student();
        s2.sno=102;
        s2.sage=99;
        s2.sname="Peter";


        Student s3=new Student();
        s3.sno=102;
        s3.sage=99;
        s3.sname="Peter";
        System.out.println("The details of student1 are");
        System.out.println("The student no is:"+s1.sno);
        System.out.println("The student age is:"+s1.sage);
        System.out.println("The student name is:"+s1.sname);
        System.out.println("The student dept is:"+s1.dept);


        System.out.println("The details of student2 are");`enter code here`
        System.out.println("The student no is:"+s2.sno);
        System.out.println("The student age is:"+s2.sage);
        System.out.println("The student name is:"+s2.sname);
        System.out.println("The student dept is:"+s2.dept);

        System.out.println("The details of student2 are");
        System.out.println("The student no is:"+s3.sno);
        System.out.println("The student age is:"+s3.sage);
        System.out.println("The student name is:"+s3.sname);
        System.out.println("The student dept is:"+s3.dept);
    }
}

Ausgabe:

Die Details von student1 sind
Die Studentennummer lautet: 101
Das Studentenalter ist: 33
Der Student heißt: John
Die Studentenabteilung ist: CSE
Die Details von student2 sind
Die Studentennummer lautet: 102
Das Studentenalter ist: 99
Der Studentenname lautet: Peter
Die Studentenabteilung ist: CSE
Die Details von student2 sind
Die Studentennummer lautet: 102
Das Studentenalter ist: 99
Der Studentenname lautet: Peter
Die Studentenabteilung ist: CSE 

0
user9151823

Nun, zuerst werde ich die Fehler in zwei Code-Snippets erklären.

Erstes Code-Snippet

public class Program
{
    public constructor() // Error - Return type for the method is missing
    {
        function();
    }        
    private void function()
    {
        //do stuff
    }   

    public static void main(String[] args)
    {
        constructor a = new constructor(); // Error - constructor cannot be resolved to a type
    }
}

Wie Sie den obigen Code sehen können, stimmt der Name des Konstruktors nicht mit dem Klassennamen überein. In der main()-Methode erstellen Sie ein Objekt aus einer Methode ohne Rückgabetyp.

Zweites Code-Snippet

public class Program
{
    public static void main(String[] args)
    {
        function(); // Error - Cannot make a static reference to the non-static method function() from the type Program
    }

    private void function()
    {
        //do stuff
    } 
}

In diesem Codeausschnitt versuchen Sie nun, eine statische Referenz auf die nicht statische Methode function () vom Typ Program zu erstellen, was nicht möglich ist.

Die mögliche Lösung ist also

Erstes Code-Snippet

public class Program
{
    public Program()
    {
        function();
    }        
    private void function()
    {
        //do stuff
    }   

    public static void main(String[] args)
    {
        Program a = new Program();
        a.function();
    }
}

Zweites Code-Snippet

public class Program
{
    public static void main(String[] args)
    {
        Program a = new Program();
        a.function();
    }

    private void function()
    {
        //do stuff
    } 
}

Schließlich besteht der Unterschied zwischen den Codeausschnitten darin, dass der Klassenname im ersten Codeausschnitt nicht mit dem Klassennamen identisch ist

Im zweiten Codeausschnitt ist kein Konstruktor definiert.

Um den Zweck des Konstruktors zu verstehen, verweisen Sie auf die folgenden Ressourcen:

https://docs.Oracle.com/javase/7/docs/api/Java/lang/reflect/Constructor.html

http://www.flowerbrackets.com/learn-constructor-in-Java/

http://www.flowerbrackets.com/Java-constructor-example/

0
Shiva