JavaRush /Blog Jawa /Random-JV /Metode, paramèter, interaksi lan overloading

Metode, paramèter, interaksi lan overloading

Diterbitake ing grup
Halo maneh! Ing kuliah pungkasan, kita kenal karo kelas lan konstruktor, lan sinau carane nggawe dhewe. Metode, paramèter, interaksi lan overloading - 1Dina iki kita bakal nliti bagean integral saka kelas minangka metode. Cara minangka sakumpulan perintah sing ngidini sampeyan nindakake sawetara operasi ing program. Ing tembung liya, metode minangka fungsi; soko kelas sampeyan bisa nindakake. Ing basa pemrograman liyane, metode asring diarani "fungsi", nanging ing basa Jawa tembung "metode" dadi luwih populer :) Ing kuliah pungkasan, yen sampeyan kelingan, kita nggawe metode sing gampang kanggo kelas Kucing supaya kucing kita bisa ngeong. lan mlumpat:
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()lan jump()minangka metode kelas kita. Asil karyane yaiku output menyang konsol:
Мяу!
Прыг-скок!
Cara kita cukup prasaja: mung nyithak teks menyang konsol. Nanging ing Jawa, metode duwe tugas utama - kudu nindakake tumindak ing data obyek . Ngganti nilai data obyek, ngowahi, output menyang console, utawa nindakake liyane. Cara kita saiki ora nindakake apa-apa karo data obyek Cat. Ayo goleki conto sing luwih jelas:
public class Truck {

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

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
Contone, kita duwe kelas sing makili truk - Truck. Trailer truk nduweni dawa, jembar lan dhuwur, lan bobote (bakal dibutuhake mengko). Ing cara, getVolume()kita nindakake petungan - ngowahi data obyek kita menyang nomer sing nuduhake volume (kita multiply dawa, jembaré lan dhuwur). Iki nomer sing bakal dadi asil saka cara. Wigati dimangerteni - ing katrangan cara kasebut ditulis public int getVolume. Iki tegese asil saka cara iki kudu nomer ing wangun int. Kita wis ngetung asil metode kasebut, lan saiki kudu bali menyang program sing diarani metode kasebut. Kanggo ngasilake asil saka cara ing Jawa, tembung kunci digunakake return.
return volume;

Parameter metode

Metode bisa nampa nilai minangka input, sing diarani "parameter metode". Cara saiki getVolume()ing kelas Truckora nampa paramèter, mula ayo nyoba nggedhekake conto nganggo truk. Ayo nggawe kelas anyar - BridgeOfficer. Petugas polisi tugas ing jembatan lan mriksa kabeh truk sing liwat kanggo mesthekake yen muatane ora ngluwihi watesan bobot sing diidini.
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;
        }
    }
}
Cara kasebut checkTrucknjupuk siji parameter minangka input - obyek truk Truck, lan nemtokake manawa petugas bakal ngidini truk kasebut mlebu ing jembatan utawa ora. Logika ing cara iki cukup prasaja: yen bobot truk ngluwihi maksimum sing diidini, cara kasebut bali false. Sampeyan kudu golek dalan liyane :( Yen bobote kurang saka utawa padha karo maksimal, sampeyan bisa ngliwati, lan cara kasebut bali true. Yen sampeyan isih ora ngerti kanthi lengkap frasa "bali", "metode ngasilake nilai ” - ayo ngaso saka program lan deleng iki nggunakake conto sing prasaja saka urip ing donya nyata :) Ayo dadi lara lan ora kerja nganti pirang-pirang dina. Sampeyan teka ing departemen akuntansi kanthi cuti lara, sing kudu sampeyan bayar. Yen kita nggambar analogi karo metode, akuntan duwe metode paySickLeave()("bayar cuti sakit"). Sampeyan ngliwati sertifikat cuti lara kanggo metode iki minangka parameter (tanpa metode kasebut ora bakal bisa digunakake lan sampeyan ora bakal dibayar apa-apa!). Ing metode lembar kerja, kalkulasi sing perlu ditindakake (akuntan nggunakake kanggo ngitung pinten perusahaan kudu mbayar sampeyan), lan asil karya bali menyang sampeyan - jumlah dhuwit. Program kasebut kanthi cara sing padha. Iku nelpon cara, liwat data ana, lan pungkasanipun nampa asil. Punika cara main()kanggo program kita 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);
}
Kita nggawe rong truk kanthi muatan 10.000 lan 20.000. Ing wektu sing padha, bobot maksimal kanggo jembatan ing ngendi petugas kasebut tugas yaiku 15.000. Program kasebut diarani metode officer.checkTruck(first), metode ngitung kabeh lan ngasilake asil menyang program - true, lan program disimpen ing variabel boolean canFirstTruckGo. Saiki dheweke bisa nindakake apa wae sing dikarepake (kaya sampeyan karo dhuwit sing ditampa saka akuntan). Pungkasane kode
boolean canFirstTruckGo = officer.checkTruck(first);
rawuh mudhun kanggo
boolean canFirstTruckGo = true;
Titik penting banget: operator returnora mung ngasilake asil saka metode kasebut, nanging uga mungkasi karyane ! Kabeh kode sing ditulis sawise bali ora bakal dieksekusi!
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!");
    }
}
Frasa sing diomongake pejabat kasebut ora bakal dikirim menyang konsol, amarga cara kasebut wis ngasilake asil lan ngrampungake pakaryane! Program kasebut bali menyang titik ing ngendi metode kasebut diarani. Sampeyan ora kudu padha sumelang ing bab iki dhewe - compiler Jawa cukup pinter uncalan kesalahan yen nyoba kanggo nulis kode sawise return.

Avengers: Perang Pilihan

Ana kahanan nalika program kita mbutuhake sawetara opsi kanggo cara kerjane. Napa kita ora nggawe intelijen buatan dhewe? Amazon duwe Alexa, Yandex duwe Alice, dadi kenapa kita luwih elek? :) Ing film babagan Iron Man, Tony Stark nggawe intelijen buatan dhewe sing luar biasa - JARVIS Ayo menehi penghormatan marang karakter sing apik banget lan jenenge AI kita kanggo ngurmati :) sepisanan kita kudu mulang Jarvis - menehi salam marang wong-wong sing mlebu ing kamar (bakal aneh yen kapinteran gedhe kasebut dadi ora sopan).
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");
    }
}
Output konsol:
Добрый вечер, Тони Старк, How ваши дела?
apik tenan! Jarvis ngerti carane menehi salam marang wong sing mlebu. Paling asring, mesthi, bakal dadi pemilik - Tony Stark. Nanging dheweke bisa uga ora teka dhewe! Lan cara kita sayHi()njupuk mung siji argumen minangka input. Lan, miturut, kang bakal bisa kanggo salam mung siji saka wong-wong sing teka, lan bakal nglirwakake liyane. Ora sopan banget, setuju? : / Ing kasus iki, kanggo ngatasi masalah, kita mung bisa nulis 2 metode ing kelas kanthi jeneng sing padha, nanging kanthi paramèter sing beda:
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?");
    }
}
Iki diarani metode overloading . Overloading ngidini program kita dadi luwih fleksibel lan nampung macem-macem opsi kerja. Ayo dipriksa cara kerjane:
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");
    }
}
Output konsol:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Great, loro opsi makarya :) Nanging, kita ora ngatasi masalah! Apa yen ana tamu telu? Mesthi, kita bisa overload cara maneh sayHi()kanggo nampa jeneng saka telung tamu. Nanging bisa uga ana 4 utawa 5. Lan sabanjure ad infinitum. Apa ana cara liya kanggo ngajari Jarvis nggarap sawetara jeneng, tanpa kakehan cara yuta sayHi()? :/ Mesthi wis! Yen ora, apa Jawa bakal dadi basa pamrograman sing paling populer ing donya? ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }
}
Cathetan ( String...names) liwati minangka parameter ngidini kita nuduhake yen sawetara strings diterusake menyang metode kasebut. Kita ora nemtokake sadurunge jumlah sing kudu ana, mula operasi metode saiki dadi luwih fleksibel:
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");
    }
}
Output konsol:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Капитан Америка, How ваши дела?
Добрый вечер, Черная Вдова, How ваши дела?
Добрый вечер, Халк, How ваши дела?
Sawetara kode ing kene ora pati ngerti, nanging aja dipikirake. Intine prasaja - cara kasebut ngliwati kabeh jeneng lan menehi salam marang saben tamu! Kajaba iku, bakal bisa digunakake kanggo nomer garis sing ditransfer! Loro, sepuluh, malah sewu - cara bakal bisa dipercaya karo nomer tamu. Luwih trep tinimbang nindakake kakehan kanggo kabeh opsi sing bisa ditindakake, apa sampeyan ora setuju? :) Titik penting liyane: urutan argumen penting! Dadi cara kita njupuk senar lan nomer minangka 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!
    }
}
Yen cara sayYourAgekelas Mannjupuk senar lan nomer minangka input, banjur iki urutan kang kudu liwati ing program! Yen kita pass ing urutan beda, compiler bakal uncalan kesalahan lan wong ora bisa ngomong umur. Miturut cara, konstruktor sing kita bahas ing kuliah pungkasan uga cara! Padha uga bisa overloaded (nggawe sawetara konstruktor karo set beda bantahan) lan kanggo wong-wong mau urutan maringaken bantahan uga dhasar penting. Cara nyata! :)

Lan maneh babagan paramèter

Ya, ya, kita durung rampung karo dheweke :) Topik sing bakal kita nimbang saiki penting banget. Ana kemungkinan 90% yen dheweke bakal takon babagan iki ing kabeh wawancara ing mangsa ngarep! Kita bakal pirembagan bab pass paramèter kanggo cara. Ayo katon ing conto prasaja:
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);
    }
}
Mesin wektu duwe rong cara. Loro-lorone njupuk minangka input nomer sing makili taun saiki lan nambah utawa nyuda nilai (gumantung apa kita pengin bali ing wektu utawa ing mangsa ngarep). Nanging, kaya sing bisa dideleng saka output konsol, cara kasebut ora bisa digunakake! Output konsol:
Какой сейчас год?
2020
А сейчас?
2020
Kita ngliwati variabel currentYearmenyang metode kasebut goToPast(), nanging regane ora owah. Kaya ing 2020, tetep kaya ngono. Nanging kenapa? : / Amarga primitif ing Jawa diterusake menyang metode kanthi nilai. Iki artine apa? Nalika kita nelpon cara goToPast()lan pass variabel kita ana int currentYear = 2020, iku ora variabel dhewe sing nemu menyang cara currentYear, nanging salinan saka iku . Nilai salinan iki, mesthi, uga padha karo 2020, nanging kabeh owah-owahan sing kedadeyan ing salinan kasebut ora mengaruhi variabel asli kitacurrentYear ! Ayo nggawe kode kita luwih verbose lan ndeleng apa sing kedadeyan karo 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);
    }
}
Output konsol:
Какой год в самом начале работы программы?
2020
Метод goToPast начал работу!
Значение currentYear внутри метода goToPast (в начале) = 2020
Значение currentYear внутри метода goToPast (в конце) = 2010
А сейчас Howой год?
2020
Iki jelas nuduhake yen variabel sing diterusake menyang metode kasebut goToPast()mung salinan currentYear. Lan ngganti salinan ora ana pengaruh ing makna "asli". " Passing by reference " nduweni teges ngelawan. Ayo latihan ing kucing! Maksudku, ayo ndeleng apa sing liwat link katon nggunakake kucing minangka conto :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
Saiki, kanthi bantuan mesin wektu, kita bakal ngluncurake Barsik, lelungan kucing-wektu pertama ing donya, menyang masa lalu lan masa depan! Ayo ngganti kelas TimeMachinesupaya mesin bisa nggarap obyek Cat;
public class TimeMachine {

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

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
Cara saiki ngganti ora mung nomer liwati, nanging lapangan ageobyek tartamtu Cat. Ing kasus primitif, kaya sing sampeyan eling, kita ora sukses: nomer asli ora owah. Ayo ndeleng apa sing kedadeyan ing kene!
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);
}
Output konsol:
Сколько лет Барсику в самом начале работы программы?
5
А теперь?
15
Елки-палки! Барсик постарел на 10 лет! Живо гони назад!
Получилось? Мы вернули коту его изначальный возраст?
5
wah! Saiki cara kerjane beda: kucing kita dumadakan tuwa, banjur katon luwih enom maneh! :) Coba dipikir kok. Ora kaya conto karo primitif, ing kasus obyek referensi kanggo obyek diterusake menyang metode kasebut. Referensi kanggo obyek asli kita diterusake goToFuture(barsik)menyang metode . Mulane, nalika kita ngganti nang cara , kita ngakses banget memori wilayah ngendi obyek kita disimpen. Iki minangka link menyang Barsik sing padha sing digawe ing wiwitan. Iki diarani "passing by reference"! Nanging, kanthi pranala kasebut, kabeh ora gampang :) Ayo coba ganti conto: 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);
    }
}
Output konsol:
Сколько лет Барсику в самом начале работы программы?
5
Барсик отправился в будущее! Его возраст изменился?
5
А если попробовать в прошлое?
5
Ora bisa maneh! O_O Ayo ngerteni apa sing kedadeyan :) Iku kabeh babagan metode goToPast/ goToFuturelan mekanisme cara kerja link. Saiki manungsa waé!Titik iki sing paling penting kanggo mangerteni carane pranala lan cara bisa digunakake. Nyatane, nalika kita nelpon cara, goToFuture(Cat cat)iku ora referensi obyek dhewe sing liwati kanggo iku cat, nanging salinan referensi iki. Yaiku, nalika kita ngliwati obyek menyang metode, ana rong referensi kanggo obyek iki . Iki penting banget kanggo mangerteni apa sing kedadeyan. Sawise kabeh, iki sebabe conto pungkasan kita ora ngganti umur kucing. Ing conto sadurungé karo ngganti umur, kita mung njupuk referensi liwati nang cara goToFuture(), ketemu obyek ing memori nggunakake lan diganti umur ( cat.age += 10). Saiki ing cara goToFuture()kita nggawe obyek anyar
(cat = new Cat(cat.age)),
lan link salinan padha sing liwati kanggo cara diutus obyek iki. Akibaté:
  • Link pisanan ( Cat barsik = new Cat(5)) nuduhake kucing asli (kanthi umur 5)
  • Sawise kita ngliwati variabel catmenyang metode goToPast(Cat cat)lan ditugasake menyang obyek anyar, referensi kasebut disalin.
Sawise iki, kita duwe kahanan pungkasan: loro pranala nuduhake rong obyek sing beda. Nanging kita ngganti umur mung siji - sing digawe ing metode kasebut.
cat.age += 10;
Lan alamiah, nalika kita output main()menyang console ing cara barsik.age, kita waca sing umur wis ora diganti. Sawise kabeh barsik, iki minangka variabel referensi sing isih nuduhake obyek asli lawas kanthi umur 5, sing ora ana kedadeyan. Kabeh manipulasi kita kanthi umur ditindakake ing obyek anyar. Mangkono, ternyata obyek diterusake menyang metode kanthi referensi. Salinan obyek ora tau digawe kanthi otomatis. Yen sampeyan ngliwati obyek kucing menyang metode lan ngganti umure, iku bakal kasil diganti. Nanging nilai variabel referensi disalin nalika nemtokake lan / utawa cara nelpon! Ayo baleni maneh paragraf babagan passing primitives: "Nalika kita nelpon metode changeInt()lan pass variabel kita ana int x = 15, iku ora variabel dhewe sing nemu menyang metode x, nanging salinan sawijining . Sawise kabeh, kabeh owah-owahan sing kelakon kanggo salinan ora mengaruhi variabel asli kita kanthi cara apa wae x. Kanthi nyalin pranala, kabeh kerjane padha! Sampeyan ngliwati obyek kucing menyang metode kasebut. Yen sampeyan nindakake apa-apa karo kucing dhewe (yaiku obyek ing memori), kabeh owah-owahan bakal sukses - kita mung duwe siji obyek lan isih duwe. Nanging yen ing njero metode sampeyan nggawe obyek anyar lan simpen ing variabel referensi, yaiku parameter metode kasebut, wiwit saiki kita duwe rong obyek lan rong variabel referensi. Iku kabeh! Iku ora gampang, sampeyan bisa uga kudu kuliah kaping pirang-pirang. Nanging sing utama yaiku sampeyan wis sinau topik sing paling penting iki. Sampeyan bakal kerep nemoni argumentasi (sanajan ing antarane pangembang sing berpengalaman) babagan cara argumen diterusake ing Jawa. Saiki sampeyan ngerti persis cara kerjane. Dijogo! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION