JavaRush /Java блогы /Random-KK /Әдіс қолтаңбасы

Әдіс қолтаңбасы

Топта жарияланған
Сәлеметсіз бе! Сіз өрістер мен әдістермен жеке сыныптарыңызды құруды игеріп қойғансыз. Бүгін біз әдістер туралы егжей-тегжейлі сөйлесетін боламыз. Біз, әрине, дәрістерімізде мұны бірнеше рет жасадық, бірақ біз негізінен жалпы мәселелер туралы айттық. Бүгін біз «бөлшектерге» әдістерді сөзбе-сөз талдаймыз - біз олардың неден тұратынын, оларды құрудың қандай нұсқалары бар екенін және мұның барлығын қалай басқаруға болатынын анықтаймыз :) Кеттік!Әдістеменің қолтаңбасы – 1

Әдіс қолтаңбасы

Әдісті сипаттайтын барлық code әдіс декларациясы деп аталады . Әдіс қолтаңбасы белгілі бір ретпен әдіс атауы мен параметр түрлерін қамтиды. Жарнаманың жалпы көрінісін келесідей сипаттауға болады:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Класстың бірнеше әдістерінің мәлімдемелерінің мысалын алайық 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. Қол жеткізу модификаторы

Қатынас модификаторы әрқашан бірінші тізімде болады. Барлық класс әдістері Dogмодификатор арқылы белгіленеді public. Яғни, біз оларды кез келген басқа сыныптан шақыра аламыз:
public class Main {

   public static void main(String[] args) {

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

}
Класс әдістері Dog, көріп отырғаныңыздай, сыныпта оңай қол жетімді Main. Бұл модификатордың арқасында мүмкін болады public. Java тілінде басқа модификаторлар бар және олардың барлығы басқа сынып ішінде әдісті пайдалануға мүмкіндік бермейді. Біз олар туралы басқа дәрістерде айтатын боламыз. Ең бастысы, модификатор не үшін жауап беретінін есте сақтау керек: әдістің басқа сыныптарда болуы/қолжетімсіздігі :)

2. Статикалық кілт сөз

Әдістердің бірі Dog, атап айтқанда, main()кілт сөзімен көрсетіледі static. Егер ол бар болса, онда ол қатынас модификаторынан кейін көрсетілуі керек. Алдыңғы дәрістерде статикалық класс айнымалылары туралы айтқанымыз есіңізде ме? Әдістерге қолданылғанда бұл сөз шамамен бірдей мағынаға ие. Егер әдіс ретінде көрсетілсе static, бұл оны белгілі бір сынып нысанына сілтемесіз пайдалануға болатынын білдіреді. Шынында да, main()сыныпта статикалық әдісті іске қосу үшін Dogдананы жасаудың қажеті жоқ Dog; ол онсыз жұмыс істейді. Егер бұл әдіс статикалық болмаса, оны пайдалану үшін алдымен нысанды жасау керек еді.

3. Қайтарылатын мән.

Егер біздің әдіс бірдеңені қайтаруы керек болса, онда қайтарылатын мәннің түрін көрсетеміз. Мұны getter мысалында көруге болады getName():
public String getName() {
   return name;
}
Ол түрдегі нысанды қайтарады String. Егер әдіс ештеңені қайтармаса, voidәдістегідей type орнына кілт сөз көрсетіледі woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Бірдей аттас әдістер

Біздің бағдарлама әдіс қалай жұмыс істейтіні үшін бірнеше опцияны талап ететін жағдайлар бар. Неге біз өз жасанды интеллектімізді жасамаймыз? Amazon-да Alexa бар, Яндекс-те Алиса бар, сондықтан біз неге нашар? :) Темір адам туралы фильмде Тони Старк өзінің көрнекті жасанды интеллектін жасады - ДЖАРВИС Керемет кейіпкерге құрмет көрсетіп, оның құрметіне AI-ды атайық :) Біріншіден, біз Джарвиске үйретуіміз керек - бөлмеге кірген адамдармен амандасу (осындай ұлы интеллект әдепсіз болып шықса, бұл таңқаларлық болар еді).
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");
   }
}
Консоль шығысы:

Добрый вечер, Тони Старк, How ваши дела?
Тамаша! Жарвис ішке кірген адаммен қалай амандасуды біледі. Көбінесе, әрине, бұл оның иесі болады - Тони Старк. Бірақ ол жалғыз келмеуі мүмкін! Ал біздің әдіс sayHi()кіріс ретінде бір ғана аргументті қабылдайды. Ал, сәйкесінше, келгендердің біреуіне ғана сәлем беріп, екіншісін елемейді. Өте сыпайы емес, келісесіз бе?:/ Бұл жағдайда мәселені шешу үшін класста аты бірдей, бірақ параметрлері әртүрлі 2 әдісті жазуға болады:
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 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");
   }
}
Консоль шығысы:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Тамаша, екі нұсқа да жұмыс істеді :) Дегенмен, біз мәселені шешпедік! Үш қонақ болса ше? Әрине, біз sayHi()үш қонақтың атын қабылдау үшін әдісті қайта жүктей аламыз. Бірақ олардың 4 немесе 5 болуы мүмкін және т.б. ad infinitum. Джарвиске миллиондаған әдісті шамадан тыс жүктемесіз кез келген атаулармен жұмыс істеуге үйретудің басқа жолы бар ма sayHi()? :/ Әрине бар! Әйтпесе, Java әлемдегі ең танымал бағдарламалау тілі болар ма еді? ;)
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");
   }
}
Параметр ретінде берілген жазба ( String...names) жолдардың белгілі бір саны әдіске жіберілгенін көрсетуге мүмкіндік береді. Біз олардың қанша болуы керектігін алдын ала көрсетпейміз, сондықтан біздің әдістің жұмысы енді әлдеқайда икемді болады:
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");
   }
}
Консоль шығысы:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Әдістің ішінде біз барлық аргументтерді айналдырып, консольге атаулары бар дайын фразаларды шығарамыз. Мұнда біз жеңілдетілген циклды қолданамыз for-each(сіз оны кездестірдіңіз). Бұл өте жақсы, өйткені жазу String...namesшын мәнінде барлық берілген параметрлерді компилятор массивке енгізетінін білдіреді. Сондықтан namesайнымалымен массив сияқты жұмыс істей аласыз, оның ішінде циклді қоса аласыз. Сонымен қатар, ол кез келген тасымалданатын желілер үшін жұмыс істейді! Екі, он, тіпті мың - әдіс қонақтардың кез келген санымен сенімді жұмыс істейді. Барлық ықтимал опциялар үшін шамадан тыс жүктеме жасаудан әлдеқайда ыңғайлы, келісесіз бе? :) Әдісті шамадан тыс жүктеудің тағы бір мысалын келтірейік. Джарвиске әдісті қосайық printInfoFromDatabase(). Ол дерекқордан консольге адам туралы ақпаратты басып шығарады. Егер дерекқор адамның суперқаһарман немесе супер зұлым екенін көрсетсе, бұл ақпарат экранда да көрсетіледі:
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, "Магнето");
   }
}
Қорытынды:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Біздің әдіс оған енгізілген деректерге байланысты осылай жұмыс істейді. Тағы бір маңызды сәт:Аргументтердің реті маңызды! Біздің әдіс кіріс ретінде жолды және санды алады делік:
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!
   }
}
sayYourAge()Класс әдісі кіріс ретінде жолды және санды қабылдаса Man, онда бұл оларды бағдарламада беру керек реттілік! Егер біз оларды басқа ретпен өткізсек, компилятор қате жібереді және адам өзінің жасын айта алмайды. Айтпақшы, біз өткен дәрісте қарастырған конструкторлар да әдістер! Олар сондай-ақ шамадан тыс жүктелуі мүмкін (әр түрлі аргументтер жиыны бар бірнеше конструкторларды жасаңыз) және олар үшін дәлелдерді беру тәртібі де принципті түрде маңызды. Нақты әдістер! :)

Ұқсас параметрлері бар әдістерді қалай шақыруға болады

Өздеріңіз білетіндей, Java тілінде null сияқты сөз бар. Онымен жұмыс істеу кезінде null нысан да, деректер түрі де емес екенін түсіну өте маңызды. Елестетіп көріңізші, бізде адам класы және introduce()адамның аты мен жасын жариялайтын әдіс бар. Бұл жағдайда жас мәтін түрінде берілуі мүмкін немесе оны сан түрінде көрсетуге болады.
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);
   }
}
Біз шамадан тыс жүктеумен бұрыннан таныспыз, сондықтан әдіс екі уақытта да күткендей жұмыс істейтінін білеміз:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Бірақ жол немесе сан емес, екінші параметр ретінде null мәнін берсек не болады?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Біз құрастыру қатесін аламыз! «Анықсыз әдісті шақыру» қатесі «анық емес әдісті шақыру» деп аударылады. Неліктен бұл пайда болуы мүмкін және «анықтамалық» дегеніміз не? Бұл шын мәнінде қарапайым. Мәселе мынада, бізде әдістің екі нұсқасы бар: бар Stringжәне Integerекінші аргумент ретінде. Бірақ екеуі де Stringнөл Integerболуы мүмкін! Екі түр үшін де (олар сілтеме түрлері болғандықтан) null әдепкі мән болып табылады. Сондықтан бұл жағдайда компилятор әдістің қай нұсқасын шақыру керектігін анықтай алмайды. Бұл мәселені шешу өте қарапайым. Мәселе мынада, нөлді нақты сілтеме түріне түрлендіруге болады. Сондықтан, әдісті шақырған кезде, жақшаның ішінде екінші аргумент үшін қажет деректер түрін көрсетуге болады! Компилятор сіздің «кеңестеріңізді» түсінеді және қажетті әдісті шақырады:
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);
   }
}
Қорытынды:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Бірақ егер сандық параметр intсілтеме түрінің нысаны емес, қарабайыр болса Integer, мұндай қате орын алмас еді.
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);
   }
}
Неге екенін болжай алдыңыз ба? Егер сіз оны тапсаңыз, жарайсыз :) Өйткені примитивтер нөлге тең бола алмайды. Енді компиляторда әдісті шақырудың бір ғана мүмкіндігі бар introduce()- екі жолмен. Дәл әдістің осы нұсқасы әдіс шақырылған сайын өңделетін болады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION