CodeGym /Java blog /Tilfældig /Metodedeklaration
John Squirrels
Niveau
San Francisco

Metodedeklaration

Udgivet i gruppen
Hej! Du har allerede kendt til at oprette dine egne klasser med felter og metoder. Nu vil vi dvæle ved metoder.
Metodeerklæring - 1
Selvfølgelig har vi allerede gjort dette mere end én gang i vores lektioner, men vi har hovedsageligt dækket generelt. I dag skal vi dissekere metoder og studere, hvad de er lavet af, de forskellige måder at skabe dem på, og hvordan man administrerer det hele. :) Lad os gå!

Metodedeklaration

Al den kode, der definerer en metode, kaldes en metodedeklaration . Den generelle form for en metodedeklaration kan beskrives som følger:

access modifier, return type, method name (parameter list) {
    // method body
}
Som eksempler kan du tage et kig på erklæringerne fra de forskellige metoder i klassen 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("A dog named " + name + " says \"Woof, woof!\"");
   }

   public void run(int distanceInFeet) {
       System.out.println("A dog named " + name + " ran " + distanceInFeet + " feet!");
   }

   public String getName() {
       return name;
   }
}

1. Adgangsmodifikator

Adgangsmodifikatoren er altid angivet først. Alle Dogklassens metoder er markeret med den offentlige modifikator. Det betyder, at vi kan kalde dem fra enhver anden klasse:

public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Butch");
       butch.run(100);
   }

}
Som du kan se, Doger klassens metoder let tilgængelige i Mainklassen. Dette er muligt på grund af den offentlige modifikator. I Java er der andre modifikatorer. De tillader ikke alle metoder at blive brugt i andre klasser. Vi vil tale om dem i andre lektioner. Det vigtigste at huske er, hvad modifikatoren er ansvarlig for: om en metode er tilgængelig i andre klasser :)

2. statisk søgeord

En af Dogmetoderne, main(), er markeret med søgeordet static . Det er også en del af metodedeklarationen, og vi kender allerede dens betydning. Vi nævnte det ikke i metodeerklæringsskabelonen, der blev givet i begyndelsen af ​​lektionen, fordi det er valgfrit. Hvis det er angivet, skal det komme efter adgangsmodifikatoren. Kan du huske, at vi i de seneste lektioner talte om statiske (klasse)variable? Når det anvendes på metoder, har dette søgeord nogenlunde samme betydning. Hvis en metode er statisk , kan den bruges uden reference til et specifikt objekt i klassen. Og du behøver faktisk ikke et Dogobjekt for at køre den statiske main()metode iDogklasse. Den kører fint uden en. Hvis denne metode ikke var statisk, ville vi først skulle oprette et objekt for at køre det.

3. Returværdi

Hvis vores metode skulle returnere noget, så angiver vi typen af ​​returværdien. Dette fremgår af eksemplet med getName()getteren:

public String getName() {
   return name;
}
Det returnerer et Stringobjekt. Hvis en metode ikke returnerer noget, bruges nøgleordet voidwoof() i stedet, som i metoden:

public void woof() {
   System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}

Metoder med samme navn

Der er situationer, hvor vi vil have flere forskellige måder at kalde en metode på. Hvorfor ikke skabe vores egen kunstige intelligens? Amazon har Alexa, Apple har Siri, så hvorfor skulle vi ikke have en? :) I filmen Iron Man skaber Tony Stark sin egen utrolige kunstige intelligens, Jarvis. Lad os hylde den fantastiske karakter og navngive vores AI til hans ære. :) Det første, vi skal gøre, er at lære Jarvis at sige hej til folk, der kommer ind i lokalet (det ville være mærkeligt, hvis sådan et fantastisk intellekt viste sig at være uhøfligt).

public class Jarvis {

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
Konsoludgang: Godaften, Tony Stark. Hvordan har du det? Meget godt! Jarvis er nu i stand til at byde gæster velkommen. Selvfølgelig, oftere end det vil være hans mester, Tony Stark. Men hvad nu hvis han ikke kommer alene! Men vores sayHi()metode accepterer kun ét argument. Og så kan den kun hilse på én person, der kommer ind i rummet, og vil ignorere den anden. Ikke særlig høflig, enig? :/ I dette tilfælde kan vi løse problemet ved blot at skrive 2 metoder med samme navn, men forskellige parametre:

public class Jarvis {

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

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

}
Dette kaldes metodeoverbelastning . Metodeoverbelastning gør vores program mere fleksibelt og rummer forskellige måder at arbejde på. Lad os gennemgå, hvordan det virker:

public class Jarvis {

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

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Konsoludgang: Godaften, Tony Stark. Hvordan har du det? Godaften, Tony Stark og Captain America. Hvordan har du det? Fremragende, begge versioner fungerede. :) Men vi løste ikke problemet! Hvad hvis der er tre gæster? Vi kunne selvfølgelig overbelaste sayHi()metoden igen, så den accepterer tre gæstenavne. Men der kunne være 4 eller 5. Helt til det uendelige. Er der ikke en bedre måde at lære Jarvis at håndtere et hvilket som helst antal navne på, uden at overbelaste metoden sayHi()en million gange()? :/ Selvfølgelig er der! Hvis der ikke var, tror du, at Java ville være det mest populære programmeringssprog i verden? ;)

public class Jarvis {

   public void sayHi(String...names) {

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Når ( String... names ) bruges som en parameter, indikerer det, at en samling af Strings vil blive videregivet til metoden. Vi behøver ikke på forhånd at angive, hvor mange der bliver, så nu er vores metode meget mere fleksibel:

public class Jarvis {

   public void sayHi(String...names) {

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
   }
}
Konsoludgang: Godaften, Tony Stark. Hvordan har du det? Godaften, Captain America. Hvordan har du det? God aften, sorte enke. Hvordan har du det? Godaften, Hulk. Hvordan har du det? Inde i metoden itererer vi over alle argumenterne og viser sætninger formateret med navne. Her bruger vi en forenklet for-eachloop (som du har set før). Det er perfekt her, fordi ( String... names ) notationen faktisk betyder, at compileren sætter alle de beståede argumenter i en matrix. Som et resultat kan vi arbejde med variabelnavnesom vi ville arbejde med et array, herunder ved at gentage det i en loop. Plus, det vil fungere med et vilkårligt antal beståede strenge! To, ti, endda tusind - metoden vil fungere korrekt med et hvilket som helst antal gæster. Meget mere praktisk end at overbelaste metoden for alle mulighederne, synes du ikke? :) Her er endnu et eksempel på metodeoverbelastning. Lad os give Jarvis en printInfoFromDatabase()metode. Det vil vise oplysninger om en person fra en database. Hvis databasen indikerer, at en person er en superhelt eller superskurk, viser vi disse oplysninger:

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("Also known as the superhero " + nickname);
       } else {
           System.out.println("Also known as the supervillain " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Laura Palmer. Date of birth: July 22, 1972. Twin Peaks, Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Max Eisenhardt. Height: 15.6 ft. Weight: 189 lbs. ", true, "Magneto");
   }
}
Output: Laura Palmer. Fødselsdato: 22. juli 1972. Twin Peaks, Washington Max Eisenhardt. Højde: 15,6 fod. Vægt: 189 lbs. Også kendt som superskurken Magneto Så vores metodes adfærd afhænger af de data, vi videregiver til den. Her er et andet vigtigt punkt: rækkefølgen af ​​argumenterne betyder noget! Lad os sige, at vores metode tager en streng og et tal:

public class Person {

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

   public static void main(String[] args) {

       sayYourAge("My age is ", 33);
       sayYourAge(33, "My age is "); // Error!
   }
}
Hvis Personklassens sayYourAge()metode tager en streng og et tal som input, så er det den rækkefølge, at disse argumenter skal videregives til metoden! Hvis vi sender dem i en anden rækkefølge, vil compileren generere en fejl, og personen vil ikke være i stand til at sige sin alder. Forresten, konstruktører, som vi dækkede i sidste lektion, er også metoder! Du kan også overbelaste dem (dvs. oprette flere konstruktører med forskellige sæt af parametre), og rækkefølgen af ​​beståede argumenter er også fundamentalt vigtig for dem. Det er rigtige metoder! :)

Sådan påberåbes metoder med lignende parametre

Som du ved, nuller et nøgleord i Java. Det er meget vigtigt at forstå, at det nullhverken er et objekt eller en datatype . Forestil dig, at vi har en Personklasse og en introduce()metode, som annoncerer personens navn og alder. Ydermere kan alderen videregives som tekst eller et tal.

public class Person {

   public void introduce(String name, String age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person alex = new Person();
       alex.introduce ("Alex", "twenty-one");

       Person mary = new Person();
       mary.introduce("Mary", 32);
   }
}
Vi er allerede bekendt med overbelastning, så vi ved, at begge metoder vil opføre sig, som de skal: Jeg hedder Alex. Min alder er enogtyve. Jeg hedder Mary. Min alder er 32 Men hvad sker der, hvis vi passerer nullsom den anden parameter i stedet for en streng eller et tal?

public static void main(String[] args) {

   Person victor = new Person();
   victor.introduce("Victor", null);// Ambiguous method call!
}
Vi får en kompileringsfejl! Hvad forårsager dette, og hvad er "tvetydigheden" helt præcist? Faktisk er det hele meget enkelt. Problemet er, at vi har to versioner af metoden: en med a Stringsom det andet argument, og en med en Integersom det andet argument. Men a Stringog an Integerkan begge være null! Fordi de er referencetyper, nuller standardværdien for dem begge. Derfor kan compileren i denne situation ikke finde ud af, hvilken version af metoden den skal kalde. Løsningen på dette problem er ret enkel. Nullkan eksplicit konverteres til en bestemt referencetype. Når du kalder en metode, kan du således i parentes angive den datatype, du ønsker for det andet argument! Compileren vil forstå dit "tip" og kalder den korrekte metode:

public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Method with a string and a number!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", (String) null);
   }
}
Output: Metode med to strenge! Mit navn er Victor. Min alder er null Bemærk, at hvis nummerparameteren var en primitiv int, snarere end en forekomst af integer-referencetypen, ville der ikke have været en sådan fejl.

public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Method with a string and a number!!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", null);
   }
}
Kan du gætte hvorfor? Hvis du gættede hvorfor, godt gået! :) Fordi primitiver ikke kan være null. Nu har compileren kun ét valg, nemlig at kalde introduce()metoden med to strenge. Dette er den version af metoden, der kører hver gang metoden kaldes.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION