2017-05-28 4 views
-2

Hallo Leute, ich brauche Hilfe mit diesem Code, um bessere Konstruktoren und Methoden zu verstehen. Warum Java zuerst den ersten Konstruktor aufrufen, keine Standard ?:Warum Java in diesem Fall zuerst NICHT Standardkonstruktor aufrufen?

public class Human { 
    private String name; 
    private int age; 

    public Human() { 
     this("Alex", 25); 
     System.out.println("Default constructor called"); 
    } 

    public Human(String name, int age) { 
     this.name = name; 
     this.age = age; 
     System.out.println("First constructor called"); 
    } 

    public Human(String name) { 
     this.name = name; 
     System.out.println("Second constructor called"); 
    } 

    public String info(){ 
     return name+" "+age; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } } 

und

package com.company; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println("Create object 1"); 
     Human person = new Human(); 
     System.out.println(person.info()); 
     System.out.println("Create object 2"); 
     Human person2 = new Human("Mike",55); 
     System.out.println(person2.info()); 
    } 
} 

So Ausgabe lautet:

Create object 1 
First constructor called 
Default constructor called  
Alex 25 
Create object 2 
First constructor called 
Mike 55 
+3

Es ** nicht ** rufen Sie den „default“ Konstruktor - wie sonst Sie 'Standardkonstruktors called' erklären Ihre Ausgabe? –

+0

@OliverCharlesworth OP ist zu fragen, warum der Standard-Konstruktor zweiten – niceman

+0

Ok genannt, ich verstehe, dass ich habe „dies“ aber warum die Ausgabezeichenfolge „System.out.println (“ Default-Konstruktor aufgerufen „);“ ist das zweite? – Ess

Antwort

3

diese Aussage:

Human person = new Human(); 

rufen der Standardkonstruktor, der def ined wie hier:

public Human() { 
    this("Alex", 25); 
    System.out.println("Default constructor called"); 
} 

Nun ist die erste Anweisung this("Alex",25) wird hier definiert ein anderer Konstruktor aufrufen:

public Human(String name, int age) { 
    this.name = name; 
    this.age = age; 
    System.out.println("First constructor called"); 
} 

Dieser andere Konstruktor setzt einige Instanzfelder und dann druckt „Erste Konstruktor aufgerufen“, wenn wir es beendet Zurück zu unserem Standardkonstruktor unter this("Alex",25) und weiter zur nächsten Anweisung, die "Default constructor called" ausgibt.

Kurz gesagt: Ihr Druck gelang es, den anderen Konstruktor aufrufen, die gemacht Sie denken, der andere Konstruktor zuerst genannt wurde.

+1

Sie antworteten war so nett, und dann haben Sie es auf den letzten Satz durcheinander gebracht. Sie können die Druckanweisung nicht vor 'this (" Alex ", 25) setzen;'. Nicht erlaubt!! – Andreas

+0

@Andreas Danke, dass du darauf hinweist – niceman

+0

Die Klasse 'Human' hat hier keinen Standardkonstruktor. –

3

Dies verhält sich genau so, wie es soll, lässt aufrollbare die Funktion aufruft:

System.out.println("Create object 1"); 
Human person = new Human(); 
--this("Alex", 25); 
----this.name = name; 
----this.age = age; 
----System.out.println("First constructor called"); 
--System.out.println("Default constructor called"); 
System.out.println(person.info()); 
System.out.println("Create object 2"); 
Human person2 = new Human("Mike",55); 
--this.name = name; 
--this.age = age; 
--System.out.println("First constructor called"); 
System.out.println(person2.info()); 
Verwandte Themen