Saya memiliki kelas yang disebut A (induk) dan kelas B (subkelas A)

Pertanyaan saya adalah apa perbedaan antara baris berikutnya:

 B b1 = new B();
 A b2 = new B();

Saya tahu bahwa variabel dan metode di kelas B tidak dapat diakses jika objek b2

Tapi bagaimana cara kerjanya di memori? apa gunanya ini? kapan harus menggunakan masing-masing?

-1
Zizoo 12 Maret 2017, 23:21

2 jawaban

Jawaban Terbaik

Salah satu alasan untuk menggunakan superclass sebagai tipe variabel:

Misalkan Anda memiliki kelas Hewan, dan beberapa subkelas seperti Gajah, Harimau, Jerapah, Kuda Nil, dll.

Sekarang Anda memiliki kelas lain yang disebut Zoo, yang berisi Array yang disebut hewan. Maka Anda dapat memiliki:

   animals[0] = new Tiger();
   anumals[1] = new Elephant();

Tetapi lebih baik memiliki hewan yang dideklarasikan sebagai ArrayList yang dapat tumbuh atau menyusut:

  animals.add( new Tiger() );
  animals.add( new Elephant() );
  animals.add( new Hippo() );

Jika subkelas memiliki metode yang bukan merupakan kelebihan metode induk, Anda masih dapat mengakses metode subkelas melalui variabel superkelas dengan mentransmisikannya:

 Animal a = animals.get(index);
 if ( a instanceof Tiger ) {
   ((Tiger)a).tigerMethod( ... );
 }

Bukannya hal semacam ini mungkin bukan desain terbaik, tetapi itu menggambarkan intinya.

1
FredK 12 Maret 2017, 20:46

Objek dapat memiliki beberapa Antarmuka, katakanlah kelas B mewarisi dari kelas A: Kelas A dapat memiliki 5 metode publik, Kelas B memiliki tambahan 5 metode publik sendiri, jadi di kelas B Anda melihat semua 10 metode, sedangkan menggunakan kelas A Anda hanya melihat 5 .

Ini penting, karena dengan cara ini Anda dapat mengontrol bagian mana (antarmuka) dari kelas yang Anda berikan kepada orang lain (untuk digunakan oleh pemrogram lain).

Untuk contoh:

Jika Anda kembali dari metode publik Anda sebuah Daftar<>, seperti:

public List<SomeClass> giveMeSomeList() {
   // both return statements are perfectly valid as return type is List<>
   return new LinkedList<SomeClass>();
   // return new ArrayList<SomeClass>();
}

Maka Anda diizinkan untuk menggunakan implementasi Daftar<> yang Anda miliki mis. Anda dapat mengubah implementasi, yang Anda buat dan kembalikan ArrayList<> atau LinkedList<> dari metode Anda, tetapi karena tipe pengembalian yang dideklarasikan adalah List<> tidak ada salahnya, tidak ada yang akan bergantung pada Anda mengembalikan implementasi konkret (di setidaknya Anda tidak bertanggung jawab untuk itu), hanya saja itu akan menjadi semacam Daftar<>. Tetapi jika Anda kembali dari metode publik Anda implementasi kelas yang sangat konkret, maka Anda memberi orang lain undangan untuk menggunakan dan mengandalkan implementasi konkret ini, yang pada gilirannya memblokir metode dari kemampuan untuk mengubah implementasi yang mendasarinya tanpa membahayakan kode lain. Jadi dengan cara ini (menggunakan tipe yang sesuai) Anda dapat membuat beberapa batasan pada programmer lain tentang metode mana yang diizinkan untuk mereka gunakan (antarmuka), dan memberi Anda kebebasan untuk mengubah implementasi di masa depan - seperti pada contoh dengan daftar .

Saat Anda menggunakan antarmuka dalam tipe argumen metode, Anda membuat metode lebih umum, karena dapat digunakan dengan subtipe (atau tipe) antarmuka apa pun. Terkadang Anda hanya membutuhkan implementasi yang sangat konkret sebagai argumen untuk metode Anda, karena tanpa itu Anda tidak dapat melakukan operasi yang diperlukan, jadi Anda akan bergantung pada tipe yang sangat konkret untuk dipasok ke metode Anda, dan mendeklarasikan tipe itu dalam argumen metode.

0
Krzysztof Cichocki 12 Maret 2017, 20:48