JavaRush /Java Blog /Random-TK /Usullar, olaryň parametrleri, özara täsir we artykmaç ýük...

Usullar, olaryň parametrleri, özara täsir we artykmaç ýüklemek

Toparda çap edildi
Againene-de salam! Iň soňky leksiýada synplar we konstruktorlar bilen tanyşdyk we özümizi nädip döretmelidigini öwrendik. Usullar, olaryň parametrleri, özara täsir we artykmaç ýüklemek - 1Bu gün usullar ýaly sapaklaryň aýrylmaz bölegine has içgin serederis. Usul, bir programmada käbir amallary ýerine ýetirmäge mümkinçilik berýän buýruklar toplumydyr. Başgaça aýdylanda, usul bir funksiýa; synpyňyzyň edip biljek zady. Beýleki programmirleme dillerinde usullara köplenç “funksiýalar” diýilýär, ýöne Java-da “usul” sözi has meşhur boldy :) Soňky leksiýada, ýadyňyzda bolsa, pişiklerimiziň ösmegi üçin Pişik synpy üçin ýönekeý usullary döretdik. we bökmek:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();
    }
}
sayMeow()we jump()synpymyzyň usullarydyr. Işleriniň netijesi konsolyň çykyşy:
Мяу!
Прыг-скок!
Usullarymyz gaty ýönekeý: olar diňe konsola tekst çap edýärler. Javaöne Java-da usullaryň esasy meselesi bar - obýektiň maglumatlary boýunça hereket etmeli . Obýektiň maglumatlarynyň bahasyny üýtgediň, üýtgediň, konsola çykaryň ýa-da başga bir zat ediň. Häzirki usullarymyz obýektiň maglumatlary bilen hiç zat edenok Cat. Has düşnükli bir meselä seredeliň:
public class Truck {

    int length;
    int width;
    int height;
    int weight;

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
Mysal üçin, ýük awtoulagyny aňladýan synpymyz bar - Truck. Truckük awtoulag tirkeginiň uzynlygy, ini we beýikligi we agramy bar (bu soňrak zerur bolar). Usulda getVolume()hasaplamalary ýerine ýetirýäris - obýektimiziň maglumatlaryny göwrümi görkezýän sana öwürýäris (uzynlygy, ini we beýikligi köpeldýäris). Bu usulyň netijesi boljak san. Üns beriň - ýazylan usulyň beýanynda public int getVolume. Bu, bu usulyň netijesiniň görnüşdäki san bolmalydygyny aňladýarint . Usulyň netijesini hasapladyk, indi bolsa usuly diýýän programmamyza gaýtarmalydyrys . Java-da usulyň netijesini yzyna gaýtarmak üçin açar söz ulanylýar return.
return volume;

Usul parametrleri

Usullar "usul parametrleri" diýilýän bahalary giriş hökmünde kabul edip biler. getVolume()Synpdaky häzirki usulymyz Truckhiç hili parametrleri kabul etmeýär, geliň, mysaly ýük awtoulaglary bilen giňeltmäge synanyşalyň. Täze synp döredeliň - BridgeOfficer. Bir polisiýa işgäri köprüde nobatçy bolup, ýükleriniň rugsat edilýän agyrlyk çäginden geçmezligi üçin geçip barýan ähli ýük awtoulaglaryny barlaýar.
public class BridgeOfficer {

    int maxWeight;

    public BridgeOfficer(int normalWeight) {
        this.maxWeight = normalWeight;
    }

    public boolean checkTruck(Truck truck) {
        if (truck.weight > maxWeight) {
            return false;
        } else {
            return true;
        }
    }
}
Usul checkTruckgiriş hökmünde bir parametr alýar - ýük awtoulagynyň obýekti Truckwe ofiseriň ýük awtoulagynyň köprä geçmegine rugsat berjekdigini ýa-da ýokdugyny kesgitleýär. Usulyň içindäki logika gaty ýönekeý: ýük awtoulagynyň agramy rugsat edilýän iň ýokary derejeden ýokary bolsa, usul gaýdyp gelýär false. Başga bir ýol gözlemeli bolarsyňyz :( Agramy iň ýokarydan az bolsa ýa-da deň bolsa, geçip bilersiňiz we usul gaýdyp gelýär true. Eger-de "gaýdyp", "usul" sözlemlerine doly düşünmeseňiz "- geliň, programmirlemekden dynç alalyň we hakyky dünýä durmuşyndan ýönekeý bir mysal ulanyp seredeliň :) Aýdaly, kesel bolduňyz we birnäçe günläp işlemediňiz. Hasap bölümine tölemeli hassa rugsadyňyz bilen gelýärsiňiz. Usullar bilen meňzeşlik çeksek, buhgalteriň usuly bar paySickLeave()(“kesel rugsady tölemek”). Kesel rugsady şahadatnamasyny parametr hökmünde bu usula geçirýärsiňiz (onsuz bu usul işlemez we size hiç zat tölenmez!). Iş sahypasynyň usulynda zerur hasaplamalar edilýär (buhgalter ony kompaniýanyň näçeräk tölemelidigini hasaplamak üçin ulanýar) we işiň netijesi size - puluň mukdaryna gaýtarylýar. Programma hem edil şonuň ýaly işleýär. Usuly çagyrýar, maglumatlary şol ýerde geçirýär we netijede netijäni alýar. main()Ine, programmamyzyň usuly BridgeOfficer:
public static void main(String[] args) {
    Truck first = new Truck();
    first.weight = 10000;
    Truck second = new Truck();
    second.weight = 20000;

    BridgeOfficer officer = new BridgeOfficer(15000);
    System.out.println("Truck number 1! May I pass, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck number 2! May I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
10,000 we 20,000 ýükli iki sany ýük awtoulagyny döredýäris. Şol bir wagtyň özünde ofiseriň işleýän köprüsiniň iň ýokary agramy 15 000 bolýar. Usul diýilýän programma, usul officer.checkTruck(first)hemme zady hasaplady we netijäni programma yzyna gaýtardy - truewe programma ony üýtgeýjide saklady boolean canFirstTruckGo. Indi ol islän zadyny edip biler (buhgalterden alan puluňyz ýaly). Ahyrynda kod
boolean canFirstTruckGo = officer.checkTruck(first);
aşak düşýär
boolean canFirstTruckGo = true;
Örän möhüm bir zat: operator returndiňe bir usulyň netijesini yzyna gaýtarman, işini bes edýär ! Yza gaýdyp gelenden soň ýazylan ähli kod ýerine ýetirilmez!
public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, overweight!");
    } else {
        return true;
        System.out.println("Alright, move on!");
    }
}
Ofiseriň aýdýan sözleri konsola çykmaz, sebäbi usul eýýäm bir netijäni berdi we işini tamamlady! Programma usulyň çagyrylan ýerine gaýdyp geldi. Bu barada özüňiz alada etmeli däl - Java düzüjisi soň kod ýazjak bolsaňyz ýalňyşlyk goýberjek derejede akylly return.

Öwez alanlar: Görnüşler söweşi

Programmamyzyň usulyň işlemegi üçin birnäçe wariant talap edýän ýagdaýlar bar. Näme üçin öz emeli intellektimizi döretmeýäris? “Amazon” -da “Alexa”, “Yandex” -iň Elisasy bar, näme üçin biz has erbet? :) Demir adam baradaky filmde Toni Stark özüniň ajaýyp emeli intellektini döretdi - JARVIS Geliň, ajaýyp keşbe hormat goýalyň we AI-ni onuň hormatyna goýalyň :) The visarwisi öwretmeli ilkinji zat - otaga girýänlere salam bermek (şeýle beýik akyl edepsiz bolsa geň bolardy).
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");
    }
}
Konsol çykyşy:
Добрый вечер, Тони Старк, How ваши дела?
Gowy! Visarwis giren birine nädip salam bermelidigini bilýär. Elbetde, köplenç onuň eýesi - Toni Stark bolar. Heöne ol ýeke gelip bilmez! Usulymyz sayHi()giriş hökmünde diňe bir argument alýar. Şoňa görä-de, gelenleriň diňe birine salam berip biler, beýlekisini äsgermezlik eder. Gaty sypaýy däl, şeýlemi? : / Bu ýagdaýda meseläni çözmek üçin synpda diňe bir at bilen, ýöne dürli parametrler bilen 2 usul ýazyp bileris:
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?");
    }
}
Bu usuldan artykmaç ýüklemek diýilýär . Artykmaç ýüklemek programmamyza has çeýe we dürli iş wariantlaryny ýerleşdirmäge mümkinçilik berýär. Onuň nähili işleýändigini barlap göreliň:
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");
    }
}
Konsol çykyşy:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Gowy, iki wariantam işledi :) Şeýle-de bolsa, meseläni çözmedik! Üç myhman bar bolsa näme etmeli? Elbetde, sayHi()üç myhmanyň adyny kabul etmek üçin usuly täzeden ýükläp bileris. Themöne olardan 4 ýa-da 5 bolup biler we mahabat infinitumda. Visarwisi million usuldan artykmaç ýüklemezden, islendik at bilen işlemegi öwretmegiň başga bir usuly barmy sayHi()? : / Elbetde bar! Otherwiseogsam, Java dünýäde iň meşhur programmirleme dili bolarmy? ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }
}
Parametr hökmünde geçirilen ýazgy String...namesbize belli bir setiriň usula geçendigini görkezmäge mümkinçilik berýär. Näçe bolmalydygyny öňünden kesgitlemeýäris, şonuň üçin usulymyzyň işleýşi indi has çeýe bolýar:
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");
    }
}
Konsol çykyşy:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Капитан Америка, How ваши дела?
Добрый вечер, Черная Вдова, How ваши дела?
Добрый вечер, Халк, How ваши дела?
Bu ýerdäki kodlaryň käbiri size tanyş däl, ýöne muňa garşy çykmaň. Onuň manysy ýönekeý - usul öz gezeginde ähli atlardan geçýär we myhmanlaryň hersine salam berýär! Mundan başga-da, islendik göçürilen setirler üçin işlär! Iki, on, hatda müň - bu usul islendik myhman bilen ygtybarly işlär. Possiblehli mümkin bolan wariantlar üçin artykmaç ýüklemekden has amatly, şeýlemi? :) Anotherene bir möhüm nokat: argumentleriň tertibi möhümdir! Usulymyz giriş hökmünde bir setir we san alýar diýeliň:
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!
    }
}
Eger sayYourAgesynp usuly Mangiriş hökmünde bir setir we san alsa, bu programmada berilmeli tertip! Olary başga tertipde geçirsek, düzüji ýalňyşlyk goýberer we adam ýaşyny aýdyp bilmez. Theeri gelende aýtsak, soňky leksiýada açan konstruktorlarymyz hem usullardyr! Şeýle hem olara aşa ýüklenip bilner (dürli argumentli birnäçe konstruktor dörediň) we olar üçin argumentleriň tertibi hem möhümdir. Hakyky usullar! :)

Againene-de parametrler barada

Hawa, hawa, entek olar bilen gutarmadyk :) Indi seredjek mowzugymyz gaty möhümdir. Geljekki söhbetdeşlikleriňizde bu hakda sorajaklarynyň 90% mümkinçiligi bar! Parametrleri usullara geçirmek barada gürleşeris. Simpleönekeý bir meselä seredeliň:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        currentYear = currentYear-10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year now?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And now?");
        System.out.println(currentYear);
    }
}
Wagt maşynynyň iki usuly bar. Bularyň ikisi hem şu ýyly görkezýän san hökmünde kabul edýär ýa-da gymmaty ýokarlandyrýar ýa-da azalýar (wagtyňyza ýa-da geljege gaýdyp gelmek isleýändigimize baglylykda). Emma, ​​konsolyň çykyşyndan görnüşi ýaly, usul işlemedi! Konsol çykyşy:
Какой сейчас год?
2020
А сейчас?
2020
currentYearUsula üýtgeýjini geçirdik goToPast(), ýöne onuň gymmaty üýtgemedi. 2020-nji ýylda bolşy ýaly, şeýle bolmagynda galýar. Emma näme üçin? : / Sebäbi Java-daky primitiwler bahalara görä usullara geçirilýär. Bu näme many berýär? Usuly çagyryp goToPast(), üýtgeýjimizi şol ýerden geçirenimizde int currentYear = 2020, usula girýän üýtgeýjiniň özi däl currentYear-de, onuň göçürmesi . Elbetde, bu göçürmäniň gymmaty 2020-nji ýyla deňdir, ýöne göçürmede bolup geçýän ähli üýtgeşmeler asyl üýtgeýjimize hiç hili täsir etmeýärcurrentYear ! Geliň, kodumyzy has manyly edeliň we nämeleriň bolýandygyny göreliň currentYear:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        System.out.println("The goToPast method has started!");
        System.out.println("The currentYear value inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("The currentYear value inside the goToPast method (at the end) = " + currentYear);
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year at the very beginning of the program?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("What year is it now?");
        System.out.println(currentYear);
    }
}
Konsol çykyşy:
Какой год в самом начале работы программы?
2020
Метод goToPast начал работу!
Значение currentYear внутри метода goToPast (в начале) = 2020
Значение currentYear внутри метода goToPast (в конце) = 2010
А сейчас Howой год?
2020
Bu usula geçen üýtgeýjiniň goToPast()diňe bir nusgasydygyny aýdyň görkezýär currentYear. Göçürmäni üýtgetmek “asyl” manysyna täsir etmedi. " Salgydan geçmek " düýbünden ters many berýär. Pişikler bilen meşgullanalyň! Diýjek bolýanym, geliň, baglanyşykdan geçip, pişikleri mysal hökmünde ulanmagyň nämä meňzeýändigini göreliň :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
Indi wagt maşynymyzyň kömegi bilen dünýäde ilkinji pişik syýahatçysy Barsik geçmişe we geljege çykarys! TimeMachineMaşynyň obýektler bilen işlemegi üçin synpy üýtgedeliň Cat;
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
Usullar indi diňe geçen san däl, agebelli bir obýektiň meýdanyny üýtgedýär Cat. Ilkinjiler meselesinde ýadyňyzda bolsa, biz üstünlik gazanyp bilmedik: asyl sany üýtgemedi. Geliň, bu ýerde näme bolýandygyny göreliň!
public static void main(String[] args) {

    TimeMachine timeMachine = new TimeMachine();
    Cat barsik = new Cat(5);

    System.out.println("How old is Barsik at the very beginning of the program?");
    System.out.println(barsik.age);

    timeMachine.goToFuture(barsik);
    System.out.println("And now?");
    System.out.println(barsik.age);

    System.out.println("Firs-sticks! Barsik has aged 10 years! Drive back quickly!");
    timeMachine.goToPast(barsik);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(barsik.age);
}
Konsol çykyşy:
Сколько лет Барсику в самом начале работы программы?
5
А теперь?
15
Елки-палки! Барсик постарел на 10 лет! Живо гони назад!
Получилось? Мы вернули коту его изначальный возраст?
5
Wah! Indi usul başgaça işledi: pişigimiz birden garrady, soň ýene ýaş görünýärdi! :) Geliň, sebäbini anyklamaga synanyşalyň. Ilkinjiler bilen mysaldan tapawutlylykda, obýektler meselesinde obýekte salgylanma usulyna geçirilýär. Usullara asyl obýektimize salgylanma goToFuture(barsik)berildi . Şonuň üçin içerki usullary üýtgedenimizde , obýektimiziň saklanýan ýadyna girýäris. Bu, başda döreden şol Barsik bilen baglanyşyk. Muňa "salgylanma bilen geçmek" diýilýär! Şeýle-de bolsa, bu baglanyşyklar bilen hemme zat beýle bir ýönekeý däl :) Geliň, mysalymyzy üýtgetmäge synanyşalyň: goToPast(barsik)barsikbarsik.age
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat = new Cat(cat.age);
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat = new Cat(cat.age);
        cat.age -= 10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        Cat barsik = new Cat(5);

        System.out.println("How old is Barsik at the very beginning of the program?");
        System.out.println(barsik.age);

        timeMachine.goToFuture(barsik);
        System.out.println("Barsik went to the future! Has his age changed?");
        System.out.println(barsik.age);

        System.out.println("And if you try in the past?");
        timeMachine.goToPast(barsik);
        System.out.println(barsik.age);
    }
}
Konsol çykyşy:
Сколько лет Барсику в самом начале работы программы?
5
Барсик отправился в будущее! Его возраст изменился?
5
А если попробовать в прошлое?
5
Againene işlemeýär! O_O Nämäniň bolandygyny anyklalyň :) Bularyň hemmesi baglanyşyklaryň işleýiş usullary goToPast/ goToFuturemehanikasy hakda. Indi üns beriň!Bu nokat baglanyşyklaryň we usullaryň işleýşine düşünmekde iň möhümdir . Aslynda, bir usul diýlende, goToFuture(Cat cat)obýekt salgylanmanyň özi däl-de cat, eýsem bu salgylanmanyň göçürmesi. .Agny, bir obýekti bir usula geçirenimizde, bu obýekte iki salgylanma bolýar . Bolýan zatlara düşünmek üçin bu örän möhümdir. Galyberse-de, iň soňky mysalymyz pişigiň ýaşyny üýtgetmedi. Öňki mysalda ýaşy üýtgetmek bilen, usulyň içinde geçen salgylanmany aldyk goToFuture(), obýekti ýatda sakladyk we ýaşyny üýtgetdik ( cat.age += 10). Indi usulyň içinde goToFuture()täze bir obýekt döredýäris
(cat = new Cat(cat.age)),
we usula geçen şol bir göçürme baglanyşygy bu obýekt berilýär. Netijede:
  • Ilkinji baglanyşyk ( Cat barsik = new Cat(5)) asyl pişigi görkezýär (5 ýaş bilen)
  • Üýtgeýjini catusula geçirip goToPast(Cat cat), ony täze obýekte bellänimizden soň, salgylanma göçürildi.
Ondan soň iň soňky ýagdaýymyz bar: iki baglanyşyk iki dürli jisimi görkezýär. Themöne olaryň diňe biriniň - usulyň içinde döreden ýaşymyzy üýtgetdik.
cat.age += 10;
main()Elbetde, usulda konsola çykanymyzda barsik.age, ýaşynyň üýtgemändigini görýäris. Galyberse-de barsik, bu henizem 5 ýaşyndaky köne, asyl obýekti görkezýän, hiç zat bolmadyk salgylanma üýtgeýjisidir. Ageaş bilen ähli manipulýasiýalarymyz täze bir obýektde ýerine ýetirildi. Şeýlelik bilen, obýektleriň salgylanma arkaly usullara geçirilendigi ýüze çykýar . Obýektleriň göçürmeleri hiç haçan awtomatiki usulda döredilmeýär. Pişik obýektini bir usula geçirip, ýaşyny üýtgeden bolsaňyz, üstünlikli üýtgär. Referenceöne salgylanma üýtgeýjileriniň bahalary bellemek we / ýa-da jaň etmek usullary göçürilende ! Geliň, bu ýerde primitiwleri geçmek baradaky abzasy gaýtalalyň: “Haçan-da bir usula jaň edip, changeInt()üýtgeýjimizi şol ýere geçirenimizde int x = 15, üýtgeýjiniň özi däl-de x, eýsem onuň nusgasydyr . Galyberse-de, göçürmede bolup geçýän ähli üýtgeşmeler ýok. asyl üýtgeýjimize islendik derejede täsir ediň x. ” Salgylary göçürmek bilen hemme zat birmeňzeş işleýär! Pişigiň obýektini usula geçirýärsiňiz. Pişigiň özi bilen bir zat etseňiz (ýagny ýadyndaky obýekt bilen), ähli üýtgeşmeler üstünlikli geçer - bizde diňe bir obýekt bardy we henizem bar. Aöne bir usulyň içinde täze bir obýekt döredip, usulyň parametri bolan salgylanma üýtgeýjisinde saklasaňyz, mundan beýläk iki obýektimiz we iki sany üýtgeýjimiz bar. Bu hemmesi! Bu beýle aňsat däldi, hatda birnäçe gezek leksiýa etmeli bolmagyňyz mümkin. Theöne esasy zat, bu gaty möhüm mowzugy öwrendiňiz. Java-da argumentleriň nädip geçirilýändigi barada köplenç argumentlere (hatda tejribeli işläp düzüjileriň arasynda) duşarsyňyz. Indi munuň nähili işleýändigini anyk bilýärsiňiz. Dowam et! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION