JavaRush /Blog Jawa /Random-JV /Ngopi #140. Kelas abstrak lan antarmuka ing Jawa

Ngopi #140. Kelas abstrak lan antarmuka ing Jawa

Diterbitake ing grup
Sumber: InfoWorld Dina iki sampeyan bakal sinau ing kasus apa pangembang kudu nggunakake kelas abstrak lan ing kasus apa antarmuka. Kita uga bakal nemtokake beda antarane unsur-unsur basa Jawa iki lan carane nggunakake ing program. Ngopi #140.  Kelas abstrak lan antarmuka ing Jawa - 1Kelas abstrak lan antarmuka cukup umum ing kode Jawa lan malah ing Java Development Kit (JDK) dhewe. Saben unsur kasebut nduweni tujuan sing beda:
  • Antarmuka minangka konstruksi ing basa Jawa sing mbantu ngleksanakake metode abstrak lan konstanta statis.
  • Kelas abstrak padha karo kelas biasa, kajaba bisa kalebu metode abstrak, yaiku metode tanpa awak. Kelas abstrak ora bisa digawe.
Akeh pangembang mikir yen antarmuka lan kelas abstrak padha, nanging ing kasunyatan iki ora sakabehe bener. Ayo ndeleng prabédan utama ing antarane.

Apa iku antarmuka

Ing inti, antarmuka minangka kontrak, mula gumantung saka implementasine kanggo nemtokake tujuan kanggo nggawe. Antarmuka ora bisa nggunakake variabel conto sing bisa diganti, mung bisa nggunakake variabel pungkasan.

Nalika nggunakake antarmuka

Antarmuka migunani banget kanggo misahake kode lan ngetrapake polimorfisme. Kita bisa ndeleng iki ing JDK kanthi antarmuka List :
public interface List<E> extends Collection<E> {

    int size();
    boolean isEmpty();
    boolean add(E e);
    E remove(int index);
    void clear();
}
Kaya sing sampeyan ngerteni, kode iki, sanajan ringkes, cukup deskriptif. Kita bisa kanthi gampang ndeleng tandha cara sing bakal digunakake kanggo ngetrapake metode ing antarmuka nggunakake kelas konkrit. Antarmuka List ngemot kontrak sing bisa ditindakake dening ArrayList , Vector , LinkedList , lan kelas liyane. Kanggo nggunakake polimorfisme, kita mung bisa ngumumake jinis variabel kita nggunakake List banjur pilih salah sawijining conto sing kasedhiya. Iki conto liyane:
List list = new ArrayList();
System.out.println(list.getClass());

 List list = new LinkedList();
 System.out.println(list.getClass());
Outpute yaiku:
kelas java.util.ArrayList kelas java.util.LinkedList
Ing kasus iki, cara implementasine kanggo ArrayList , LinkedList , lan Vector beda-beda, yaiku skenario sing apik banget kanggo nggunakake antarmuka. Yen sampeyan sok dong mirsani sing akeh kelas kagungane kelas induk karo tumindak cara padha nanging prilaku beda. Ing kahanan kaya mengkono, dianjurake kanggo nggunakake antarmuka. Sabanjure, ayo goleki sawetara opsi kanggo nggunakake antarmuka.

Metode Antarmuka Overriding

Kaya sing wis dingerteni, antarmuka minangka jinis kontrak sing kudu ditindakake dening kelas konkrit. Metode antarmuka implisit abstrak lan mbutuhake implementasi konkrit saka kelas. Iki contone:
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 rampung!
Elinga yen cara antarmuka implisit abstrak. Iki tegese kita ora perlu nyatakake kanthi jelas abstrak.

Variabel konstan

Aturan liyane sing kudu dielingake yaiku antarmuka mung bisa ngemot variabel konstan. Iki contone:
public class Challenger {

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

}
Ing kene loro variabel kasebut implisit final lan statis . Iki tegese padha pancet, independen saka conto, lan ora bisa diganti. Saiki kita bakal nyoba ngganti variabel ing antarmuka Challenger , ayo ngomong kaya iki:
Challenger.number = 8;
Challenger.name = "Another Challenger";
Iki bakal nyebabake kesalahan kompilasi:
Ora bisa menehi nilai kanggo variabel final 'nomer' Ora bisa nemtokake nilai kanggo variabel final 'jeneng'

Metode Default

