Konsep dasar pewarisan dan sintesis
Warisan: Kelas baru dapat dibangun berdasarkan kelas yang ada. Mewarisi kelas yang ada dapat menggunakan kembali metode dan domain kelas -kelas ini. Atas dasar ini, metode dan domain baru dapat ditambahkan untuk memperluas fungsi kelas.
Sintesis: Membuat objek asli di kelas baru disebut sintesis. Dengan cara ini Anda dapat menggunakan kembali kode yang ada tanpa mengubah formulirnya.
1. Sintaks yang diwariskan
Kata kunci meluas menunjukkan bahwa kelas baru berasal dari kelas yang ada. Kelas yang ada disebut kelas induk atau kelas dasar, dan kelas baru disebut subkelas atau kelas turunan. Misalnya:
siswa kelas memperluas orang {}Siswa kelas mewarisi orang. Kelas orang disebut kelas orang tua atau kelas dasar, dan kelas siswa disebut kelas subkelas atau turunan.
2. Sintesis sintesis
Sintesis relatif sederhana, yaitu membuat kelas yang ada di kelas.
siswa kelas {dog dog;}Gaya ke atas
1. Konsep Dasar
Peran warisan terletak pada penggunaan kembali kode. Karena warisan berarti bahwa semua metode kelas induk juga dapat digunakan dalam subkelas, pesan yang dikirim ke kelas induk juga dapat dikirim ke kelas turunan. Jika ada metode makan di kelas orang, maka akan ada metode ini di kelas siswa, yang berarti bahwa objek siswa juga merupakan tipe orang.
class person {public void eat () {System.out.println ("Eat");} static void show (Person P) {p.eat ();}} kelas publik Siswa memperluas orang {public static Main (string [] args) {Student S = New Student (); person.show (s); // ①}} {Student S = New (); orang.【Hasil operasi】:
makan
Metode acara yang didefinisikan secara langsung digunakan untuk menerima pegangan orang, tetapi pada ① ia menerima referensi ke objek siswa. Ini karena objek siswa juga merupakan objek orang. Dalam metode show, pegangan (referensi ke objek) yang diteruskan dapat berupa objek orang dan objek kelas yang diturunkan seseorang. Perilaku yang mengubah pegangan siswa menjadi pegangan orang menjadi pola ke atas.
2. Mengapa Anda perlu melacak bentuknya?
Mengapa Anda ingin dengan sengaja mengabaikan jenis objek yang menyebutnya saat memanggil Eat? Jika Anda membuat metode acara hanya mendapatkan pegangan siswa, tampaknya lebih intuitif dan mudah dimengerti, tetapi itu akan membuat setiap kelas baru berasal dari kelas orang mengimplementasikan metode pertunjukannya sendiri:
Nilai kelas {private int count = 1; nilai pribadi (int count) {this.count = count;} public static nilai akhir v1 = nilai baru (1), v2 = nilai baru (2), v3 = nilai baru (3);} class orang {public void eat (nilai v) {System.out.println ("orang.eat (); {System.out.println ("Teacher.eat ()");}} kelas siswa memperluas orang {public void eat (value v) {System.out.println ("student.eat ()");}} kelas publik UpcastingDemo {public static void show (student) {s.eat.v1);} public static static void show (Student) {s.eat.v1); {t.eat (value.v1);} public static void show (Person P) {p.eat (value.v1);} public static void main (string [] args) {student S = siswa baru (); guru t = baru guru (); orang p = orang baru (); show (s); show (t); show (p);Cacat yang jelas dalam pendekatan ini adalah bahwa perlu untuk mendefinisikan metode yang terkait erat dengan kelas turunan masing -masing kelas, menghasilkan banyak kode duplikat. Di sisi lain, jika Anda lupa kelebihan metode, Anda tidak akan melaporkan kesalahan. Tiga metode pertunjukan dalam contoh di atas dapat digabungkan menjadi satu:
public static void show (Person P) {p.eat (value.v1);} Ikatan Dinamis
Saat melakukan pertunjukan, hasil output adalah Student.eat (). Ini memang hasil yang diinginkan, tetapi tampaknya tidak dieksekusi dalam bentuk yang kami harapkan. Mari kita lihat metode pertunjukan lagi:
public static void show (Person P) {p.eat (value.v1);}Itu menerima pegangan seseorang. Saat melakukan pertunjukan, bagaimana ia tahu bahwa orang tersebut menangani poin ke objek siswa alih -alih objek guru? Kompiler tidak memiliki cara untuk mengetahuinya, yang melibatkan masalah yang mengikat untuk dijelaskan selanjutnya.
1. Metode Call Binding
Menghubungkan suatu metode dan badan metode yang sama bersama -sama disebut pengikatan. Jika pengikatan dilakukan sebelum berjalan, itu disebut "ikatan awal". Dalam contoh di atas, ketika hanya ada satu orang yang menangani, kompiler tidak tahu metode mana yang akan dihubungi. Java mengimplementasikan mekanisme panggilan metode yang dapat menentukan jenis objek selama operasi dan kemudian memanggil metode yang sesuai. Ikatan ini berdasarkan jenis objek ini disebut pengikatan dinamis selama operasi. Kecuali jika suatu metode dinyatakan final, semua metode di Java terikat secara dinamis.
Gunakan gambar untuk mewakili hubungan warisan dari bentuk ke atas:
Dalam kode, itu diringkas sebagai:
Shapes=newShape();
Menurut hubungan warisan, legal untuk menetapkan pegangan objek lingkaran yang dibuat ke suatu bentuk, karena lingkaran milik suatu bentuk.
Ketika salah satu metode kelas dasar disebut:
Shapes=newShape();
Pada saat ini, Circle.draw () dipanggil, yang disebabkan oleh pengikatan dinamis.
class person {void eat () {} void speak () {}} class boy memperluas orang {void eat () {System.out.println ("boy.eat ()");} void speak () {System.out.println ("boy.speak ()");}} class class {void (void) (); {System.out.println ("girl.eat ()");}} orang kelas publik {public static orang randperson () {switch ((int) (math.random () * 2)) {default: case 0: return new boy (); case 1: return new girl ();}} static void main public void publik [string [) [); i <p.length;Untuk semua kelas yang berasal dari orang, orang membangun antarmuka umum, dan semua kelas turunan memiliki dua perilaku: makan dan berbicara. Kelas turunan mengesampingkan definisi ini dan mendefinisikan kembali kedua perilaku. Di kelas utama, Randperson secara acak memilih pegangan objek orang. ** Gaya banding terjadi dalam pernyataan pengembalian. Pernyataan pengembalian ** mengambil pegangan laki -laki atau perempuan dan mengembalikannya sebagai tipe orang. Pada saat ini, saya tidak tahu jenis apa itu, saya hanya tahu itu adalah pegangan objek orang. Dalam metode utama, hubungi metode Randperson untuk mengisi objek orang ke array, tetapi tidak tahu situasi tertentu. Ketika metode makan dari setiap elemen array dipanggil, fungsi pengikatan dinamis adalah untuk mengeksekusi metode objek yang didefinisikan ulang.
Namun, pengikatan dinamis adalah prasyarat, dan metode pengikatan harus ada di kelas dasar, jika tidak itu tidak akan dikompilasi dan dilewati.
class person {void eat () {System.out.println ("person.eat ()");}} class boy memperluas orang {void eat () {System.out.println ("boy.eat ()");} void speak () {System.println ("boy.speak ()"; {Person p = new boy (); p.eat (); p.speak (); // metode speak () tidak terdefinisi untuk tipe orang}}Jika tidak ada metode override yang didefinisikan dalam subkelas, metode di kelas induk disebut:
class Person {void eat () {System.out.println ("person.eat ()");}} class boy memperluas orang {} orang kelas publik {public static void main (string [] args) {person p = new boy (); p.eat ();}}【Hasil operasi】:
Orang.eat ()
2. Ikatan metode statis
Tambahkan kata kunci statis ke metode di atas dan ubah menjadi metode statis:
class Person {static void eat() {System.out.println("Person.eat()");}static void speak() {System.out.println("Person.speak()");}}class Boy extends Person {static void eat() {System.out.println("Boy.eat()");}}static void speak() {System.out.println("Boy.speak()");}}class Girl extends Person {static void eat() {System.out.println("Girl.eat()");}static void speak() {System.out.println("Girl.speak()");}}public class Persons {public static Person randPerson() {switch ((int) (math.random () * 2)) {default: case 0: return new boy (); case 1: return new girl ();}} public static void main (string [] args) {person [] p = orang baru [4]; untuk (int i = 0; i <p.length; i ++) {p [i] = randon; <p.length; i ++) {p [i] .eat ();}} 【Hasil operasi】:
Orang.eat ()
Orang.eat ()
Orang.eat ()
Orang.eat ()
Hasil Pengamatan: Untuk metode statis, tidak peduli apa objek subclass yang dirujuk oleh kelas induk, metode kelas induk disebut.
Formula mnemonik
- Metode statis: Metode statis melihat kelas induk
-Metode non-statis: Metode non-statis melihat subkelas
Meringkaskan
Di atas adalah semua konten dari interpretasi terperinci artikel ini tentang konsep warisan Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!