1. Kapabilitas

Kanggo luwih ngerti keuntungan saka antarmuka lan ngendi kanggo nggunakake, kita kudu pirembagan bab sawetara liyane abstrak.

Kelas biasane nggawe model obyek tartamtu. Antarmuka kurang cocog karo obyek, lan luwih cocog karo kemampuan utawa perane.

Inti saka antarmuka

Contone, barang kaya mobil, pit, sepedha motor, lan roda paling apik dituduhake minangka kelas lan obyek. Nanging kabisan - kayata "Aku bisa ditunggangi", "Aku bisa ngeterake wong", "Aku bisa ngadeg" - luwih diwenehi antarmuka. Ing ngisor iki sawetara conto:

Kode Katrangan
interface CanMove
{
   void move(String newLocation);
}
Cocog karo kemampuan kanggo mindhah
interface Rideable
{
   void ride(Passenger passenger);
}
Cocog karo kemampuan kanggo ditunggangi
interface CanTransport
{
   void addStuff(Object stuff);
   Object removeStuff();
}
Cocog karo kemampuan kanggo ngangkut barang
class Wheel implements CanMove
{
   ...
}
Kelas Wheelbisa pindhah
class Car implements CanMove, Rideable, CanTransport
{
   ...
}
Kelas Carbisa obah, ditunggangi, lan ngeterake barang
class Skateboard implements CanMove, Rideable
{
   ...
}
Kelas Skateboardbisa obah lan ditunggangi


2. Peran

Antarmuka banget nyederhanakake urip programer. Kerep banget, program duwe ewu obyek, atusan kelas, nanging mung sawetara rolas antarmuka , IE peran . Ana sawetara peran, nanging ana akeh cara kanggo gabungke (kelas).

Intine yaiku sampeyan ora kudu nulis kode ing saben kelas kanggo sesambungan karo saben kelas liyane. Sampeyan mung kudu sesambungan karo peran (antarmuka).

Mbayangno sampeyan minangka pelatih pet. Saben kewan sing sampeyan lakoni bisa duwe sawetara kabisan sing beda. Sampeyan njaluk menyang bantahan grapyak karo pepadhamu bab kang pets bisa nggawe paling rame. Kanggo ngrampungake masalah kasebut, sampeyan mung baris kabeh pets sing bisa "ngomong", lan menehi prentah: Ngomong!

Sampeyan ora preduli apa jenis kewan utawa kabisan liyane. Malah yen padha bisa nindakake triple back somersault. Ing wayahe tartamtu, sampeyan mung kasengsem ing kemampuan kanggo ngomong banter. Mangkene apa sing bakal katon ing kode:

Kode Katrangan
interface CanSpeak
{
   void speak();
}
Kapabilitas CanSpeak. Antarmuka iki mangertos printah kanggo speak, tegesé wis cara sing cocog.
class Cat implements CanSpeak
{
   void speak()
   {
      println("MEOW");
   }
}

class Dog implements CanSpeak
{
   void speak()
   {
      println("WOOF");
   }
}

class Fish
{
   ...
}
Kéwan sing nduweni fitur iki.

Kanggo nggampangake pangerten, kita nyedhiyakake jeneng kelas ing basa Inggris. Iki diijini ing Jawa, nanging banget ora dikarepake.













Kita Fishora duwe kemampuan kanggo ngomong (ora ngleksanakake antarmuka CanSpeak).

public static void main(String[] args)
{
   // Add all the animals to the list
   ArrayList pets = new ArrayList();
   pets.add(new Cat());
   pets.add(new Dog());
   pets.add(new Fish());

   // If the ability exists, then make a sound
   for(Object pet: pets)
   {
      if (pet instanceof CanSpeak)
      {
         CanSpeak loudmouth = (CanSpeak) pet;
         loudmouth.speak();
      }
   }
}
Lan kepiye carane menehi prentah?

Nalika jumlah kelas ing program sampeyan tekan ewonan, sampeyan ora bakal bisa urip tanpa antarmuka. Tinimbang njlèntrèhaké interaksi ewu kelas, iku cukup kanggo njlèntrèhaké interaksi sawetara rolas antarmuka - iki nemen simplifies urip.

Lan yen digabungake karo polimorfisme, pendekatan iki umume sukses banget.



3. defaultImplementasi metode antarmuka

Kelas abstrak bisa duwe variabel lan implementasine metode, nanging ora bisa duwe sawetara warisan. Antarmuka ora bisa duwe variabel utawa implementasine metode, nanging bisa duwe sawetara warisan.

Kahanan kasebut dituduhake ing tabel ing ngisor iki:

Kapabilitas / properti Kelas abstrak Antarmuka
Variabel
Implementasi metode
Multiple warisan

Dadi, sawetara programer pancen pengin antarmuka duwe kemampuan kanggo ngetrapake metode. Nanging duwe kemampuan kanggo nambah implementasine metode ora ateges sing siji bakal tansah ditambahake. Tambah yen sampeyan pengin. Utawa yen ora, banjur aja.

Kajaba iku, masalah karo pirang-pirang warisan utamane amarga variabel. Ing acara apa wae, iku sing diputusake lan ditindakake. Miwiti karo JDK 8, Jawa ngenalake kemampuan kanggo nambah implementasi metode menyang antarmuka.

Mangkene tabel sing dianyari (kanggo JDK 8 lan ndhuwur):

Kapabilitas / properti Kelas abstrak Antarmuka
Variabel
Implementasi metode
Multiple warisan

Saiki kanggo kelas abstrak uga antarmuka, sampeyan bisa ngumumake metode kanthi utawa tanpa implementasine. Lan iki warta apik banget!

Ing kelas abstrak, metode tanpa implementasine kudu didhisiki karo abstracttembung kunci. Sampeyan ora perlu nambah apa wae sadurunge metode kanthi implementasine. Ing antarmuka, ngelawan bener. Yen metode ora duwe implementasine, mula ora ana sing kudu ditambahake. Nanging yen ana implementasine, banjur defaulttembung kunci kudu ditambahake.

Kanggo gamblang, kita nampilake informasi iki ing tabel cilik ing ngisor iki:

Kapabilitas / properti Kelas abstrak Antarmuka
Metode tanpa implementasine abstract
Metode karo implementasine default

Masalah

Nggunakake antarmuka sing nduweni cara bisa nyederhanakake hierarki kelas gedhe. Contone, abstrak InputStreamlan OutputStreamkelas bisa diumumake minangka antarmuka! Iki ngidini kita nggunakake luwih asring lan luwih trep.

Nanging wis ana puluhan yuta (miliar?) kelas Jawa ing donya. Lan yen sampeyan miwiti ngganti perpustakaan standar, sampeyan bisa uga ngrusak. Kaya kabeh! 😛

Supaya ora sengaja ngilangi program lan perpustakaan sing wis ana, diputusake yen implementasi metode ing antarmuka bakal duwe precedence warisan sing paling murah .

Contone, yen siji antarmuka marisi antarmuka liyane sing nduweni metode, lan antarmuka pisanan nyatakake cara sing padha nanging tanpa implementasine, banjur implementasi metode saka antarmuka warisan ora bakal tekan antarmuka warisan. Tuladha:

interface Pet
{
   default void meow()
   {
      System.out.println("Meow");
   }
}

interface Cat extends Pet
{
   void meow(); // Here we override the default implementation by omitting an implementation
}

class Tom implements Cat
{
}

Kode kasebut ora bakal dikompilasi amarga Tomkelas kasebut ora ngetrapake meow()metode kasebut.