Nalika cara standar dienal ing Jawa 8, sawetara pangembang ngira bakal padha karo kelas abstrak. Nanging, iki ora bener amarga antarmuka ora bisa duwe negara. Cara standar bisa uga duwe implementasine, nanging metode abstrak ora. Cara standar minangka asil saka inovasi kanthi ekspresi lan stream lambda, nanging kita kudu nggunakake kanthi ati-ati. Cara ing JDK sing nggunakake cara gawan forEach () , kang bagéan saka antarmuka Iterable . Tinimbang nyalin kode menyang saben implementasi Iterable , kita mung bisa nggunakake maneh metode forEach :
default void forEach(Consumer<? super T> action) {
  // Code implementation here...
Sembarang implementasine Iterable bisa nggunakake cara forEach () tanpa mbutuhake implementasine metode anyar. Kita banjur bisa nggunakake maneh kode kanthi cara standar. Ayo nggawe cara standar dhewe:
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!");
  }
}
asil:
Challenger nindakake tantangan!
Babagan metode standar, penting kanggo dicathet yen saben metode kasebut kudu ditindakake. Cara standar ora bisa statis. Saiki ayo pindhah menyang kelas abstrak.

Inti saka kelas abstrak

Kelas abstrak bisa duwe negara kanthi variabel conto. Iki tegese variabel conto bisa digunakake lan diowahi. Iki contone:
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 mutated

Metode abstrak ing kelas abstrak

Kaya antarmuka, kelas abstrak bisa duwe metode abstrak. Metode abstrak yaiku metode tanpa awak. Ora kaya antarmuka, metode abstrak ing kelas abstrak kudu diumumake kanthi tegas abstrak. Punika conto:
public abstract class AbstractMethods {

  abstract void doSomething();

}
Lan iki minangka upaya kanggo ngumumake metode tanpa implementasine lan tanpa tembung kunci abstrak :
public abstract class AbstractMethods {
   void doSomethingElse();
}
Sayange, iki nyebabake kesalahan kompilasi:
Badan metode ilang, utawa nyatakake abstrak

Nalika nggunakake kelas abstrak

Kelas abstrak dianjurake nalika sampeyan kudu ngetrapake negara sing bisa diganti. Contone, Java Collections Framework kalebu kelas AbstractList sing nggunakake status variabel. Ing kasus sing ora perlu kanggo njaga negara kelas, iku biasane luwih apik kanggo nggunakake antarmuka.

Bedane antarane kelas abstrak lan antarmuka

Saka perspektif pemrograman berorientasi obyek, prabédan utama antarane antarmuka lan kelas abstrak yaiku antarmuka ora bisa duwe negara, dene kelas abstrak bisa duwe negara kanthi variabel conto. Bentenane penting liyane yaiku kelas bisa ngetrapake luwih saka siji antarmuka, nanging mung bisa ngluwihi siji kelas abstrak. Solusi iki adhedhasar kasunyatan manawa sawetara warisan (ngluwihi luwih saka siji kelas) bisa nyebabake deadlock kode. Para pangembang basa Jawa mutusake kanggo nyingkiri iki. Bentenipun liyane iku antarmuka bisa dipun ginakaken dening kelas utawa ditambahi dening antarmuka, nanging kelas mung bisa ditambahi. Wigati dimangerteni manawa ekspresi lambda mung bisa digunakake kanthi antarmuka fungsional (tegese antarmuka mung siji metode), dene kelas abstrak kanthi mung siji metode abstrak ora bisa nggunakake ekspresi lambda. Mangkene sawetara bedane antarane kelas abstrak lan antarmuka. Antarmuka:
  • Mung bisa duwe variabel statis final. Antarmuka ora bisa ngganti kahanan dhewe.
  • Kelas bisa ngetrapake macem-macem antarmuka.
  • Bisa dileksanakake nggunakake tembung kunci implements. Antarmuka bisa ngluwihi antarmuka liyane.
  • Metode mung bisa nggunakake kolom pungkasan statis, parameter, utawa variabel lokal.
  • Mung antarmuka fungsional sing bisa nggunakake fungsi lambda ing Jawa.
  • Ora bisa duwe konstruktor.
  • Bisa uga ana cara abstrak.
  • Bisa duwe cara standar lan statis (dikenalake ing Jawa 8).
  • Bisa duwe metode pribadi kanthi implementasine (dikenalake ing Jawa 9).
Kelas abstrak:
  • Bisa duwe conto utawa variabel statis, bisa diganti utawa ora bisa diganti.
  • Kelas mung bisa ngluwihi siji kelas abstrak.
  • Bisa uga duwe conto kolom, parameter, utawa variabel lokal sing bisa diganti.
  • Kelas abstrak kanthi mung siji metode abstrak ora bisa nggunakake ekspresi lambda.
  • Bisa duwe konstruktor.
  • Bisa duwe cara apa wae.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION