JavaRush /Java-Blog /Random-DE /Methodensignatur

Methodensignatur

Veröffentlicht in der Gruppe Random-DE
Hallo! Sie beherrschen bereits das Erstellen eigener Klassen mit Feldern und Methoden. Heute werden wir ausführlich über die Methoden sprechen. Das haben wir in unseren Vorträgen natürlich schon öfter getan, aber wir haben hauptsächlich über allgemeine Punkte gesprochen. Heute werden wir die Methoden im wahrsten Sinne des Wortes „in Teilen“ analysieren – wir werden herausfinden, woraus sie bestehen, welche Möglichkeiten es zu ihrer Erstellung gibt und wie das alles bewältigt werden kann :) Auf geht's!Methodensignatur - 1

Methodensignatur

Der gesamte Code, der eine Methode beschreibt, wird als Methodendeklaration bezeichnet . Eine Methodensignatur enthält den Methodennamen und die Parametertypen in einer bestimmten Reihenfolge. Das allgemeine Erscheinungsbild der Anzeige lässt sich wie folgt beschreiben:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Nehmen wir ein Beispiel für die Deklaration mehrerer Methoden der Klasse Dog.
public class Dog {

   String name;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {
       Dog max = new Dog(„Max“);
       max.woof();

   }

   public void woof() {
       System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
   }

   public void run(int meters) {
       System.out.println("Собака по имени " + name + " пробежала " + meters + " метров!");
   }

   public String getName() {
       return name;
   }
}

1. Zugriffsmodifikator

Der Zugriffsmodifikator wird immer zuerst aufgeführt. Alle Klassenmethoden Dogwerden durch den Modifikator bezeichnet public. Das heißt, wir können sie aus jeder anderen Klasse aufrufen:
public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Бутч");
       butch.run(100);
   }

}
DogWie Sie sehen, sind Klassenmethoden in der Klasse leicht zugänglich Main. Dies ist dank des Modifikators möglich public. Es gibt weitere Modifikatoren in Java, und nicht alle ermöglichen Ihnen die Verwendung einer Methode innerhalb einer anderen Klasse. Wir werden in anderen Vorträgen darüber sprechen. Die Hauptsache ist, sich daran zu erinnern, wofür der Modifikator verantwortlich ist: die Verfügbarkeit/Unzugänglichkeit der Methode in anderen Klassen :)

2. Das statische Schlüsselwort

Eine der Methoden wird Dognämlich main()durch das Schlüsselwort angegeben static. Wenn es vorhanden ist, muss es nach dem Zugriffsmodifikator angegeben werden. Erinnern Sie sich, dass wir in früheren Vorlesungen über statische Klassenvariablen gesprochen haben? Auf Methoden angewendet hat dieses Wort ungefähr die gleiche Bedeutung. Wenn eine Methode als angegeben ist static, bedeutet dies, dass sie ohne Verweis auf ein bestimmtes Klassenobjekt verwendet werden kann. Und tatsächlich müssen Sie zum Ausführen einer statischen Methode main()in einer Klasse Dogkeine Instanz erstellen Dog; sie läuft auch ohne. Wenn diese Methode nicht statisch wäre, müssten wir zur Verwendung zunächst ein Objekt erstellen.

3. Rückgabewert.

Wenn unsere Methode etwas zurückgeben muss, geben wir anschließend den Typ des Rückgabewerts an. Dies ist am Beispiel eines Getters zu sehen getName():
public String getName() {
   return name;
}
Es gibt ein Objekt vom Typ zurück String. Wenn die Methode nichts zurückgibt, wird das Schlüsselwort anstelle des Typs angegeben void, wie in der Methode woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Methoden mit demselben Namen

Es gibt Situationen, in denen unser Programm mehrere Optionen für die Funktionsweise einer Methode benötigt. Warum erschaffen wir nicht unsere eigene künstliche Intelligenz? Amazon hat Alexa, Yandex hat Alice, warum sind wir also schlechter? :) Im Film über Iron Man hat Tony Stark seine eigene herausragende künstliche Intelligenz geschaffen – JARVIS. Lassen Sie uns dem wunderbaren Charakter Tribut zollen und unsere KI zu seinen Ehren benennen :) Die Als erstes müssen wir Jarvis beibringen, die Leute zu begrüßen, die den Raum betreten (es wäre seltsam, wenn sich ein so großer Intellekt als unhöflich erweisen würde).
public class Jarvis {

   public void sayHi(String name) {
       System.out.println("Guten Abend, " + name + ", Wie geht es Ihnen?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
Konsolenausgabe:

Добрый вечер, Тони Старк, Wie ваши дела?
Großartig! Jarvis weiß, wie man jemanden begrüßt, der hereinkommt. Am häufigsten wird es natürlich sein Besitzer sein – Tony Stark. Aber er darf nicht alleine kommen! Und unsere Methode sayHi()benötigt nur ein Argument als Eingabe. Und dementsprechend wird er nur einen der Kommenden begrüßen können und den anderen ignorieren. Nicht sehr höflich, stimmst du zu?:/ Um das Problem zu lösen, können wir in diesem Fall einfach zwei Methoden mit demselben Namen, aber unterschiedlichen Parametern in die Klasse schreiben:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Guten Abend, " + firstGuest + ", Wie geht es Ihnen?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Guten Abend, " + firstGuest + ", " + secondGuest + ", Wie geht es Ihnen?");
   }

}
Dies wird als Methodenüberladung bezeichnet . Durch die Überlastung ist unser Programm flexibler und bietet verschiedene Arbeitsmöglichkeiten. Schauen wir uns an, wie es funktioniert:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Guten Abend, " + firstGuest + ", Wie geht es Ihnen?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Guten Abend, " + firstGuest + ", " + secondGuest + ", Wie geht es Ihnen?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Konsolenausgabe:

Добрый вечер, Тони Старк, Wie ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, Wie ваши дела?
Super, beide Optionen haben funktioniert :) Allerdings haben wir das Problem nicht gelöst! Was ist, wenn drei Gäste anwesend sind? Natürlich können wir die Methode noch einmal überladen, sayHi()um die Namen von drei Gästen zu akzeptieren. Aber es können auch 4 oder 5 sein. Und so weiter bis ins Unendliche. Gibt es eine andere Möglichkeit, Jarvis beizubringen, mit einer beliebigen Anzahl von Namen zu arbeiten, ohne eine Million Methodenüberladungen sayHi()? :/ Natürlich gibt es! Wäre Java sonst die beliebteste Programmiersprache der Welt? ;)
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Guten Abend, " + name + ", Wie geht es Ihnen?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Mit dem als Parameter übergebenen Datensatz ( String...names) können wir angeben, dass eine bestimmte Anzahl von Zeichenfolgen an die Methode übergeben wird. Wie viele es sein sollen, legen wir nicht im Voraus fest, sodass die Bedienung unserer Methode nun deutlich flexibler wird:
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Guten Abend, " + name + ", Wie geht es Ihnen?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Schwarze Witwe", „Hulk“);
   }
}
Konsolenausgabe:

Добрый вечер, Тони Старк, Wie ваши дела? 
Добрый вечер, Капитан Америка, Wie ваши дела? 
Добрый вечер, Черная Вдова, Wie ваши дела? 
Добрый вечер, Халк, Wie ваши дела?
Innerhalb der Methode durchlaufen wir alle Argumente und geben vorgefertigte Phrasen mit Namen an die Konsole aus. Hier verwenden wir eine vereinfachte Schleife for-each(Sie haben sie bereits kennengelernt). Das ist großartig, denn Schreiben String...namesbedeutet eigentlich, dass alle übergebenen Parameter vom Compiler in ein Array gestellt werden. Daher nameskönnen Sie mit einer Variablen wie mit einem Array arbeiten und diese auch in einer Schleife durchlaufen. Darüber hinaus funktioniert es für beliebig viele übertragene Leitungen! Zwei, zehn, sogar tausend – die Methode funktioniert zuverlässig bei beliebig vielen Gästen. Viel praktischer als Überladungen für alle möglichen Optionen, finden Sie nicht auch? :) Lassen Sie uns ein weiteres Beispiel für Methodenüberladung geben. Fügen wir Jarvis eine Methode hinzu printInfoFromDatabase(). Es werden Informationen über die Person aus der Datenbank auf der Konsole gedruckt. Wenn aus der Datenbank hervorgeht, dass es sich bei einer Person um einen Superhelden oder Superschurken handelt, werden diese Informationen ebenfalls auf dem Bildschirm angezeigt:
public class Jarvis {

   public  void printInfoFromDatabase (String bio) {

       System.out.println(bio);
   }

   public void printInfoFromDatabase(String bio, boolean isEvil, String nickname) {

       System.out.println(bio);
       if (!isEvil) {
           System.out.println("Также известен Wie супергерой " + nickname);
       } else {
           System.out.println("Также известен Wie суперзлодей " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Макс Эйзенхарт. Рост 188см, вес 86 кг.", true, "Магнето");
   }
}
Abschluss:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен Wie суперзлодей Магнето
So funktioniert unsere Methode abhängig von den Daten, die wir ihr übergeben. Ein weiterer wichtiger Punkt:Auf die Reihenfolge der Argumente kommt es an! Nehmen wir an, unsere Methode benötigt einen String und eine Zahl als Eingabe:
public class Man {

   public static void sayYourAge(String greeting, int age) {
       System.out.println(greeting + " " + age);
   }

   public static void main(String[] args) {

       sayYourAge("Mein Alter - ", 33);
       sayYourAge(33, "Mein Alter - "); //Fehler!
   }
}
Wenn eine sayYourAge()Klassenmethode Maneinen String und eine Zahl als Eingabe akzeptiert, müssen diese in dieser Reihenfolge im Programm übergeben werden! Wenn wir sie in einer anderen Reihenfolge übergeben, gibt der Compiler einen Fehler aus und die Person kann ihr Alter nicht erkennen. Übrigens sind die Konstruktoren, die wir in der letzten Vorlesung behandelt haben, auch Methoden! Sie können auch überladen werden (mehrere Konstruktoren mit unterschiedlichen Argumentsätzen erstellen) und für sie ist auch die Reihenfolge der Argumentübergabe von grundlegender Bedeutung. Echte Methoden! :)

So rufen Sie Methoden mit ähnlichen Parametern auf

Wie Sie wissen, gibt es in Java ein Wort wie null. Bei der Arbeit damit ist es sehr wichtig zu verstehen, dass null weder ein Objekt noch ein Datentyp ist. Stellen Sie sich vor, wir haben eine Klasse „Man“ und eine Methode introduce(), die den Namen und das Alter einer Person angibt. In diesem Fall kann das Alter in Textform übermittelt oder als Zahl ausgedrückt werden.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man sasha = new Man();
       sasha.introduce(„Sascha“, "двадцать один");

       Man masha = new Man();
       masha.introduce("Мария", 32);
   }
}
Wir sind bereits mit dem Überladen vertraut und wissen daher, dass die Methode in beiden Fällen wie erwartet funktioniert:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Aber was passiert, wenn wir als zweiten Parameter null übergeben, keine Zeichenfolge oder Zahl?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Wir erhalten einen Kompilierungsfehler! Der Fehler „Mehrdeutiger Methodenaufruf“ wird als „Mehrdeutiger Methodenaufruf“ übersetzt. Warum konnte es entstehen und was ist die „Mehrdeutigkeit“? Es ist eigentlich einfach. Die Sache ist die, wir haben zwei Varianten der Methode: with Stringund with Integerals zweites Argument. Aber beide String, und Integerkönnen null sein! Für beide Typen (da es sich um Referenztypen handelt) ist null der Standardwert. Deshalb kann der Compiler in dieser Situation nicht herausfinden, welche Version der Methode er aufrufen soll. Die Lösung dieses Problems ist ganz einfach. Der Punkt ist, dass null explizit in einen bestimmten Referenztyp konvertiert werden kann. Daher können Sie beim Aufruf einer Methode in Klammern angeben, welchen Datentyp Sie für das zweite Argument benötigen! Der Compiler wird Ihren „Hinweis“ verstehen und die erforderliche Methode aufrufen:
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Метод со строкой и числом!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", (String) null);
   }
}
Abschluss:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Wenn der numerische Parameter jedoch ein Grundelement intund kein Objekt eines Referenztyps wäre Integer, würde ein solcher Fehler nicht auftreten.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Метод со строкой и числом!!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", null);
   }
}
Haben Sie erraten, warum? Wenn Sie es erraten haben: Gut gemacht :) Denn Grundelemente können nicht gleich Null sein. Jetzt hat der Compiler nur noch eine Möglichkeit, die Methode aufzurufen introduce()– mit zwei Zeilen. Es ist diese Version der Methode, die bei jedem Aufruf der Methode verarbeitet wird.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION