JavaRush /Java Blog /Random-ID /Rehat kopi #140. Kelas abstrak dan antarmuka di Java

Rehat kopi #140. Kelas abstrak dan antarmuka di Java

Dipublikasikan di grup Random-ID
Sumber: InfoWorld Hari ini Anda akan mempelajari dalam hal apa seorang pengembang harus menggunakan kelas abstrak dan dalam hal apa antarmuka. Kami juga akan mengidentifikasi perbedaan antara elemen-elemen bahasa Java dan cara menggunakannya dalam program. Rehat kopi #140.  Kelas abstrak dan antarmuka di Java - 1Kelas abstrak dan antarmuka cukup umum dalam kode Java dan bahkan di Java Development Kit (JDK) itu sendiri. Masing-masing elemen ini memiliki tujuan berbeda:
  • Antarmuka adalah konstruksi dalam bahasa Java yang membantu mengimplementasikan metode abstrak dan konstanta statis.
  • Kelas abstrak mirip dengan kelas biasa, hanya saja kelas tersebut dapat menyertakan metode abstrak, yaitu metode tanpa isi. Kelas abstrak tidak dapat dibuat.
Banyak pengembang berpikir bahwa antarmuka dan kelas abstrak serupa, namun kenyataannya hal ini tidak sepenuhnya benar. Mari kita lihat perbedaan utama di antara keduanya.

Apa itu antarmuka

Pada intinya, antarmuka adalah sebuah kontrak, sehingga bergantung pada implementasinya untuk menentukan tujuan pembuatannya. Antarmuka tidak dapat menggunakan variabel instan yang dapat diubah, hanya dapat menggunakan variabel akhir.

Kapan menggunakan antarmuka

Antarmuka sangat berguna untuk memisahkan kode dan mengimplementasikan polimorfisme. Kita dapat melihat ini di JDK dengan antarmuka List :
public interface List<E> extends Collection<E> {

    int size();
    boolean isEmpty();
    boolean add(E e);
    E remove(int index);
    void clear();
}
Seperti yang mungkin Anda ketahui, kode ini, meskipun singkat, cukup deskriptif. Kita dapat dengan mudah melihat tanda tangan metode yang akan digunakan untuk mengimplementasikan metode di antarmuka menggunakan kelas konkret. Antarmuka Daftar berisi kontrak yang dapat diimplementasikan oleh ArrayList , Vector , LinkedList , dan kelas lainnya. Untuk menggunakan polimorfisme, kita cukup mendeklarasikan tipe variabel kita menggunakan Daftar dan kemudian memilih salah satu instance yang tersedia. Berikut contoh lainnya:
List list = new ArrayList();
System.out.println(list.getClass());

 List list = new LinkedList();
 System.out.println(list.getClass());
Outputnya adalah:
kelas java.util.ArrayList kelas java.util.LinkedList
Dalam hal ini, metode implementasi untuk ArrayList , LinkedList , dan Vector berbeda, yang merupakan skenario yang sangat baik untuk menggunakan antarmuka. Jika Anda memperhatikan bahwa banyak kelas milik kelas induk dengan metode tindakan yang sama tetapi perilakunya berbeda. Dalam situasi seperti itu, disarankan untuk menggunakan antarmuka. Selanjutnya, mari kita lihat beberapa opsi untuk menggunakan antarmuka.

Penggantian Metode Antarmuka

Seperti yang telah kita ketahui, antarmuka adalah sejenis kontrak yang harus diimplementasikan oleh kelas tertentu. Metode antarmuka secara implisit bersifat abstrak dan memerlukan implementasi kelas yang konkrit. Berikut ini contohnya:
public class OverridingDemo {
  public static void main(String[] args) {
    Challenger challenger = new JavaChallenger();
    challenger.doChallenge();
  }
}

interface Challenger {
  void doChallenge();
}

class JavaChallenger implements Challenger {
  @Override
  public void doChallenge() {
    System.out.println("Challenge done!");
  }
}
Kesimpulan:
Tantangan selesai!
Perhatikan bahwa metode antarmuka secara implisit bersifat abstrak. Artinya kita tidak perlu mendeklarasikannya secara eksplisit sebagai abstrak.

Variabel Konstan

Aturan lain yang perlu diingat adalah bahwa antarmuka hanya boleh berisi variabel konstan. Berikut ini contohnya:
public class Challenger {

  int number = 7;
  String name = "Java Challenger";

}
Di sini kedua variabel bersifat implisit final dan static . Artinya, nilai-nilai tersebut bersifat konstan, tidak bergantung pada contohnya, dan tidak dapat diubah. Sekarang kita akan mencoba mengubah variabel di antarmuka Challenger , katakanlah seperti ini:
Challenger.number = 8;
Challenger.name = "Another Challenger";
Ini akan menyebabkan kesalahan kompilasi:
Tidak dapat memberikan nilai pada 'angka' variabel akhir Tidak dapat memberikan nilai pada 'nama' variabel akhir

Metode Bawaan

Ketika metode default diperkenalkan di Java 8, beberapa pengembang mengira metode tersebut akan sama dengan kelas abstrak. Namun, hal ini tidak benar karena antarmuka tidak dapat memiliki status. Metode default mungkin mempunyai implementasi, tetapi metode abstrak tidak. Metode default adalah hasil inovasi dengan ekspresi dan aliran lambda, namun kita harus menggunakannya dengan hati-hati. Metode di JDK yang menggunakan metode default adalah forEach() , yang merupakan bagian dari antarmuka Iterable . Daripada menyalin kode ke setiap implementasi Iterable , kita cukup menggunakan kembali metode forEach :
default void forEach(Consumer<? super T> action) {
  // Code implementation here...
Setiap implementasi Iterable dapat menggunakan metode forEach() tanpa memerlukan implementasi metode baru. Kami kemudian dapat menggunakan kembali kode tersebut dengan metode default. Mari buat metode default kita sendiri:
public class DefaultMethodExample {

  public static void main(String[] args) {
    Challenger challenger = new JavaChallenger();
    challenger.doChallenge();
  }

}

class JavaChallenger implements Challenger { }

interface Challenger {

  default void doChallenge() {
    System.out.println("Challenger doing a challenge!");
  }
}
Hasil:
Penantang melakukan tantangan!
Berkenaan dengan metode default, penting untuk dicatat bahwa setiap metode tersebut perlu diterapkan. Metode default tidak boleh statis. Sekarang mari kita beralih ke kelas abstrak.

Inti dari kelas abstrak

Kelas abstrak dapat memiliki status dengan variabel instan. Artinya variabel instan dapat digunakan dan dimodifikasi. Berikut ini contohnya:
public abstract class AbstractClassMutation {

  private String name = "challenger";

  public static void main(String[] args) {
    AbstractClassMutation abstractClassMutation = new AbstractClassImpl();
    abstractClassMutation.name = "mutated challenger";
    System.out.println(abstractClassMutation.name);
  }

}

class AbstractClassImpl extends AbstractClassMutation { }
Kesimpulan:
penantang yang bermutasi

Metode abstrak di kelas abstrak

Seperti antarmuka, kelas abstrak dapat memiliki metode abstrak. Metode abstrak adalah metode tanpa isi. Berbeda dengan antarmuka, metode abstrak di kelas abstrak harus dinyatakan abstrak secara eksplisit. Berikut ini contohnya:
public abstract class AbstractMethods {

  abstract void doSomething();

}
Dan berikut adalah upaya untuk mendeklarasikan suatu metode tanpa implementasi dan tanpa kata kunci abstract :
public abstract class AbstractMethods {
   void doSomethingElse();
}
Sayangnya, ini menghasilkan kesalahan kompilasi:
Badan metode, atau deklarasi abstrak tidak ada

Kapan menggunakan kelas abstrak

Kelas abstrak direkomendasikan ketika Anda perlu mengimplementasikan keadaan yang bisa berubah. Misalnya, Java Collections Framework menyertakan kelas AbstrakList yang menggunakan variabel status. Jika Anda tidak perlu mempertahankan status kelas, biasanya lebih baik menggunakan antarmuka.

Perbedaan antara kelas abstrak dan antarmuka

Dari perspektif pemrograman berorientasi objek, perbedaan utama antara antarmuka dan kelas abstrak adalah antarmuka tidak dapat memiliki status, sedangkan kelas abstrak dapat memiliki status dengan variabel instan. Perbedaan utama lainnya adalah bahwa kelas dapat mengimplementasikan lebih dari satu antarmuka, namun mereka hanya dapat memperluas satu kelas abstrak. Solusi ini didasarkan pada fakta bahwa pewarisan berganda (memperluas lebih dari satu kelas) dapat menyebabkan kebuntuan kode. Pengembang bahasa Java memutuskan untuk menghindari hal ini. Perbedaan lainnya adalah antarmuka dapat diimplementasikan berdasarkan kelas atau diperluas melalui antarmuka, namun kelas hanya dapat diperluas. Penting untuk dicatat bahwa ekspresi lambda hanya dapat digunakan dengan antarmuka fungsional (artinya antarmuka dengan hanya satu metode), sedangkan kelas abstrak dengan hanya satu metode abstrak tidak dapat menggunakan ekspresi lambda. Berikut adalah beberapa perbedaan antara kelas abstrak dan antarmuka. Antarmuka:
  • Hanya dapat memiliki variabel statis akhir. Sebuah antarmuka tidak akan pernah bisa mengubah keadaannya sendiri.
  • Sebuah kelas dapat mengimplementasikan banyak antarmuka.
  • Dapat diimplementasikan menggunakan kata kunci implementasi. Sebuah antarmuka dapat memperluas antarmuka lain.
  • Metode hanya dapat menggunakan kolom final statis, parameter, atau variabel lokal.
  • Hanya antarmuka fungsional yang dapat menggunakan fungsi lambda di Java.
  • Tidak dapat memiliki konstruktor.
  • Mungkin memiliki metode abstrak.
  • Dapat memiliki metode default dan statis (diperkenalkan di Java 8).
  • Dapat memiliki metode pribadi dengan implementasi (diperkenalkan di Java 9).
Kelas abstrak:
  • Dapat memiliki variabel instan atau statis apa pun, dapat berubah atau tidak dapat diubah.
  • Sebuah kelas hanya dapat memperluas satu kelas abstrak.
  • Mungkin memiliki instance bidang, parameter, atau variabel lokal yang dapat diubah.
  • Kelas abstrak yang hanya memiliki satu metode abstrak tidak dapat menggunakan ekspresi lambda.
  • Mungkin memiliki konstruktor.
  • Dapat memiliki metode apa pun.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION