CodeGym /Blog Jawa /Acak /Metode ing Jawa
John Squirrels
tingkat
San Francisco

Metode ing Jawa

Diterbitake ing grup
Halo maneh! Ing wulangan pungkasan, kita kenal karo kelas lan konstruktor, lan sinau carane nggawe dhewe. Dina iki kita bakal luwih kenal karo Metode Jawa, sing dadi bagian penting saka kelas. Metode ing Jawa minangka sakumpulan prentah sing ngidini sampeyan nindakake operasi tartamtu ing program. Ing tembung liya, metode minangka fungsi; soko kelas sampeyan bisa nindakake. Ing basa pamrograman liyane, metode asring diarani "fungsi", nanging ing basa Jawa tembung "metode" luwih umum. :) Yen sampeyan ngelingi, ing pawulangan pungkasan kita nggawe cara prasaja kanggo kelas Kucing , supaya kucing kita bisa ngomong meow lan mlumpat:

public class Cat {

    String name;
    int age;

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

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

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

        smudge.sayMeow();
        smudge.jump();
    }
}
sayMeow () lan mlumpat () minangka metode kelas kita. Lan nglakokake metode kasebut ngasilake output konsol ing ngisor iki:
Meow!
Pounce!
Cara kita cukup prasaja: mung ngasilake teks menyang konsol. Nanging ing Jawa, cara duwe tugas penting: padha nindakake tumindak ing data obyek. Dheweke ngganti data obyek, ngowahi, nampilake, lan nindakake perkara liyane. Cara kita saiki ora nindakake apa-apa karo data obyek Cat . Ayo ndeleng conto sing luwih ilustrasi:

public class Truck {

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

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
Contone, ing kene kita duwe kelas sing makili Truk . Truk semi nduweni dawa, jembar, dhuwur, lan bobot (sing bakal dibutuhake mengko). Ing metode getVolume () , kita nindakake petungan, ngowahi data obyek dadi nomer sing makili volume (kita multiply dawa, jembaré, lan dhuwur). Nomer iki bakal dadi asil saka metode kasebut. Elinga yen deklarasi metode kasebut ditulis minangka public int getVolume . Tegese cara iki kudu ngasilake int . Kita ngetung nilai bali metode, lan saiki kudu bali menyang program sing diarani metode kita. Kanggo ngasilake asil metode ing Jawa, kita nggunakake tembung kunci bali. volume bali;

Parameter Metode Jawa

Kita bisa ngliwati nilai sing diarani "argumen" menyang metode nalika nelpon. Pranyatan metode kalebu dhaptar variabel sing ngandhani jinis lan urutan variabel sing bisa ditampa dening metode kasebut. Dhaptar iki diarani "parameter metode". Metode getVolume() kelas Truk saiki ora nemtokake paramèter, mula ayo nyoba nggedhekake conto truk . Gawe kelas anyar sing diarani BridgeOfficer . Iki minangka perwira polisi sing tugas ing jembatan, sing mriksa kabeh truk sing liwat kanggo ndeleng apa bebane ngluwihi 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 checkTruck nampa siji argumen, obyek Truk , lan nemtokake manawa petugas bakal ngidini truk ing jembatan. Ing cara, logika cukup prasaja: yen bobot truk ngluwihi maksimum sing diijini, banjur cara bali palsu . Iku kudu golek dalan liyane :( Yen bobote kurang saka utawa padha karo maksimum, iku bisa liwat, lan cara bali bener. Yen sampeyan durung ngerti frasa "bali" utawa "metode ngasilake nilai", ayo ngaso saka program lan nimbang nggunakake conto prasaja saka urip nyata. :) Ayo ngomong sampeyan lara lan nginep ing omah sawetara dina. Sampeyan menyang departemen akuntansi karo cathetan dhokter, amarga cuti lara kudu dibayar. Yen kita mbandhingake kahanan iki karo cara, akuntan duwe paySickLeave ()cara. Sampeyan ngirim cathetan dhokter minangka argumentasi kanggo metode iki (tanpa metode kasebut ora bakal bisa digunakake lan sampeyan ora bakal dibayar!). Banjur kalkulasi sing dibutuhake ditindakake ing metode kasebut kanthi nggunakake cathetan sampeyan (akuntan nggunakake kanggo ngitung pinten perusahaan kudu mbayar sampeyan), lan asil karya sampeyan (jumlah dhuwit) bali menyang sampeyan. Program kita kerjane kanthi cara sing padha. Iku nelpon cara, ngirim data menyang, lan pungkasanipun nampa asil. Mangkene metode utama () program 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 1! Can I go, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck 2! And can I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
Kita nggawe rong truk kanthi muatan 10.000 lan 20.000. Lan jembatan sing dienggo petugas kasebut bobote maksimal 15.000. Program kasebut nelpon cara officer.checkTruck(first) . Cara ngetung kabeh banjur ngasilake bener , sing program banjur disimpen ing variabel boolean canFirstTruckGo . Saiki sampeyan bisa nindakake apa wae sing dikarepake (kaya sampeyan bisa karo dhuwit sing diwenehake akuntan). Ing pungkasan dina, kode

boolean canFirstTruckGo = officer.checkTruck(first);
boils mudhun kanggo

boolean canFirstTruckGo =  true;
Punika titik penting banget: statement bali ora mung bali Nilai bali cara, iku uga mandheg cara saka mlaku! Sembarang kode sing teka sawise statement bali ora bakal kaleksanan!

public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, you're overweight!");
    } else {
        return true;
        System.out.println("Everything looks good, go ahead!");
    }
}
Komentar petugas ora bakal ditampilake, amarga cara kasebut wis ngasilake asil lan mungkasi! Program kasebut bali menyang papan ing ngendi metode kasebut diarani. Sampeyan ora kudu nonton iki: compiler Jawa cukup pinter kanggo generate kesalahan nalika nyoba kanggo nulis kode sawise statement bali .

Avengers: Perang Parameter

Ana kahanan nalika kita pengin sawetara cara nelpon cara. Napa ora nggawe intelijen buatan dhewe? Amazon duwe Alexa, Apple duwe Siri, mula kenapa ora duwe? :) Ing film Iron Man, Tony Stark nggawe intelijen buatan sing luar biasa, Jarvis. Ayo menehi penghormatan marang karakter sing apik tenan lan jenenge AI kita kanggo ngurmati. :) Kaping pisanan sing kudu kita lakoni yaiku mulang Jarvis kanggo ngucapake salam marang wong sing mlebu kamar (aneh yen kapinteran sing luar biasa kasebut dadi ora sopan).

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");
    }
}
Output konsol:
Good evening, Tony Stark. How are you?
Apik tenan! Jarvis saiki bisa nampa tamu. Mesthi, luwih kerep tinimbang ora bakal dadi mastere, Tony Stark. Nanging kepiye yen dheweke ora teka dhewe! Metode sayHi() kita mung nampa siji argumen. Dadi mung bisa menehi salam marang wong siji sing mlebu kamar, lan ora nglirwakake liyane. Ora sopan banget, sampeyan ora setuju? :/

Metode Java Overloading

Ing kasus iki, kita bisa ngatasi masalah kanthi nulis 2 cara kanthi jeneng sing padha, nanging beda paramèter:

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?");
    }
}
Iki diarani metode overloading. Metode overloading ngidini program kita dadi luwih fleksibel lan nampung macem-macem cara kerja. Ayo dideleng cara kerjane:

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");
    }
}
Output konsol:
Good evening, Tony Stark. How are you?
Good evening, Tony Stark and Captain America. How are you?
Banget, loro versi makarya. :) Nanging kita ora ngatasi masalah! Apa yen ana tamu telu? Kita bisa, mesthi, kakehan cara sayHi () maneh, supaya nampa telung jeneng tamu. Nanging bisa uga ana 4 utawa 5. Kabeh cara kanggo tanpa wates. Apa ora ana cara sing luwih apik kanggo mulang Jarvis kanggo nangani sawetara jeneng, tanpa overloading sayHi () cara yuta kaping? :/ Mesthi ana! Yen ora ana, apa sampeyan mikir Jawa bakal dadi basa pemrograman sing paling populer ing donya? ;)

public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ". How are you?");
    }
}
Nalika ( String... names ) digunakake minangka parameter, nuduhake yen koleksi Strings bakal diterusake menyang metode kasebut. Kita ora kudu nemtokake luwih dhisik jumlah sing bakal ana, mula saiki cara kita luwih 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");
    }
}
Output konsol:
Good evening, Tony Stark. How are you?
Good evening, Captain America. How are you?
Good evening, Black Widow. How are you?
Good evening, Hulk. How are you?
Sawetara kode ing kene bakal ora pati ngerti, nanging aja kuwatir. Iku prasaja ing inti: cara njupuk saben jeneng ing siji lan greets saben tamu! Kajaba iku, bakal bisa digunakake karo senar sing dilewati! Loro, sepuluh, malah sewu-carane bakal bisa digunakake kanthi bener karo nomer tamu. Cara luwih trep tinimbang overloading metode kanggo kabeh kemungkinan, apa sampeyan mikir? :) Iki titik penting liyane: urutan argumen penting! Dadi cara kita njupuk String lan nomer:

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!
    }
}
Yen metode sayYourAge kelas Person njupuk senar lan nomer minangka input, mula program kasebut kudu ngliwati urutan kasebut! Yen kita pass ing urutan beda, compiler bakal generate kesalahan lan wong ora bakal bisa ngomong umur. Miturut cara, konstruktor, sing kita bahas ing wulangan pungkasan, uga cara! Sampeyan uga bisa kakehan (yaiku nggawe sawetara konstruktor kanthi set paramèter sing beda) lan urutan argumen sing dilewati uga penting banget kanggo wong-wong mau. Iku cara nyata! :)

Nanging maneh babagan paramèter

Ya, nuwun sewu, kita durung rampung. :) Topik sing bakal kita sinau saiki penting banget. Ana kemungkinan 90% sampeyan bakal ditakoni babagan iki ing saben wawancara ing mangsa ngarep! Ayo dadi pirembagan bab maringaken argumen kanggo metode. Coba conto sing 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 = 2018;

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

        timeMachine.goToPast(currentYear);
        System.out.println("How about now?");
        System.out.println(currentYear);
    }
}
Mesin wektu duwe rong cara. Loro-lorone njupuk nomer sing makili taun saiki minangka input, lan nambah utawa nyuda regane (gumantung apa kita pengin pindhah menyang masa lalu utawa masa depan). Nanging, sampeyan bisa ndeleng saka output console, cara ora bisa! Output konsol:
What year is it?
2018
How about now?
2018
Kita ngliwati variabel currentYear menyang metode goToPast () , nanging regane ora owah. Kita ana ing taun 2018, lan ing kene kita tetep. Nanging kenapa? : / Amarga primitif ing Jawa diterusake menyang metode kanthi nilai. Apa tegese? Nalika kita nelpon goToPast () cara lan pass int variabel currentYear (= 2018) menyang, cara ora njaluk variabel currentYear dhewe, nanging salinan saka iku. Mesthine, nilai salinan iki uga 2018, nanging owah-owahan apa wae ing salinan kasebut ora mengaruhi variabel asli saikiYear kanthi cara apa wae! Ayo nggawe kode luwih jelas lan nonton 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 running!");
        System.out.println("currentYear inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("currentYear inside the goToPast method (at the end) = " + currentYear);
    }

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

        System.out.println("What was the year when the program started?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And what year is it now?");
        System.out.println(currentYear);
    }
}
Output konsol:
What was the year when the program started?
2018
The goToPast method has started running!
currentYear inside the goToPast method (at the beginning) = 2018
currentYear inside the goToPast method (at the end) = 2008
And what year is it now?
2018
Iki nuduhake kanthi jelas yen variabel sing diterusake menyang metode goToPast () mung salinan currentYear . Lan ngganti salinan ora mengaruhi nilai "asli". "Pass by reference" tegese kosok balene. Ayo latihan ing kucing! Maksudku, ayo ndeleng apa sing liwat referensi katon nggunakake conto kucing. :)

public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
Saiki kanthi bantuan mesin wektu, kita bakal ngirim Smudge , kucing lelungan pisanan ing donya, menyang masa lalu lan masa depan! Ayo ngowahi kelas TimeMachine supaya bisa digunakake karo obyek Cat ;

public class TimeMachine {

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

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }    
}
Saiki cara ora mung ngganti nomer liwati. Nanging, dheweke ngganti lapangan umur Cat sing spesifik . Sampeyan bakal kelingan sing iki ora bisa kanggo kita karo primitif, amarga nomer asli ora diganti. Ayo ndeleng apa sing bakal kelakon!

public static void main(String[] args) {

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

    System.out.println("How old was Smudge when the program started?");
    System.out.println(smudge.age);

    timeMachine.goToFuture(smudge);
    System.out.println("How about now?");
    System.out.println(smudge.age);

    System.out.println("Holy smokes! Smudge has aged 10 years! Back up quickly!");
    timeMachine.goToPast(smudge);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(smudge.age);
}
Output konsol:
How old was Smudge when the program started running?
5
How about now?
15
Holy smokes! Smudge has aged 10 years! Back up quickly!
Did it work? Have we returned the cat to its original age?
5
wah! Saiki cara kasebut nindakake sing beda: kucing kita umure drastis, nanging banjur dadi enom maneh! :) Coba dipikir kok. Ora kaya conto karo primitif, nalika obyek diterusake menyang metode sing diterusake kanthi referensi. A referensi kanggo obyek smudge asli liwati menyang changeAge () cara. Dadi, nalika ngganti smudge.age ing metode kasebut, kita nuduhake area memori sing padha ing ngendi obyek disimpen. Iki minangka referensi kanggo Smudge sing padha karo sing digawe wiwitan. Iki diarani "passing by reference"! Nanging, ora kabeh sing duwe referensi gampang. :) Coba ganti contone:

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 smudge = new Cat(5);

        System.out.println("How old was Smudge when the program started?");
        System.out.println(smudge.age);

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

        System.out.println ("And if you try going back?");
        timeMachine.goToPast(smudge);
        System.out.println(smudge.age);
    }
}
Output konsol:
How old was Smudge when the program started running?
5
Smudge went to the future! Has his age changed?
5
And if you try going back?
5
Ora bisa maneh! О_О Ayo dadi tokoh metu apa kedaden. :) Iku kabeh apa karo goToPast / cara goToFuture lan cara referensi bisa. Saiki, perhatian sampeyan! Iki minangka perkara sing paling penting kanggo ngerti babagan cara referensi lan metode. Kasunyatane, nalika kita nyebut metode goToFuture(Kucing kucing) , iku salinan referensi kanggo obyek kucing sing dilewati, dudu referensi kasebut dhewe. Dadi, nalika kita ngliwati obyek menyang metode, ana rong referensi kanggo obyek kasebut. Iki penting banget kanggo mangerteni apa sing kedadeyan. Iki sebabe umur kucing ora owah ing conto pungkasan. Ing conto sadurunge, nalika ngganti umur, kita mung njupuk referensi liwati menyang goToFuture ()cara, lan digunakake kanggo nemokake obyek ing memori lan ngganti umur ( cat.age += 10 ). Nanging saiki, nang cara goToFuture () , kita nggawe obyek anyar ( kucing = anyar Cat(cat.age) ), lan obyek iki diutus salinan referensi padha sing liwati kanggo cara. Akibaté:
  • Referensi pisanan ( Cat smudge = Kucing anyar (5) ) nuduhake kucing asli (kanthi umur 5)
  • Sawisé iku, nalika kita liwati variabel kucing cara goToPast () lan diutus obyek anyar, referensi disalin.
Lan iki nggawa kita menyang asil pungkasan: rong referensi sing nuduhake rong obyek sing beda. Nanging kita mung ngganti umur siji saka wong-wong mau (sing digawe nang cara).

cat.age += 10;
Lan mesthi, ing cara utama () kita bisa ndeleng ing console sing umur kucing, smudge.age , wis ora diganti. Sawise kabeh, smudge minangka variabel referensi sing isih nuduhake obyek asli sing lawas karo umur 5, lan kita ora nindakake apa-apa karo obyek kasebut. Kabeh owah-owahan umur kita ditindakake ing obyek anyar. Dadi, ternyata obyek diterusake menyang metode kanthi referensi. Salinan obyek ora tau digawe kanthi otomatis. Yen sampeyan ngliwati obyek kucing menyang metode lan ngganti umure, sampeyan bakal ngganti umure. Nanging variabel referensi disalin nalika nemtokake nilai lan / utawa cara nelpon! Ayo baleni maneh apa sing kita ucapake babagan ngliwati primitif: "Nalika kita nelpon metode changeInt () lan pass int.variabel x (= 15) , metode kasebut ora entuk variabel x dhewe, nanging salinan kasebut. Mula, owah-owahan apa wae ing salinan kasebut ora mengaruhi x asli kitaisih bakal mbantah luwih saka sepisan babagan cara argumen diterusake ing Jawa (sanajan ing antarane pangembang sing berpengalaman). Nanging, saiki sampeyan ngerti persis cara kerjane. Dijogo! :) Kanggo nguatake apa sing sampeyan sinau, disaranake sampeyan nonton video pelajaran saka Kursus Jawa
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION