Konsep Pemrograman Berorientasi Objek di Java

1. Ikhtisar

Pada artikel ini, kita akan melihat konsep Pemrograman Berorientasi Objek (OOP) di Java. Kami akan membahas kelas, objek, abstraksi, enkapsulasi, pewarisan, dan polimorfisme .

2. Kelas

Kelas adalah titik awal dari semua objek, dan kami dapat menganggapnya sebagai templat untuk membuat objek. Kelas biasanya akan berisi bidang anggota, metode anggota, dan metode konstruktor khusus.

Kami akan menggunakan konstruktor untuk membuat objek kelas:

public class Car { // member fields private String type; private String model; private String color; private int speed; // constructor public Car(String type, String model, String color) { this.type = type; this.model = model; this.color = color; } // member methods public int increaseSpeed(int increment) { this.speed = this.speed + increment; return this.speed; } // ... }

Perhatikan bahwa kelas mungkin memiliki lebih dari satu konstruktor. Kita dapat membaca lebih lanjut tentang kelas di artikel kelas kita.

3. Objek

Objek dibuat dari kelas dan disebut instance kelas. Kami membuat objek dari kelas menggunakan konstruktornya:

Car veyron = new Car("Bugatti", "Veyron", "crimson"); Car corvette = new Car("Chevrolet", "Corvette", "black"); 

Di sini, kami telah membuat dua contoh mobil kelas . Baca lebih lanjut tentang mereka di artikel objek kami.

4. Abstraksi

Abstraksi menyembunyikan kompleksitas implementasi dan memperlihatkan antarmuka yang lebih sederhana.

Jika kita berpikir tentang komputer biasa, orang hanya dapat melihat antarmuka eksternal, yang paling penting untuk berinteraksi dengannya, sementara chip dan sirkuit internal disembunyikan dari pengguna.

Dalam OOP, abstraksi berarti menyembunyikan detail implementasi yang kompleks dari suatu program, hanya memperlihatkan API yang diperlukan untuk menggunakan implementasi. Di Java, kami mencapai abstraksi dengan menggunakan antarmuka dan kelas abstrak.

Kita dapat membaca lebih lanjut tentang abstraksi di kelas abstrak dan artikel antarmuka.

5. Enkapsulasi

Enkapsulasi menyembunyikan keadaan atau representasi internal suatu objek dari konsumen API dan menyediakan metode yang dapat diakses publik yang terikat ke objek untuk akses baca-tulis. Hal ini memungkinkan untuk menyembunyikan informasi spesifik dan mengontrol akses ke implementasi internal.

Misalnya, bidang anggota di kelas disembunyikan dari kelas lain, dan mereka dapat diakses menggunakan metode anggota. Salah satu cara untuk melakukannya adalah dengan membuat semua bidang data menjadi pribadi dan hanya dapat diakses dengan menggunakan metode anggota publik :

public class Car { // ... private int speed; public int getSpeed() { return color; } public void setSpeed(int speed) { this.speed = speed; } // ... }

Di sini, kecepatan bidang dienkapsulasi menggunakan pengubah akses pribadi , dan hanya dapat diakses menggunakan metode publik getSpeed ​​() dan setSpeed ​​() . Kita dapat membaca lebih lanjut tentang pengubah akses di artikel pengubah akses.

6. Warisan

Inheritance adalah mekanisme yang memungkinkan satu kelas memperoleh semua properti dari kelas lain dengan mewarisi kelas tersebut. Kita menyebut kelas yang mewarisi kelas anak dan kelas yang diwarisi sebagai kelas super atau kelas induk.

Di Java, kami melakukan ini dengan memperluas kelas induk. Jadi, kelas anak mendapatkan semua properti dari induknya:

public class Car extends Vehicle { //... }

Saat kami memperluas kelas, kami membentuk hubungan IS-A. The Car IS-A Kendaraan . Jadi, ia memiliki semua karakteristik Kendaraan .

Kita mungkin bertanya, mengapa kita membutuhkan warisan ? Untuk menjawab ini, mari kita pertimbangkan produsen kendaraan yang memproduksi berbagai jenis kendaraan, seperti mobil, bus, trem, dan truk.

Untuk mempermudah pekerjaan, kita dapat menggabungkan fitur dan properti umum dari semua jenis kendaraan ke dalam modul (kelas dalam kasus Java). Dan kita dapat membiarkan tipe individu mewarisi dan menggunakan kembali properti tersebut:

public class Vehicle { private int wheels; private String model; public void start() { // the process of starting the vehicle } public void stop() { // process to stop the vehicle } public void honk() { // produces a default honk } }

Jenis kendaraan Mobil sekarang akan mewarisi dari kelas Kendaraan induk :

public class Car extends Vehicle { private int numberOfGears; public void openDoors() { // process to open the doors } }

Java mendukung pewarisan tunggal dan pewarisan multilevel. Ini berarti sebuah kelas tidak dapat diturunkan dari lebih dari satu kelas secara langsung, tetapi dapat menggunakan hierarki:

public class ArmoredCar extends Car { private boolean bulletProofWindows; public void remoteStartCar() { // this vehicle can be started by using a remote control } }

Di sini, ArmouredCar memperluas Mobil , dan Mobil memperluas Kendaraan . Jadi, ArmouredCar mewarisi properti dari Mobil dan Kendaraan .

Sementara kita mewarisi dari kelas induk, pengembang juga bisa mengganti implementasi metode dari induk. Ini dikenal sebagai penimpaan metode.

Dalam contoh kelas Vehicle kami di atas , ada metode honk () . Kelas Mobil yang memperluas kelas Kendaraan dapat menimpa metode ini dan mengimplementasikan dengan cara yang diinginkan untuk menghasilkan klakson:

public class Car extends Vehicle { //... @Override public void honk() { // produces car-specific honk } }

Perhatikan bahwa ini juga disebut polimorfisme runtime, seperti yang dijelaskan di bagian selanjutnya. Kita dapat membaca lebih lanjut tentang pewarisan di artikel pewarisan dan komposisi Java.

7. Polimorfisme

Polimorfisme adalah kemampuan bahasa OOP untuk memproses data secara berbeda tergantung pada jenis masukannya. Di Java, ini bisa menjadi nama metode yang sama yang memiliki tanda tangan metode berbeda dan menjalankan fungsi yang berbeda:

public class TextFile extends GenericFile { //... public String read() { return this.getContent() .toString(); } public String read(int limit) { return this.getContent() .toString() .substring(0, limit); } public String read(int start, int stop) { return this.getContent() .toString() .substring(start, stop); } }

Dalam contoh ini, kita dapat melihat bahwa metode read () memiliki tiga bentuk berbeda dengan fungsionalitas berbeda. Jenis polimorfisme ini adalah polimorfisme statis atau waktu kompilasi dan juga disebut metode overloading.

Ada juga runtime atau polimorfisme dinamis, di mana kelas turunan mengganti metode induknya :

public class GenericFile { private String name; //... public String getFileInfo() { return "Generic File Impl"; } }

Kelas anak bisa memperluas kelas GenericFile dan mengganti metode getFileInfo () :

public class ImageFile extends GenericFile { private int height; private int width; //... getters and setters public String getFileInfo() { return "Image File Impl"; } }

Baca lebih lanjut tentang polimorfisme dalam artikel polimorfisme kami di Java.

8. Kesimpulan

Pada artikel ini, kami belajar tentang konsep dasar dasar OOP dengan Java.

Contoh kode dalam artikel ini tersedia di Github.