Abstraksi Java Dijelaskan: Sederhanakan Kode & Tingkatkan Keterbacaan
Menurut kamus, abstraksi adalah kualitas menangani ide daripada peristiwa. Misalnya, saat Anda mempertimbangkan kasus email, detail kompleks seperti apa yang terjadi segera setelah Anda mengirim email, protokol yang digunakan server email Anda disembunyikan dari pengguna. Oleh karena itu, untuk mengirim email Anda hanya perlu mengetik konten, menyebutkan alamat penerima, dan klik kirim.
Demikian pula dalam pemrograman berorientasi objek, abstraksi adalah proses menyembunyikan detail implementasi dari pengguna, hanya fungsionalitas yang akan diberikan kepada pengguna. Dengan kata lain, pengguna akan memiliki informasi tentang apa yang dilakukan objek daripada bagaimana melakukannya.
Di Java, abstraksi dicapai menggunakan kelas abstrak dan antarmuka.
Kelas Abstrak
Sebuah kelas yang mengandung kata kunci abstract dalam deklarasinya dikenal sebagai kelas abstrak.
Kelas abstrak mungkin atau mungkin tidak mengandung metode abstrak, yaitu metode tanpa tubuh ( public void get(); )
Namun, jika sebuah kelas memiliki setidaknya satu metode abstrak, maka kelas harus dideklarasikan sebagai abstract.
Jika sebuah kelas dideklarasikan sebagai abstract, tidak dapat diinstantiasi.
Untuk menggunakan kelas abstrak, Anda harus mewarisinya dari kelas lain, memberikan implementasi ke metode abstrak di dalamnya.
Jika Anda mewarisi kelas abstrak, Anda harus memberikan implementasi ke semua metode abstrak di dalamnya.
Contoh
Bagian ini memberikan contoh kelas abstrak. Untuk membuat kelas abstrak, gunakan kata kunci abstract sebelum kata kunci class, dalam deklarasi kelas.
/* File name : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } } Anda dapat melihat bahwa kecuali metode abstrak, kelas Employee sama dengan kelas normal di Java. Kelas sekarang abstract, tetapi masih memiliki tiga bidang, tujuh metode, dan satu konstruktor.
Sekarang Anda dapat mencoba membuat instance kelas Employee dengan cara berikut:
/* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { /* Berikut ini tidak diizinkan dan akan menghasilkan error */ Employee e = new Employee("George W.", "Houston, TX", 43); System.out.println("\n Panggil mailCheck menggunakan referensi Employee--"); e.mailCheck(); } } Saat Anda mengkompilasi kelas di atas, akan menghasilkan error berikut:
Employee.java:46: Employee is abstract; cannot be instantiated Employee e = new Employee("George W.", "Houston, TX", 43); ^ 1 error Mewarisi Kelas Abstrak
Kita dapat mewarisi properti kelas Employee seperti kelas konkret dengan cara berikut:
Contoh
/* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Within mailCheck of Salary class "); System.out.println("Mailing check to " + getName() + " with salary " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } } Di sini, Anda tidak dapat membuat instance kelas Employee, tetapi Anda dapat membuat instance kelas Salary, dan menggunakan instance ini Anda dapat mengakses semua tiga bidang dan tujuh metode kelas Employee seperti yang ditunjukkan di bawah ini.
/* File name : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Call mailCheck using Salary reference --"); s.mailCheck(); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } } Ini menghasilkan hasil berikut:
Keluaran
Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.0
Metode Abstrak
Jika Anda ingin suatu kelas mengandung metode tertentu tetapi Anda ingin implementasi aktual dari metode tersebut ditentukan oleh kelas anak, Anda dapat mendeklarasikan metode di kelas induk sebagai abstrak.
kata kunci abstract digunakan untuk mendeklarasikan metode sebagai abstrak.
Anda harus menempatkan kata kunci abstract sebelum nama metode dalam deklarasi metode.
Metode abstrak berisi tanda tangan metode, tetapi tidak ada tubuh metode.
Alih-alih kurung kurawal, metode abstrak akan memiliki titik koma (;) di akhir.
Berikut adalah contoh metode abstrak.
Contoh
public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); // Remainder of class definition } Mendeklarasikan metode sebagai abstrak memiliki dua konsekuensi:
Catatan – Akhirnya, kelas turunan harus mengimplementasikan metode abstrak; jika tidak, Anda akan memiliki hierarki kelas abstrak yang tidak dapat diinstantiasi.
Misalkan kelas Salary mewarisi kelas Employee, maka seharusnya mengimplementasikan metode computePay() seperti yang ditunjukkan di bawah ini:
/* File name : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } // Remainder of class definition }