JavaRush /Java блогу /Random-KY /Кол коюу ыкмасы

Кол коюу ыкмасы

Группада жарыяланган
Салам! Сиз талаалар жана ыкмалар менен өзүңүздүн класстарыңызды түзүп алгансыз. Бүгүн биз ыкмалары жөнүндө майда-чүйдөсүнө чейин сүйлөшөбүз. Биз, албетте, лекцияларыбызда муну бир нече жолу жасаганбыз, бирок биз негизинен жалпы пункттар женунде айттык. Бүгүн биз сөзмө-сөз "бөлүк-бөлүктөр" ыкмаларын талдап чыгабыз - биз алар эмнеден тураарын, аларды түзүүнүн кандай варианттары бар экенин жана мунун баарын кантип башкарууга болорун билебиз :) Кеттик!Кол коюу ыкмасы - 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, сиз көрүп тургандай, класста оңой жеткorктүү Main. Бул модификатордун аркасында мүмкүн public. Javaда башка модификаторлор бар жана алардын баары башка класстын ичинде методду колдонууга мүмкүндүк бербейт. Алар жөнүндө башка лекцияларда сөз кылабыз. Эң негизгиси, модификатор эмне үчүн жооптуу экенин эстен чыгарбоо керек: методдун башка класстарда болушу/жеткorксиздиги :)

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

Методдордун бири Dog, тактап айтканда, main()ачкыч сөз менен көрсөтүлөт static. Эгер ал бар болсо, анда ал кирүү модификаторунан кийин көрсөтүлүшү керек. Мурунку лекцияларда статикалык класс өзгөрмөлөрү жөнүндө сүйлөшкөнүбүз эсиңиздеби? Методдорго карата колдонулганда бул сөз болжол менен бирдей мааниге ээ. Эгерде метод катары көрсөтүлсө static, бул аны белгилүү бир класс an objectисине шилтеме кылбастан колдонсо болот дегенди билдирет. main()Чынында эле, класста статикалык методду иштетүү үчүн Dogинстанцияны түзүүнүн кереги жок Dog; ал ансыз иштейт. Эгерде бул ыкма статикалык болбосо, анда аны колдонуу үчүн биз алгач an objectти түзүшүбүз керек.

3. Кайтаруу мааниси.

Биздин ыкма бир нерсени кайтарып бериши керек болсо, анда биз кайтаруу маанисинин түрүн көрсөтөбүз. Муну алуучунун мисалынан көрүүгө болот getName():
public String getName() {
   return name;
}
Ал түрдөгү an objectти кайтарат String. Эгерде метод эч нерсе кайтарбаса, voidметоддогудай type ордуна ачкыч сөз көрсөтүлөт woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Ошол эле аталыштагы ыкмалар

Биздин программа методдун иштешинин бир нече варианттарын талап кылган жагдайлар бар. Эмне үчүн биз өзүбүздүн жасалма интеллектибизди түзбөйбүз? Амазонкада 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и болушу мүмкүн. Жарвисти миллиондогон ашыкча жүктөөсүз, каалаган сандагы аттар менен иштөөгө үйрөтүүнүн дагы бир жолу барбы sayHi()? :/ Албетте бар! Болбосо, Java дүйнөдөгү эң популярдуу программалоо тor болмок беле? ;)
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 тorнде null деген сөз бар. Аны менен иштөөдө null an object же маалымат түрү эмес экенин түшүнүү абдан маанилүү. Элестеткиле, бизде класстык Адам жана introduce()адамдын атын жана жашын жарыялаган ыкма бар. Мында жаш текст түрүндө берorши мүмкүн, же ал сан түрүндө берorши мүмкүн.
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 демейки маани болуп саналат. Мына ошондуктан бул кырдаалда компилятор методдун кайсы versionсын чакырышы керектигин аныктай алbyte. Бул маселени чечүү абдан жөнөкөй. Кеп нөлдү ачык түрдө белгилүү бир шилтеме түрүнө айландырса болот. Ошондуктан, ыкманы чакырганда, сиз кашаанын ичинде экинчи аргумент үчүн керектүү маалымат түрүн көрсөтө аласыз! Компилятор сиздин "ишаарыңызды" түшүнөт жана талап кылынган ыкманы чакырат:
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шилтеме түрүндөгү an object эмес, примитив болсо 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);
   }
}
Эмне үчүн деп ойлодуңуз беле? Эгер сиз аны болжолдсоңуз, молодец :) Анткени примитивдер нөлгө барабар боло алbyte. Эми компилятордо методду чакыруу үчүн бир гана вариант бар introduce()- эки сап менен. Бул ыкманын ушул versionсы, ал ар бир жолу чакырылган сайын иштетилет.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION