JavaRush /Java Blog /Random-IT /Firma del metodo

Firma del metodo

Pubblicato nel gruppo Random-IT
Ciao! Hai già imparato a creare le tue classi, con campi e metodi. Oggi parleremo in dettaglio dei metodi. Naturalmente lo abbiamo fatto più di una volta nelle nostre lezioni, ma abbiamo parlato principalmente di punti generali. Oggi analizzeremo letteralmente i metodi “in parti”: scopriremo in cosa consistono, quali opzioni esistono per crearli e come è possibile gestire tutto questo :) Andiamo!Firma del metodo - 1

Firma del metodo

Tutto il codice che descrive un metodo è chiamato dichiarazione di metodo . Una firma del metodo include il nome del metodo e i tipi di parametri in un ordine specifico. L'aspetto generale dell'annuncio può essere descritto come segue:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Facciamo un esempio di dichiarazioni di diversi metodi della classe 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. Modificatore di accesso

Il modificatore di accesso è sempre elencato per primo. Tutti i metodi della classe Dogsono designati dal modificatore public. Cioè, possiamo chiamarli da qualsiasi altra classe:
public class Main {

   public static void main(String[] args) {

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

}
I metodi della classe Dog, come puoi vedere, sono facilmente accessibili nella classe Main. Questo è possibile grazie al modificatore public. Esistono altri modificatori in Java e non tutti ti permetteranno di utilizzare un metodo all'interno di un'altra classe. Ne parleremo in altre lezioni. La cosa principale è ricordare di cosa è responsabile il modificatore: la disponibilità/inaccessibilità del metodo in altre classi :)

2. La parola chiave statica

Uno dei metodi Dog, cioè, main()è indicato dalla parola chiave static. Se esiste, deve essere specificato dopo il modificatore di accesso. Ricordi nelle lezioni precedenti abbiamo parlato di variabili di classe statiche? Quando applicata ai metodi, questa parola ha approssimativamente lo stesso significato. Se un metodo viene specificato come static, significa che può essere utilizzato senza riferimento a un oggetto di classe specifico. E infatti, per eseguire un metodo statico main()in una classe, Dognon è necessario creare un'istanza Dog; funziona senza di essa. Se questo metodo non fosse statico, per utilizzarlo dovremmo prima creare un oggetto.

3. Valore restituito.

Se il nostro metodo deve restituire qualcosa, indichiamo il tipo del valore restituito. Questo può essere visto nell'esempio di un getter getName():
public String getName() {
   return name;
}
Restituisce un oggetto di tipo String. Se il metodo non restituisce nulla, viene specificata la parola chiave al posto del type void, come nel metodo woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Metodi con lo stesso nome

Ci sono situazioni in cui il nostro programma richiede diverse opzioni su come funziona un metodo. Perché non creiamo la nostra intelligenza artificiale? Amazon ha Alexa, Yandex ha Alice, quindi perché siamo peggio? :) Nel film su Iron Man, Tony Stark ha creato la sua eccezionale intelligenza artificiale - JARVIS Rendiamo omaggio al meraviglioso personaggio e chiamiamo la nostra IA in suo onore :) Il La prima cosa che dobbiamo insegnare a Jarvis è salutare le persone che entrano nella stanza (sarebbe strano se un così grande intelletto si rivelasse scortese).
public class Jarvis {

   public void sayHi(String name) {
       System.out.println("Good evening, " + name + ", How are you doing?");
   }

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

Добрый вечер, Тони Старк, How ваши дела?
Grande! Jarvis sa salutare chi entra. Molto spesso, ovviamente, sarà il suo proprietario: Tony Stark. Ma potrebbe non venire da solo! E il nostro metodo sayHi()accetta solo un argomento come input. E, di conseguenza, potrà salutare solo uno di quelli che verranno e ignorerà l'altro. Poco educato, d'accordo?:/ In questo caso, per risolvere il problema, possiamo semplicemente scrivere 2 metodi nella classe con lo stesso nome, ma con parametri diversi:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

}
Questo è chiamato sovraccarico del metodo . Il sovraccarico consente al nostro programma di essere più flessibile e di adattarsi a diverse opzioni di lavoro. Controlliamo come funziona:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

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

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Ottimo, entrambe le opzioni hanno funzionato :) Tuttavia, non abbiamo risolto il problema! E se gli ospiti fossero tre? Naturalmente possiamo sovraccaricare nuovamente il metodo sayHi()per accettare i nomi di tre ospiti. Ma possono essercene 4 o 5. E così via all'infinito. Esiste un altro modo per insegnare a Jarvis a lavorare con un numero qualsiasi di nomi, senza un milione di sovraccarichi di metodi sayHi()? :/ Certo che sì! Altrimenti Java sarebbe il linguaggio di programmazione più popolare al mondo? ;)
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Il record ( String...names) passato come parametro permette di indicare che un certo numero di stringhe vengono passate al metodo. Non specifichiamo in anticipo quanti dovrebbero essercene, quindi il funzionamento del nostro metodo diventa ora molto più flessibile:
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

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

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
All'interno del metodo, eseguiamo il looping di tutti gli argomenti e forniamo frasi già pronte con nomi alla console. Qui utilizziamo un ciclo semplificato for-each(lo hai già incontrato). È fantastico perché scrivere String...namesin realtà significa che tutti i parametri passati vengono inseriti in un array dal compilatore. Pertanto, namespuoi lavorare con una variabile come con un array, incluso il looping. Inoltre, funzionerà per qualsiasi numero di linee trasferite! Due, dieci, anche mille: il metodo funzionerà in modo affidabile con qualsiasi numero di ospiti. Molto più conveniente che eseguire sovraccarichi per tutte le opzioni possibili, non sei d'accordo? :) Diamo un altro esempio di sovraccarico del metodo. Aggiungiamo un metodo a Jarvis printInfoFromDatabase(). Stamperà le informazioni sulla persona dal database alla console. Se il database indica che una persona è un supereroe o un supercriminale, anche questa informazione verrà visualizzata sullo schermo:
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("Также известен How супергерой " + nickname);
       } else {
           System.out.println("Также известен How суперзлодей " + nickname);
       }
   }

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

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Ecco come funziona il nostro metodo a seconda dei dati che vi trasmettiamo. Altro punto importante:L'ordine degli argomenti è importante! Supponiamo che il nostro metodo prenda una stringa e un numero come input:
public class Man {

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

   public static void main(String[] args) {

       sayYourAge("My age - ", 33);
       sayYourAge(33, "My age - "); //error!
   }
}
Se un metodo sayYourAge()di classe Manaccetta una stringa e un numero come input, allora questo è l'ordine in cui devono essere passati al programma! Se li passiamo in un ordine diverso, il compilatore genererà un errore e la persona non sarà in grado di determinare la sua età. A proposito, anche i costruttori di cui abbiamo parlato nell'ultima lezione sono metodi! Possono anche essere sovraccaricati (creare più costruttori con diversi set di argomenti) e per loro anche l'ordine di passaggio degli argomenti è di fondamentale importanza. Metodi veri! :)

Come chiamare metodi con parametri simili

Come sai, in Java esiste una parola come null. Quando si lavora con esso, è molto importante capire che null non è né un oggetto né un tipo di dati. Immaginiamo di avere una classe Man e un metodo introduce()che dichiari il nome e l'età di una persona. In questo caso, l'età può essere espressa sotto forma di testo oppure può essere espressa come numero.
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("Sasha", "двадцать один");

       Man masha = new Man();
       masha.introduce("Мария", 32);
   }
}
Conosciamo già l'overloading, quindi sappiamo che il metodo funzionerà come previsto entrambe le volte:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Ma cosa succede se passiamo null come secondo parametro e non una stringa o un numero?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Riceveremo un errore di compilazione! L'errore "Chiamata del metodo ambigua" viene tradotto come "Chiamata del metodo ambigua". Perché potrebbe sorgere e qual è l’“ambiguità”? In realtà è semplice. Il fatto è che abbiamo due varianti del metodo: con Stringe con Integercome secondo argomento. Ma entrambi String, e Integerpossono essere nulli! Per entrambi i tipi (poiché sono tipi di riferimento), null è il valore predefinito. Questo è il motivo per cui il compilatore in questa situazione non riesce a capire quale versione del metodo dovrebbe chiamare. Risolvere questo problema è abbastanza semplice. Il punto è che null può essere convertito esplicitamente in un tipo di riferimento specifico. Pertanto, quando chiami un metodo, puoi indicare tra parentesi il tipo di dati necessario per il secondo argomento! Il compilatore capirà il tuo "suggerimento" e chiamerà il metodo richiesto:
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);
   }
}
Conclusione:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Ma se il parametro numerico fosse una primitiva inte non un oggetto di tipo riferimento Integer, tale errore non si verificherebbe.
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);
   }
}
Hai indovinato perché? Se hai indovinato, ben fatto :) Perché le primitive non possono essere uguali a null. Ora il compilatore ha solo un'opzione per chiamare il metodo introduce(): con due righe. È questa versione del metodo che verrà elaborata ogni volta che viene chiamato il metodo.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION