Konstruktoren verstehen

Zu sagen, dass ein Konstruktor eine Methode ist, ist wie zu sagen, dass das australische Schnabeltier nur ein weiteres Säugetier ist. Um das Schnabeltier zu verstehen, ist es wichtig zu wissen, wie es sich von anderen Säugetieren unterscheidet. Um den Konstruktor zu verstehen, ist es ähnlich wichtig zu verstehen, wie er sich von einer Methode unterscheidet. Jeder Java-Student, insbesondere einer, der zur Zertifizierung studiert, muss diese Unterschiede kennen. In diesem Artikel werde ich sie konkret formulieren. Tabelle 1 am Ende dieses Artikels fasst die wichtigsten Unterscheidungen zwischen Konstruktor und Methode zusammen.

Zweck und Funktion

Konstruktoren haben einen Lebenszweck: eine Instanz einer Klasse zu erstellen. Dies kann auch als Erstellen eines Objekts bezeichnet werden, wie in:

Schnabeltier p1 = neues Schnabeltier (); 

Der Zweck von Methoden ist dagegen viel allgemeiner. Die Grundfunktion einer Methode besteht darin, Java-Code auszuführen.

Signaturunterschiede

Konstruktoren und Methoden unterscheiden sich in drei Aspekten der Signatur: Modifikatoren, Rückgabetyp und Name. Wie Methoden können Konstruktoren über einen der Zugriffsmodifikatoren verfügen: öffentlich, geschützt, privat oder keine (häufig als Paket oder freundlich bezeichnet ). Im Gegensatz zu Methoden können Konstruktoren nur Zugriffsmodifikatoren verwenden. Daher Bauer kann nicht sein abstract, final, native, static, oder synchronized.

Die Rückgabetypen sind ebenfalls sehr unterschiedlich. Methoden können einen beliebigen gültigen Rückgabetyp oder keinen Rückgabetyp haben. In diesem Fall wird der Rückgabetyp als angegeben void. Konstruktoren haben keinen Rückgabetyp, nicht einmal void.

Schließlich haben Methoden und Konstruktoren in Bezug auf die Signatur unterschiedliche Namen. Konstruktoren haben denselben Namen wie ihre Klasse. Gemäß der Konvention verwenden Methoden andere Namen als den Klassennamen. Wenn das Java-Programm normalen Konventionen folgt, beginnen Methoden mit einem Kleinbuchstaben, Konstruktoren mit einem Großbuchstaben. Außerdem sind Konstruktornamen normalerweise Substantive, da Klassennamen normalerweise Substantive sind. Methodennamen geben normalerweise Aktionen an.

Die Verwendung von "this"

Konstruktoren und Methoden verwenden das Schlüsselwort thisganz anders. Eine Methode thisbezieht sich auf die Instanz der Klasse, die die Methode ausführt. Statische Methoden werden nicht verwendet this. Sie gehören nicht zu einer Klasseninstanz und thishätten daher nichts zu referenzieren. Statische Methoden gehören eher zur Klasse als zu einer Instanz. Konstruktoren thisbeziehen sich auf einen anderen Konstruktor in derselben Klasse mit einer anderen Parameterliste. Studieren Sie den folgenden Code:

öffentliche Klasse Platypus {String name; Schnabeltier (String-Eingabe) {Name = Eingabe; } Platypus () {this ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = neuer Platypus ("Digger"); Schnabeltier p2 = neues Schnabeltier (); }}

Im Code gibt es zwei Konstruktoren. Der erste nimmt eine StringEingabe vor, um die Instanz zu benennen. Der zweite, der keine Parameter annimmt, ruft den ersten Konstruktor mit dem Standardnamen auf "John/Mary Doe".

Wenn ein Konstruktor verwendet this, muss er in der ersten Zeile des Konstruktors stehen. Wenn Sie diese Regel ignorieren, wird der Compiler Einwände erheben.

Die Verwendung von "super"

Sowohl Methoden als auch Konstruktoren superbeziehen sich auf eine Oberklasse, jedoch auf unterschiedliche Weise. Methoden werden verwendet super, um eine überschriebene Methode in der Oberklasse auszuführen, wie das folgende Beispiel zeigt:

Klasse Mammal {void getBirthInfo () {System.out.println ("lebend geboren."); }} Klasse Platypus erweitert Mammal {void getBirthInfo () {System.out.println ("Luke aus Eiern"); System.out.print ("ein Säugetier ist normalerweise"); super.getBirthInfo (); }}

Im obigen Programm super.getBirthInfo()ruft der Aufruf die überschriebene Methode der MammalOberklasse auf.

Konstruktoren werden verwendet super, um den Konstruktor der Oberklasse aufzurufen. Wenn ein Konstruktor verwendet super, muss er es in der ersten Zeile verwenden. Andernfalls beschwert sich der Compiler. Ein Beispiel folgt:

öffentliche Klasse SuperClassDemo {SuperClassDemo () {}} Klasse Child erweitert SuperClassDemo {Child () {super (); }}

Im obigen (und trivialen!) Beispiel enthält der Konstruktor zusätzlich zur Klasse Child()einen Aufruf von super, wodurch die Klasse SuperClassDemoinstanziiert wird Child.

Vom Compiler bereitgestellter Code

Der neue Java-Programmierer kann stolpern, wenn der Compiler automatisch Code für Konstruktoren bereitstellt. Dies geschieht, wenn Sie eine Klasse ohne Konstruktoren schreiben. Der Compiler stellt automatisch einen Konstruktor ohne Argumente für Sie bereit. Wenn Sie also schreiben:

öffentliche Klasse Beispiel {} 

es ist funktional gleichbedeutend mit Schreiben:

öffentliche Klasse Beispiel {Beispiel () {}} 

Der Compiler liefert auch automatisch Code, wenn Sie nicht super(unter Verwendung von null oder mehr Parametern) als erste Zeile eines Konstruktors verwenden. In diesem Fall fügt der Computer automatisch ein super. Wenn Sie also schreiben:

öffentliche Klasse TestConstructors {TestConstructors () {}} 

es ist funktional gleichbedeutend mit Schreiben:

öffentliche Klasse TestConstructors {TestConstructors () { super; }}

Der Anfänger mit den scharfen Augen mag sich fragen, wie das obige Programm den Konstruktor der Elternklasse aufrufen kann, wenn TestConstructorkeine Klasse erweitert wird. Die Antwort ist, dass Java die ObjectKlasse erweitert, wenn Sie eine Klasse nicht explizit erweitern. Der Compiler liefert automatisch einen Konstruktor ohne Argumente, wenn kein Konstruktor explizit deklariert ist, und liefert automatisch einen superAufruf ohne Argumente , wenn ein Konstruktor keinen expliziten Aufruf hat super. Die folgenden zwei Codefragmente sind also funktional äquivalent:

öffentliche Klasse Beispiel {} 

und

öffentliche Klasse Beispiel {Beispiel () { super; }}

Erbe

Was ist mit dem folgenden Szenario falsch? Ein Anwalt liest den Willen von A. Class. Die Mitglieder der ClassFamilie sind um einen großen Konferenztisch versammelt, einige sanft zu schluchzen. Der Anwalt liest: "Ich A. Classbin geistig und körperlich gesund und überlasse alle meine Konstrukteure meinen Kindern."

Das Problem ist, dass Konstruktoren nicht vererbt werden können. Zum Glück für die ClassKinder erben sie automatisch die Methoden ihrer Eltern, sodass die ClassKinder nicht völlig mittellos werden.

Denken Sie daran, Java-Methoden werden vererbt, Konstruktoren nicht. Betrachten Sie die folgende Klasse:

public class Beispiel {public void sayHi {system.out.println ("Hi"); } Example () {}} public class SubClass erweitert Example {}

The SubClass class automatically inherits the sayHi method found in the parent class. However, the constructor Example() is not inherited by the SubClass.

Summarizing the differences

Just as the platypus differs from the typical mammal, so too do constructors differ from methods; specifically in their purpose, signature, and use of this and super. Additionally, constructors differ with respect to inheritance and compiler-supplied code. Keeping all these details straight can be a chore; the following table provides a convenient summary of the salient points. You can find more information regarding constructors and methods in the Resources section below.

Table 1. Differences Between Constructors and Methods

Topic Constructors Methods
Purpose Create an instance of a class Group Java statements
Modifiers Cannot be abstract, final, native, static, or synchronized Can be abstract, final, native, static, or synchronized
Return type No return type, not even void void or a valid return type
Name Same name as the class (first letter is capitalized by convention) -- usually a noun Any name except the class. Method names begin with a lowercase letter by convention -- usually the name of an action
this Refers to another constructor in the same class. If used, it must be the first line of the constructor Refers to an instance of the owning class. Cannot be used by static methods
super Calls the constructor of the parent class. If used, must be the first line of the constructor Calls an overridden method in the parent class
Inheritance Constructors are not inherited Methods are inherited
Compiler automatically supplies a default constructor Wenn die Klasse keinen Konstruktor hat, wird automatisch ein Konstruktor ohne Argumente bereitgestellt Gilt nicht
Der Compiler liefert automatisch einen Standardaufruf an den Superklassenkonstruktor Wenn der Konstruktor übernimmt keine Null-oder-mehr Argument Anrufe super, ein No-Argument Aufruf superwird Gilt nicht
Robert Nielsen ist ein Sun Certified Java 2 Programmer. Er hat einen Master-Abschluss in Pädagogik, der sich auf computergestützten Unterricht spezialisiert hat, und unterrichtet seit mehreren Jahren im Computerbereich. Er hat auch Computerartikel in verschiedenen Magazinen veröffentlicht.

Erfahren Sie mehr über dieses Thema

  • Einige Bücher, die die Grundlagen von Konstruktoren und Methoden behandeln, sind
  • Der vollständige Java 2 Study Certification Guide von Simon Roberts et al. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
  • Java 2 (Exam Cram), Bill Brogden (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Java auf den Punkt gebracht, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Besuchen Sie die Sun Microsystems-Website, um mehr über Methoden und Konstruktoren zu erfahren

    //java.sun.com/docs/books/tutorial/trailmap.html

  • Weitere Java-Inhalte für Anfänger finden Sie in der neuen Java 101- Spaltenreihe von JavaWorld

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Diese Geschichte "Konstruktoren verstehen" wurde ursprünglich von JavaWorld veröffentlicht.