Halo! Pernahkah Anda bertanya-tanya mengapa Java didesain seperti itu? Dalam artian Anda membuat kelas, berdasarkan kelas tersebut - objek, kelas memiliki metode, dll. Tetapi mengapa struktur bahasanya sedemikian rupa sehingga program terdiri dari kelas dan objek, dan bukan sesuatu yang lain? Mengapa konsep “objek” diciptakan dan dikedepankan? Apakah semua bahasa bekerja dengan cara ini dan, jika tidak, apa manfaatnya bagi Java? Seperti yang Anda lihat, ada banyak sekali pertanyaan :) Mari kita coba menjawabnya masing-masing dalam kuliah hari ini.
Kristen Nygaard dan Ole Johan Dahl - pencipta Simula
Tampaknya Simula adalah bahasa kuno menurut standar pemrograman, tetapi hubungan “keluarga” mereka dengan Java dapat dilihat dengan mata telanjang. Kemungkinan besar, Anda dapat dengan mudah membaca kode yang tertulis di dalamnya dan menjelaskan secara umum apa fungsinya :)
Prinsip OOP:
Apa itu pemrograman berorientasi objek (OOP)
Tentu saja, Java terdiri dari objek dan kelas karena suatu alasan. Ini bukan kemauan penciptanya, atau bahkan penemuan mereka. Masih banyak bahasa lain yang berbasis objek. Bahasa pertama disebut Simula, dan ditemukan pada tahun 1960-an di Norwegia. Simula antara lain memperkenalkan konsep “ kelas ” dan “ metode ”.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 kode diambil dari artikel Simula - 50 tahun OOP . Seperti yang Anda lihat, Java dan nenek moyangnya tidak jauh berbeda satu sama lain :) Hal ini disebabkan kemunculan Simula menandai lahirnya konsep baru - pemrograman berorientasi objek. Wikipedia memberikan definisi OOP sebagai berikut: Pemrograman berorientasi objek (OOP) adalah metodologi pemrograman yang didasarkan pada representasi program sebagai kumpulan objek, yang masing-masing merupakan turunan dari kelas tertentu, dan kelas-kelas tersebut membentuk hierarki warisan. Menurut saya, ini sangat sukses. Anda baru saja mulai belajar Java, tetapi hampir tidak ada kata-kata di dalamnya yang asing bagi Anda :) Saat ini, OOP adalah metodologi pemrograman yang paling umum. Selain Java, prinsip OOP digunakan dalam banyak bahasa populer yang mungkin pernah Anda dengar. Ini adalah C++ (secara aktif digunakan oleh pengembang game komputer), Objective-C dan Swift (mereka menulis program untuk perangkat Apple), Python (paling diminati dalam pembelajaran mesin), PHP (salah satu bahasa pengembangan web paling populer), JavaScript (lebih sederhananya katakan apa yang tidak mereka lakukan) dan banyak lainnya. Sebenarnya apa saja “prinsip” OOP tersebut? Mari kita ceritakan lebih detail.
Prinsip OOP
Ini adalah dasar-dasarnya. 4 fitur utama yang bersama-sama membentuk paradigma pemrograman berorientasi objek. Memahami mereka adalah kunci untuk menjadi seorang programmer yang sukses.Prinsip 1. Warisan
Kabar baiknya adalah Anda sudah familiar dengan beberapa prinsip OOP! :) Kami telah menemukan warisan beberapa kali dalam perkuliahan, dan kami punya waktu untuk mengerjakannya. Warisan adalah mekanisme yang memungkinkan Anda mendeskripsikan kelas baru berdasarkan kelas (induk) yang sudah ada. Dalam hal ini, properti dan fungsionalitas kelas induk dipinjam oleh kelas baru. Mengapa warisan diperlukan dan apa manfaatnya? Pertama-tama, penggunaan kembali kode. Bidang dan metode yang dijelaskan di kelas induk dapat digunakan di kelas turunannya. Jika semua jenis mobil memiliki 10 bidang umum dan 5 metode yang identik, Anda hanya perlu memasukkannya ke dalam kelas indukAuto
. Anda dapat menggunakannya di kelas turunan tanpa masalah. Keuntungan yang kuat: baik secara kuantitatif (lebih sedikit kode) dan, sebagai hasilnya, secara kualitatif (kelas menjadi lebih sederhana). Pada saat yang sama, mekanisme pewarisan sangat fleksibel, dan Anda dapat menambahkan fungsionalitas yang hilang di turunan secara terpisah (beberapa bidang atau perilaku khusus untuk kelas tertentu). Secara umum, seperti dalam kehidupan biasa: kita semua mirip dengan orang tua kita dalam beberapa hal, tetapi berbeda dari mereka dalam beberapa hal :)
Prinsip 2. Abstraksi
Ini adalah prinsip yang sangat sederhana. Abstraksi berarti menonjolkan ciri-ciri utama dan paling signifikan dari suatu objek dan sebaliknya - membuang ciri-ciri sekunder yang tidak penting. Mari kita tidak menemukan kembali roda dan mengingat contoh dari ceramah lama tentang kelas. Katakanlah kita membuat lemari arsip karyawan perusahaan. Untuk membuat objek karyawan, kami menulis sebuah kelasEmployee
. Karakteristik apa yang penting untuk dijelaskan dalam arsip perusahaan? Nama lengkap, tanggal lahir, nomor jaminan sosial, nomor identifikasi pajak. Namun kecil kemungkinannya dalam kartu jenis ini kita membutuhkan tinggi badan, warna mata, dan warna rambutnya. Perusahaan tidak memerlukan informasi tentang karyawan tersebut. Oleh karena itu, untuk kelas Employee
kita akan mengatur variabel String name
, int age
, int socialInsuranceNumber
dan int taxNumber
, dan kita akan mengabaikan informasi yang tidak diperlukan bagi kita, seperti warna mata, dan mengabstraksikannya. Namun jika kita membuat katalog foto model untuk sebuah agensi, situasinya berubah drastis. Untuk menggambarkan seorang model fesyen, tinggi badan, warna mata dan warna rambut sangat penting bagi kami, namun nomor NPWP tidak diperlukan. Oleh karena itu, di kelas Model
kita membuat variabel String height
, String hair
, String eyes
.
Prinsip 3: Enkapsulasi
Kami sudah menemukannya. Enkapsulasi di Java berarti membatasi akses ke data dan kemampuan untuk mengubahnya. Seperti yang Anda lihat, ini didasarkan pada kata “kapsul”. Dalam “kapsul” ini kami menyembunyikan beberapa data penting bagi kami yang tidak ingin diubah oleh siapa pun. Contoh sederhana dari kehidupan. Anda memiliki nama depan dan belakang. Semua orang yang Anda kenal mengenal mereka. Namun mereka tidak memiliki akses untuk mengubah nama depan dan belakang Anda. Proses ini, bisa dikatakan, “dirangkum” di kantor paspor: Anda hanya dapat mengubah nama depan dan belakang Anda di sana, dan hanya Anda yang dapat melakukannya. “Pengguna” lain memiliki akses hanya baca ke nama depan dan belakang Anda :) Contoh lainnya adalah uang di apartemen Anda. Membiarkannya terlihat jelas di tengah ruangan bukanlah ide yang baik. Setiap “pengguna” (orang yang datang ke rumah Anda) akan dapat mengubah jumlah uang Anda, mis. jemput mereka. Lebih baik merangkumnya dalam brankas. Hanya Anda yang memiliki akses dan hanya dengan kode khusus. Contoh nyata enkapsulasi yang telah Anda kerjakan adalah pengubah akses (private
, public
dll.) dan pengambil-penyetel. Jika bidang age
kelas Cat
tidak dienkapsulasi, siapa pun dapat menulis:
Cat.age = -1000;
Dan mekanisme enkapsulasi memungkinkan kita untuk melindungi bidang age
dengan metode penyetel, di mana kita dapat memeriksa bahwa usia tidak boleh berupa angka negatif.
Prinsip 4. Polimorfisme
Polimorfisme adalah kemampuan untuk memperlakukan beberapa tipe seolah-olah mereka adalah tipe yang sama. Dalam hal ini, perilaku objek akan berbeda bergantung pada tipenya. Kedengarannya agak rumit? Mari kita cari tahu sekarang. Mari kita ambil contoh paling sederhana - binatang. Mari kita buat kelasAnimal
dengan satu metode - voice()
, dan dua turunannya - 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 kita coba membuat tautan Animal
dan menetapkannya sebagai objek Dog
.
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.voice();
}
}
Menurut Anda metode mana yang akan dipanggil? Animal.voice()
atau Dog.voice()
? Metode kelasnya akan disebut Dog
: Guk-guk! Kami membuat referensi Animal
, tetapi objek berperilaku seperti itu Dog
. Jika perlu, dia bisa bertingkah laku seperti kucing, kuda, atau binatang lainnya. Hal utama adalah menetapkan referensi tipe umum Animal
ke objek kelas turunan tertentu. Hal ini masuk akal, karena semua anjing adalah binatang. Inilah yang kami maksud ketika kami mengatakan “objek akan berperilaku berbeda tergantung pada jenisnya.” Jika kita membuat objek Cat
-
public static void main(String[] args) {
Animal cat = new Cat();
cat.voice();
}
metode ini voice()
akan menampilkan "Meong!" Apa yang dimaksud dengan “kemampuan untuk bekerja dengan beberapa tipe seolah-olah mereka adalah tipe yang sama”? Caranya juga cukup mudah. Bayangkan kita sedang membuat salon tata rambut untuk hewan. Salon rambut kita harus bisa memotong semua hewan, jadi kita akan membuat metode shear()
(“memotong”) dengan parameter Animal
– hewan yang akan kita potong.
public class AnimalBarbershop {
public void shear(Animal animal) {
System.out.println("The haircut is ready!");
}
}
Dan sekarang kita bisa meneruskan shear
objek Cat
dan objek ke metode ini 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 ini contoh yang jelas: kelas AnimalBarbershop
bekerja dengan tipe Cat
seolah- Dog
olah tipenya sama. Pada saat yang sama, mereka mempunyai perilaku Cat
yang berbeda Dog
: mereka menggunakan suara mereka secara berbeda.
GO TO FULL VERSION