hello! Pernahkah anda terfikir mengapa Java direka bentuk seperti itu? Dalam erti kata bahawa anda membuat kelas, berdasarkan mereka - objek, kelas mempunyai kaedah, dsb. Tetapi mengapa struktur bahasa sedemikian rupa sehingga program terdiri daripada kelas dan objek, dan bukan sesuatu yang lain? Mengapa konsep "objek" dicipta dan diletakkan di hadapan? Adakah semua bahasa berfungsi dengan cara ini dan, jika tidak, apakah faedah yang diberikannya kepada Java? Seperti yang anda lihat, terdapat banyak soalan :) Mari kita cuba jawab setiap satunya dalam kuliah hari ini.
Kristen Nygaard dan Ole Johan Dahl - pencipta Simula
Nampaknya Simula adalah bahasa purba mengikut piawaian pengaturcaraan, tetapi sambungan "keluarga" mereka dengan Java boleh dilihat dengan mata kasar. Kemungkinan besar, anda boleh membaca kod yang tertulis di atasnya dengan mudah dan menerangkan secara umum apa yang dilakukannya :)
Prinsip OOP:
Apakah itu pengaturcaraan berorientasikan objek (OOP)
Sudah tentu, Java terdiri daripada objek dan kelas atas sebab tertentu. Ini bukan kehendak penciptanya, malah ciptaan mereka. Terdapat banyak bahasa lain yang berdasarkan objek. Bahasa pertama seperti itu dipanggil Simula, dan ia dicipta pada tahun 1960-an di Norway. Antara lain, Simula memperkenalkan konsep “ kelas ” dan “ kaedah ”.Begin
Class Rectangle (Width, Height); Real Width, Height;
Begin
Real Area, Perimeter;
Procedure Update;
Begin
Area := Width * Height;
OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
Perimeter := 2*(Width + Height);
OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
End of Update;
Update;
OutText("Rectangle created: "); OutFix(Width,2,6);
OutFix(Height,2,6); OutImage;
End of Rectangle;
Rectangle Class ColouredRectangle (Color); Text Color;
Begin
OutText("ColouredRectangle created, color = "); OutText(Color);
OutImage;
End of ColouredRectangle;
Ref(Rectangle) Cr;
Cr :- New ColouredRectangle(10, 20, "Green");
End;
Contoh kod diambil daripada artikel Simula - 50 tahun OOP . Seperti yang anda lihat, Java dan nenek moyangnya tidak begitu berbeza antara satu sama lain :) Ini disebabkan oleh fakta bahawa penampilan Simula menandakan kelahiran konsep baru - pengaturcaraan berorientasikan objek. Wikipedia memberikan takrifan OOP berikut: Pengaturcaraan berorientasikan objek (OOP) ialah metodologi pengaturcaraan berdasarkan mewakili program sebagai koleksi objek, setiap satunya adalah contoh kelas tertentu, dan kelas membentuk hierarki warisan. Ia, pada pendapat saya, sangat berjaya. Anda baru-baru ini mula mempelajari Java, tetapi hampir tidak terdapat sebarang perkataan di dalamnya yang tidak anda kenali :) Hari ini, OOP ialah metodologi pengaturcaraan yang paling biasa. Selain Java, prinsip OOP digunakan dalam banyak bahasa popular yang mungkin anda pernah dengar. Ini adalah C++ (ia digunakan secara aktif oleh pembangun permainan komputer), Objective-C dan Swift (mereka menulis program untuk peranti Apple), Python (paling banyak permintaan dalam pembelajaran mesin), PHP (salah satu bahasa pembangunan web yang paling popular), JavaScript (lebih mudah katakan apa yang mereka tidak lakukan padanya) dan banyak lagi. Sebenarnya, apakah "prinsip" OOP ini? Mari beritahu anda dengan lebih terperinci.
prinsip OOP
Ini adalah asasnya. 4 ciri utama yang bersama-sama membentuk paradigma pengaturcaraan berorientasikan objek. Memahami mereka adalah kunci untuk menjadi seorang pengaturcara yang berjaya.Prinsip 1. Pewarisan
Berita baiknya ialah anda sudah biasa dengan beberapa prinsip OOP! :) Kami telah menemui warisan beberapa kali dalam kuliah, dan kami mempunyai masa untuk bekerja dengannya. Warisan ialah mekanisme yang membolehkan anda menerangkan kelas baharu berdasarkan kelas (ibu bapa) sedia ada. Dalam kes ini, sifat dan kefungsian kelas induk dipinjam oleh kelas baharu. Mengapa pewarisan perlu dan apakah faedah yang diberikan? Pertama sekali, penggunaan semula kod. Medan dan kaedah yang diterangkan dalam kelas induk boleh digunakan dalam kelas keturunan. Jika semua jenis kereta mempunyai 10 medan biasa dan 5 kaedah yang sama, anda hanya perlu meletakkannya dalam kelas indukAuto
. Anda boleh menggunakannya dalam kelas keturunan tanpa sebarang masalah. Kelebihan pepejal: secara kuantitatif (kurang kod) dan, sebagai hasilnya, secara kualitatif (kelas menjadi lebih mudah). Pada masa yang sama, mekanisme pewarisan adalah sangat fleksibel, dan anda boleh menambah fungsi yang hilang dalam keturunan secara berasingan (beberapa medan atau tingkah laku khusus untuk kelas tertentu). Secara umum, seperti dalam kehidupan biasa: kita semua serupa dengan ibu bapa kita dalam beberapa cara, tetapi berbeza daripada mereka dalam beberapa cara :)
Prinsip 2. Abstraksi
Ini adalah prinsip yang sangat mudah. Abstraksi bermaksud menyerlahkan ciri utama, paling ketara bagi sesuatu objek dan sebaliknya - membuang yang sekunder, tidak penting. Jangan kita cipta semula roda dan ingat contoh dari kuliah lama tentang kelas. Katakan kita sedang mencipta kabinet fail pekerja syarikat. Untuk mencipta objek pekerja, kami menulis kelasEmployee
. Apakah ciri yang penting untuk penerangan mereka dalam fail syarikat? Nama penuh, tarikh lahir, nombor keselamatan sosial, nombor pengenalan cukai. Tetapi tidak mungkin dalam kad jenis ini kita memerlukan ketinggian, mata dan warna rambutnya. Syarikat tidak memerlukan maklumat ini tentang pekerja. Oleh itu, untuk kelas Employee
kami akan menetapkan pembolehubah String name
, int age
, int socialInsuranceNumber
dan int taxNumber
, dan kami akan meninggalkan maklumat yang tidak diperlukan untuk kami, seperti warna mata, dan abstrakkannya. Tetapi jika kita mencipta katalog model foto untuk agensi, keadaan berubah secara mendadak. Untuk menerangkan model fesyen, ketinggian, warna mata dan warna rambut adalah sangat penting bagi kami, tetapi nombor TIN tidak diperlukan. Oleh itu, dalam kelas Model
kita mencipta pembolehubah String height
, String hair
, String eyes
.
Prinsip 3: Enkapsulasi
Kami telah pun menemuinya. Enkapsulasi dalam Java bermaksud mengehadkan akses kepada data dan keupayaan untuk mengubahnya. Seperti yang anda lihat, ia berdasarkan perkataan "kapsul". Dalam "kapsul" ini kami menyembunyikan beberapa data penting untuk kami yang kami tidak mahu sesiapa pun mengubahnya. Contoh mudah dari kehidupan. Anda mempunyai nama pertama dan nama keluarga. Semua orang yang anda kenali mengenali mereka. Tetapi mereka tidak mempunyai akses untuk menukar nama pertama dan nama keluarga anda. Proses ini, mungkin dikatakan, "dirangkumkan" di pejabat pasport: anda hanya boleh menukar nama pertama dan terakhir anda di sana, dan hanya anda yang boleh melakukannya. "Pengguna" lain mempunyai akses baca sahaja kepada nama pertama dan nama keluarga anda :) Contoh lain ialah wang di pangsapuri anda. Meninggalkan mereka di hadapan mata di tengah-tengah bilik bukanlah idea yang baik. Mana-mana "pengguna" (orang yang datang ke rumah anda) akan dapat menukar nombor wang anda, i.e. jemput mereka. Adalah lebih baik untuk membungkusnya dalam peti besi. Hanya anda akan mempunyai akses dan hanya dengan kod khas. Contoh pengkapsulan yang jelas yang telah anda gunakan ialah pengubah suai akses (private
, public
dsb.) dan penetap pengambil. Jika medan age
kelas Cat
tidak dirangkumkan, sesiapa sahaja boleh menulis:
Cat.age = -1000;
Dan mekanisme enkapsulasi membolehkan kami melindungi medan age
dengan kaedah penetap, di mana kami boleh meletakkan semakan bahawa umur tidak boleh menjadi nombor negatif.
Prinsip 4. Polimorfisme
Polimorfisme ialah keupayaan untuk merawat pelbagai jenis seolah-olah mereka adalah jenis yang sama. Dalam kes ini, kelakuan objek akan berbeza bergantung pada jenis objek tersebut. Kedengaran agak rumit? Mari kita fikirkan sekarang. Mari kita ambil contoh paling mudah - haiwan. Mari buat kelasAnimal
dengan satu kaedah - voice()
, dan dua keturunannya - Cat
dan Dog
.
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("Bow-wow!");
}
}
public class Cat extends Animal {
@Override
public void voice() {
System.out.println("Meow!");
}
}
Sekarang mari cuba buat pautan Animal
dan tetapkan ia objek Dog
.
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.voice();
}
}
Kaedah manakah yang anda fikir akan dipanggil? Animal.voice()
atau Dog.voice()
? Kaedah kelas akan dipanggil Dog
: Woof-woof! Kami mencipta rujukan Animal
, tetapi objek berkelakuan seperti Dog
. Jika perlu, dia boleh berkelakuan seperti kucing, kuda atau haiwan lain. Perkara utama ialah memberikan rujukan jenis umum Animal
kepada objek kelas keturunan tertentu. Ini adalah logik, kerana semua anjing adalah haiwan. Inilah yang kami maksudkan apabila kami berkata "objek akan berkelakuan berbeza bergantung pada jenis objek itu." Jika kita mencipta objek Cat
−
public static void main(String[] args) {
Animal cat = new Cat();
cat.voice();
}
kaedah itu voice()
akan mengeluarkan "Meow!" Apakah maksud "keupayaan untuk bekerja dengan beberapa jenis seolah-olah ia adalah jenis yang sama"? Ini juga agak mudah. Bayangkan kita sedang mencipta salun dandanan rambut untuk haiwan. Salun rambut kami mesti boleh memotong semua haiwan, jadi kami akan membuat kaedah shear()
("potong") dengan parameter Animal
- haiwan yang akan kami potong.
public class AnimalBarbershop {
public void shear(Animal animal) {
System.out.println("The haircut is ready!");
}
}
Dan sekarang kita boleh menghantar shear
kedua-dua objek Cat
dan objek kepada kaedah Dog
!
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
AnimalBarbershop barbershop = new AnimalBarbershop();
barbershop.shear(cat);
barbershop.shear(dog);
}
Berikut ialah contoh yang jelas: kelas AnimalBarbershop
berfungsi dengan jenis Cat
seolah- Dog
olah mereka adalah jenis yang sama. Pada masa yang sama, mereka mempunyai tingkah laku Cat
yang berbeza Dog
: mereka menggunakan suara mereka secara berbeza.
GO TO FULL VERSION