2016-03-29 12 views
2

haben Sie einen Blick auf die folgende Klasse:Die Beziehung zwischen einem nicht-arg Konstruktor und einen Konstruktor mit Argumenten

public class Loan { 

    private double annualInterestRate; 
    private int numberOfYears; 
    private double loanAmount; 
    private java.util.Date loanDate; 

    // Default constructor 
    public Loan() { 
     this(2.5, 1, 1000); 
    } 

} 

Für die Kodierzeilen this(2.5, 1, 1000); ich die folgende Fehlermeldung in Eclipse: „Der Konstruktor Loan (double, int, int) ist undefiniert ". Dieser Fehler verschwindet, wenn eine neue Konstruktor mit Argumenten hinzu:

// Construct a loan with specified annual interest rate, number of years and loan amount 
    public Loan(double annualInterestRate, int numberOfYears, int loanAmount) { 
     this.annualInterestRate = annualInterestRate; 
     this.numberOfYears = numberOfYears; 
     this.loanAmount = loanAmount; 
     loanDate = new java.util.Date(); 
    } 

Warum die Schaffung des Konstruktor mit Argumenten der „undefiniert“ Fehler aus dem Standardkonstruktors entfernen? Wie sind diese zwei verschiedenen Konstruktoren miteinander verwandt? Wie kann ich wissen, dass die Werte in this(2.5, 1, 1000) den richtigen Datenfeldern zugewiesen sind? Ich nehme an, 2,5 sollte annualInterestRate, 1 bis numberOfYears und 1000 bis loanAmount zugewiesen werden.

+0

Der Fehler verschwindet, weil Sie nun * den Konstruktor * definiert haben. Wenn Sie versuchen, eine Methode aufzurufen, die nicht existiert, erhalten Sie eine Fehlermeldung. Wenn die Methode existiert, erhalten Sie keinen Fehler. – David

+0

müssen Sie wissen, was die Bedeutung von 'this' in Java ist –

Antwort

3

In Ihrem No-arg Konstruktor, die Linie

 this(2.5, 1, 1000); 

bedeutet ausdrücklich „für die gleiche Klasse wie der aktuelle Konstruktor einen anderen Konstruktor aufrufen, die aber nimmt diese Argumente“.

Das ist der Grund, warum das Hinzufügen des anderen Konstruktors das Problem behebt. Die Reihenfolge, in der Sie die Argumente übergeben, muss der Reihenfolge entsprechen, in der die Parameter in diesem Konstruktor angezeigt werden. Die Parameterliste des Konstruktors definiert die Reihenfolge, in der Sie die Argumente beim Aufrufen eingeben müssen.

Die Beziehung zwischen diesen beiden Konstruktoren besteht darin, dass sie verkettet sind. Der eine mit den 3 Argumenten ist der primäre Konstruktor, der andere ruft den primären Konstruktor mit Standardwerten auf. Das Konstruieren von Konstruktoren auf diese Weise hilft Ihnen, Ihre Objekte konsistent zu initialisieren, da immer nur ein primärer Konstruktor aufgerufen wird. (Zum Beispiel wird die loanDate-Instanz festgelegt, unabhängig davon, welche Konstruktor rufen Sie an.)

2

Sie den Fehler bekam

"Der Konstruktor Loan (double, int, int) ist nicht definiert"

Denn wenn man einen Blick auf nehmen:

this(2.5, 1, 1000); 

Sie können sehen, dass die Argumente sind als 2.5 folgen, die eine double, 1 das ist ein int und 1000 das ist auch ein int, so ruft es einen Konstruktor mit diesen Argumenten auf, und es gab keinen solchen Konstruktor, der definiert wird.

Und mit dieses Schlüsselwort wir ein Konstruktor der aktuellen Klasse, rufen so dass wir einen Konstruktor mit diesen Argumenten erwarten, das ist, warum Sie diesen Konstruktor implementieren neeed:

// Construct a loan with specified annual interest rate, number of years and loan amount 
public Loan(double annualInterestRate, int numberOfYears, int loanAmount) { 
    this.annualInterestRate = annualInterestRate; 
    this.numberOfYears = numberOfYears; 
    this.loanAmount = loanAmount; 
    loanDate = new java.util.Date(); 
} 

Und als angegeben durch David in den Kommentaren verschwand der Fehler, weil Sie den angegebenen Konstruktor definierten.

1

Um Ihre Frage zu beantworten, ist das erste, dass Java eine stark typisierte Sprache ist. Refere Wiki

kommt jetzt auf Ihre Anfrage, wenn Sie mit der rechten this(2.5, 1, 100), es den Konstruktor von this() mit den Argumenten Typen Doppel, int bezeichnet, um herauszufinden, dann versucht, int (dies wird in Java mit impliziten Typkonvertierungen acheived) in der Reihenfolge. Da die Reihenfolge der Argumente zusammen mit der Typübereinstimmung wichtig ist, ist sichergestellt, dass der richtige Wert dem richtigen Argument zugewiesen wird. Ich hoffe, es beantwortet Ihre Fragen.