In den vorherigen Kapiteln haben wir häufig System.out.println() verwendet. Was ist das also?
println() ist eine Methode (Method), System ist eine Systemklasse (Class) und out ist ein Standardausgabeobjekt (Object). Die Verwendung dieses Satzes besteht darin, die Methode println() im Standardausgabeobjekt in der Systemklasse System aufzurufen.
Eine Java-Methode ist eine Sammlung von Anweisungen, die zusammen eine Funktion ausführen.
Eine Methode ist eine geordnete Kombination von Schritten zur Lösung eines Problemtyps
In Klassen oder Objekten enthaltene Methoden
Methoden werden im Programm erstellt und an anderer Stelle referenziert
Im Allgemeinen umfasst die Definition einer Methode die folgende Syntax:
Modifikator-Rückgabewerttyp-Methodenname (Parametertyp-Parametername) {
...
Methodenkörper...
Rückgabewert zurückgeben;
}
Eine Methode enthält einen Methodenkopf und einen Methodenkörper. Hier sind alle Teile einer Methode:
Modifikatoren: Modifikatoren, die optional sind, teilen dem Compiler mit, wie die Methode aufgerufen werden soll. Definiert den Zugriffstyp für diese Methode.
Rückgabewerttyp: Methoden können Werte zurückgeben. returnValueType ist der Datentyp des Methodenrückgabewerts. Einige Methoden führen die erforderliche Operation aus, geben jedoch keinen Wert zurück. In diesem Fall ist returnValueType das Schlüsselwort void .
Methodenname: ist der tatsächliche Name der Methode. Der Methodenname und die Parameterliste bilden zusammen die Methodensignatur.
Parametertyp: Der Parameter ist wie ein Platzhalter. Beim Aufruf der Methode werden Werte an die Parameter übergeben. Dieser Wert wird als Aktualparameter oder Variable bezeichnet. Die Parameterliste bezieht sich auf den Parametertyp, die Reihenfolge und die Anzahl der Parameter der Methode. Parameter sind optional und Methoden dürfen keine Parameter enthalten.
Methodenkörper: Der Methodenkörper enthält spezifische Anweisungen, die die Funktion der Methode definieren.
wie:
publicstaticintage(intbirthday){...}
Es können mehrere Parameter vorhanden sein:
staticfloatinterest(floatprincipal,intyear){...}
Hinweis: In einigen anderen Sprachen beziehen sich Methoden auf Prozeduren und Funktionen. Eine Methode, die einen nicht ungültigen Rückgabewert zurückgibt, wird als Funktion bezeichnet; eine Methode, die einen ungültigen Rückgabewert zurückgibt, wird als Prozedur bezeichnet.
Die folgende Methode enthält die beiden Parameter num1 und num2 und gibt den Maximalwert dieser beiden Parameter zurück.
/**Gibt den größeren Wert der beiden ganzzahligen Variablendaten zurück*/
publicstaticintmax(intnum1,intnum2){
Beleidigung;
if(num1>num2){
Ergebnis=Anzahl1;
}anders{
Ergebnis=Anzahl2;
}
returnresult;
}
Java unterstützt zwei Arten des Methodenaufrufs, abhängig davon, ob die Methode einen Wert zurückgibt.
Wenn ein Programm eine Methode aufruft, wird die Kontrolle über das Programm auf die aufgerufene Methode übertragen. Die Kontrolle wird an das Programm zurückgegeben, wenn die Return-Anweisung der aufgerufenen Methode ausgeführt wird oder die schließende Klammer des Methodenkörpers erreicht wird.
Wenn eine Methode einen Wert zurückgibt, wird der Methodenaufruf normalerweise als Wert behandelt. Zum Beispiel:
intlarger=max(30,40);
Wenn der Rückgabewert der Methode ungültig ist, muss der Methodenaufruf eine Anweisung sein. Beispielsweise gibt die Methode println void zurück. Der folgende Aufruf ist eine Anweisung:
System.out.println("Willkommen in Java!");
Das folgende Beispiel zeigt, wie eine Methode definiert und aufgerufen wird:
publicclassTestMax{
/**Hauptmethode*/
publicstaticvoidmain(String[]args){
inti=5;
intj=2;
intk=max(i,j);
System.out.println("Themaximumbetween"+i+
"und"+j+"ist"+k);
}
/**Gibt den größeren Wert der beiden Ganzzahlvariablen zurück*/
publicstaticintmax(intnum1,intnum2){
Beleidigung;
if(num1>num2){
Ergebnis=Anzahl1;
}anders{
result=num2;
}
returnresult;
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Das Maximum zwischen 5 und 2 beträgt 5
Dieses Programm enthält die Hauptmethode und die Max-Methode. Die Main-Methode wird von der JVM aufgerufen. Ansonsten unterscheidet sich die Main-Methode nicht von anderen Methoden.
Der Kopf der Hauptmethode bleibt unverändert, wie im Beispiel gezeigt, mit den Modifikatoren public und static, gibt einen Wert vom Typ void zurück, der Methodenname ist main und akzeptiert einen Parameter vom Typ String[]. String[] gibt an, dass der Parameter ein String-Array ist.
In diesem Abschnitt wird erläutert, wie eine void-Methode deklariert und aufgerufen wird.
Das folgende Beispiel deklariert eine Methode namens printGrade und ruft sie auf, um die angegebene Note zu drucken.
publicclassTestVoidMethod{
publicstaticvoidmain(String[]args){
printGrade(78.5);
}
publicstaticvoidprintGrade(doublescore){
if(score>=90,0){
System.out.println('A');
}
elseif(score>=80.0){
System.out.println('B');
}
elseif(score>=70.0){
System.out.println('C');
}
elseif(score>=60.0){
System.out.println('D');
}
anders{
System.out.println('F');
}
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
C
Die printGrade-Methode hier ist eine Methode vom Typ „void“ und gibt keinen Wert zurück.
Ein Aufruf einer void-Methode muss eine Anweisung sein. Daher wird es als Anweisung in der dritten Zeile der Hauptmethode aufgerufen. Genau wie jede Aussage, die mit einem Semikolon endet.
Beim Aufrufen einer Methode müssen Sie Parameter angeben, und zwar in der in der Parameterliste angegebenen Reihenfolge.
Die folgende Methode gibt beispielsweise eine Nachricht n-mal hintereinander aus:
publicstaticvoidnPrintln(Stringmessage,intn){
for(inti=0;i<n;i++)
System.out.println(message);
}
Das folgende Beispiel zeigt die Auswirkung der Wertübergabe.
Dieses Programm erstellt eine Methode, die zwei Variablen austauscht.
publicclassTestPassByValue{
publicstaticvoidmain(String[]args){
intnum1=1;
intnum2=2;
System.out.println("Beforeswapmethod,num1is"+
num1+"andnum2is"+num2);
//Rufen Sie die Swap-Methode auf swap(num1,num2);
System.out.println("Afterswapmethod,num1is"+
num1+"andnum2is"+num2);
}
/**Methode zum Austausch zweier Variablen*/
publicstaticvoidswap(intn1,intn2){
System.out.println("tInsidetheswapmethod");
System.out.println("ttBeforeswappingn1is"+n1
+"n2is"+n2);
// Tauschen Sie die Werte von n1 und n2 aus inttemp=n1;
n1=n2;
n2=temp;
System.out.println("ttAfterswappingn1is"+n1
+"n2is"+n2);
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Vor der swap-Methode ist num1 1 und num2 2
Innerhalb der Swap-Methode
Vor dem Austauschen1ist1n2ist2
Nach dem Austauschen1ist2n2ist1
Nach der swap-Methode ist num1 1 und num2 2
Rufen Sie die Swap-Methode auf und übergeben Sie dabei zwei Parameter. Interessanterweise ändern sich die Werte der tatsächlichen Parameter nach dem Aufruf der Methode nicht.
Die oben verwendete Max-Methode gilt nur für Daten vom Typ int. Aber was ist, wenn Sie den Maximalwert von zwei Gleitkommadatentypen erhalten möchten?
Die Lösung besteht darin, eine andere Methode mit demselben Namen, aber anderen Parametern zu erstellen, wie im folgenden Code gezeigt:
publicstaticdoublemax(doublenum1,doublenum2){
if(num1>num2){
returnnum1;
}anders{
returnnum2;
}
}
Wenn Sie beim Aufruf der max-Methode einen int-Parameter übergeben, wird die max-Methode des int-Parameters aufgerufen.
Wenn ein Double-Parameter übergeben wird, wird der maximale Methodenkörper des Double-Typs aufgerufen. Dies wird als Methodenüberladung bezeichnet.
Das heißt, zwei Methoden einer Klasse haben denselben Namen, aber unterschiedliche Parameterlisten.
Der Java-Compiler bestimmt anhand der Methodensignatur, welche Methode aufgerufen werden soll.
Das Überladen von Methoden kann das Programm klarer und leichter lesbar machen. Methoden, die eng verwandte Aufgaben ausführen, sollten denselben Namen verwenden.
Überladene Methoden müssen unterschiedliche Parameterlisten haben. Sie können Methoden nicht überladen, die ausschließlich auf Modifikatoren oder Rückgabetypen basieren.
Der Gültigkeitsbereich einer Variablen ist der Teil des Programms, von dem aus auf die Variable verwiesen werden kann.
Innerhalb einer Methode definierte Variablen werden als lokale Variablen bezeichnet.
Der Gültigkeitsbereich einer lokalen Variablen beginnt bei ihrer Deklaration und endet am Ende des Blocks, der sie enthält.
Lokale Variablen müssen deklariert werden, bevor sie verwendet werden können.
Der Parameterbereich einer Methode umfasst die gesamte Methode. Der Parameter ist eigentlich eine lokale Variable.
Die im Initialisierungsteil der for-Schleife deklarierten Variablen haben in der gesamten Schleife Gültigkeit.
Der Anwendungsbereich der im Schleifenkörper deklarierten Variablen erstreckt sich jedoch von ihrer Deklaration bis zum Ende des Schleifenkörpers. Es enthält Variablendeklarationen wie unten gezeigt:
Sie können eine lokale Variable mit demselben Namen mehrmals innerhalb einer Methode in verschiedenen nicht verschachtelten Blöcken deklarieren, aber Sie können eine lokale Variable nicht zweimal innerhalb eines verschachtelten Blocks deklarieren.
Manchmal möchten Sie Nachrichten an ein Programm übergeben, während es ausgeführt wird. Dies wird durch die Übergabe von Befehlszeilenargumenten an die Funktion main() erreicht.
Befehlszeilenparameter sind die Informationen, die bei der Ausführung des Programms unmittelbar auf den Programmnamen folgen.
Das folgende Programm gibt alle Befehlszeilenargumente aus:
publicclassCommandLine{
publicstaticvoidmain(Stringargs[]){
for(inti=0;i<args.length;i++){
System.out.println("args ["+i+"]:"+args[i]);
}
}
}
Führen Sie das Programm wie unten gezeigt aus:
javaCommandLinethisisacommandline200-100
Die Laufergebnisse sind wie folgt:
args[0]:this
args[1]:is
args[2]:a
args[3]:Befehl
args[4]:line
args[5]:200
args[6]:-100
Wenn ein Objekt erstellt wird, werden Konstruktoren verwendet, um das Objekt zu initialisieren. Der Konstruktor hat denselben Namen wie die Klasse, zu der er gehört, aber der Konstruktor hat keinen Rückgabewert.
Konstruktoren werden normalerweise verwendet, um Instanzvariablen einer Klasse Anfangswerte zuzuweisen oder andere notwendige Schritte zum Erstellen eines vollständigen Objekts auszuführen.
Unabhängig davon, ob Sie den Konstruktor anpassen oder nicht, verfügen alle Klassen über Konstruktoren, da Java automatisch einen Standardkonstruktor bereitstellt, der alle Mitglieder auf 0 initialisiert.
Sobald Sie Ihren eigenen Konstruktor definieren, wird der Standardkonstruktor ungültig.
Hier ist ein Beispiel für die Verwendung von Konstruktormethoden:
//Eine einfache statische KonstruktorklasseMyClass{
intx;
//Das Folgende ist der Konstruktor MyClass(){
x=10;
}
}
Sie können ein Objekt initialisieren, indem Sie den Konstruktor wie folgt aufrufen:
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass();
MyClasst2=newMyClass();
System.out.println(t1.x+""+t2.x);
}
}
Meistens wird ein Konstruktor mit Parametern benötigt.
Hier ist ein Beispiel für die Verwendung von Konstruktormethoden:
//Eine einfache KonstruktorklasseMyClass{
intx;
//Das Folgende ist der Konstruktor MyClass(inti){
x=i;
}
}
Sie können ein Objekt initialisieren, indem Sie den Konstruktor wie folgt aufrufen:
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass(10);
MyClasst2=newMyClass(20);
System.out.println(t1.x+""+t2.x);
}
}
Die Laufergebnisse sind wie folgt:
1020
Ab JDK 1.5 unterstützt Java die Übergabe variabler Parameter desselben Typs an eine Methode.
Die Deklaration der Variadic-Parameter der Methode sieht folgendermaßen aus:
Typname...Parametername
Fügen Sie in einer Methodendeklaration nach der Angabe des Parametertyps ein Auslassungszeichen (...) hinzu.
In einer Methode kann nur ein variabler Parameter angegeben werden, und dieser muss der letzte Parameter der Methode sein. Alle gewöhnlichen Parameter müssen davor deklariert werden.
publicclassVarargsDemo{
publicstaticvoidmain(Stringargs[]){
//Variable Parametermethode aufrufen printMax(34,3,3,2,56.5);
printMax(newdouble[]{1,2,3});
}
publicstaticvoidprintMax(double...numbers){
if(numbers.length==0){
System.out.println("Noargumentpassed");
zurückkehren;
}
doubleresult=Zahlen[0];
for(inti=1;i<Zahlen.Länge;i++)
if(Zahlen[i]>Ergebnis){
Ergebnis=Zahlen[i];
}
System.out.println("Themaxvalueis"+result);
}
}
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Der Maximalwert beträgt 56,5
Der Maximalwert beträgt 3,0
Java ermöglicht die Definition einer solchen Methode, die aufgerufen wird, bevor das Objekt vom Garbage Collector zerstört (recycelt) wird. Diese Methode heißt finalize() und wird zum Löschen des recycelten Objekts verwendet.
Sie können beispielsweise finalize() verwenden, um sicherzustellen, dass eine von einem Objekt geöffnete Datei geschlossen wird.
In der finalize()-Methode müssen Sie die Operationen angeben, die ausgeführt werden sollen, wenn das Objekt zerstört wird.
Das allgemeine Format von finalize() ist:
protectedvoidfinalize()
{
//Terminalcode hier}
Das Schlüsselwort protected ist ein Qualifikationsmerkmal, das sicherstellt, dass die finalize()-Methode nicht von Code außerhalb der Klasse aufgerufen wird.
Natürlich kann das Speicherrecycling von Java automatisch von der JVM abgeschlossen werden. Wenn Sie es manuell verwenden, können Sie die oben beschriebene Methode verwenden.
publicclassFinalizationDemo{
publicstaticvoidmain(String[]args){
Cakec1=newCake(1);
Cakec2=newCake(2);
Cakec3=newCake(3);
c2=c3=null;
System.gc();//Java Garbage Collector aufrufen}
}
classCakeextendsObject{
privateintid;
publicCake(intid){
this.id=id;
System.out.println("CakeObject"+id+"iscreated");
}
protectedvoidfinalize()throwsjava.lang.Throwable{
super.finalize();
System.out.println("CakeObject"+id+"isdisposed");
}
}
Beim Ausführen des obigen Codes lauten die Ausgabeergebnisse wie folgt:
C:1>javaFinalizationDemo
CakeObject1 wird erstellt
CakeObject2 wird erstellt
CakeObject3 wird erstellt
CakeObject3 wird entsorgt
CakeObject2 ist entsorgt