Pertanyaan Java menimpa metode saat membuat instance baru dari suatu kelas


Ini mungkin sederhana untuk pengembang java berpengalaman tapi aku hanya tidak bisa mengetahuinya. Saya membaca posting dari sini. Kode itu

View v = new View(this) {
    @Override
    protected void onDraw(Canvas canvas) {
        System.out.println("large view on draw called");
        super.onDraw(canvas);
    }
};

Itu adalah pertanyaan Android. Di sini pengguna membuat instance tampilan dan menimpa metode dalam satu baris. Apakah ada nama untuk pengkodean semacam ini?

Keraguan saya yang kedua adalah, ia mengganti metode yang dilindungi dari paket lain. Tidak dilindungi paket rata-rata pribadi. Saya tahu ini akan berhasil ketika saya mencobanya tetapi saya tidak tahu mengapa itu berhasil. Jadi mengapa kode ini berfungsi?

Saya sudah mencoba untuk google ini dan mencari di SO sebelum bertanya tetapi tidak bisa mencari jawaban.


32
2017-09-08 11:54


asal


Jawaban:


protected berarti (kira-kira) "tersedia untuk sub-kelas". (Lihat meja ini.) Karena new View(this) { ... } menciptakan subclass, adalah mungkin untuk mengganti metode di dalamnya.

Dalam hal ini tidak masalah jika Anda berada dalam paket yang berbeda. (Lihat protected baris dan kolom kedua di meja ini.) Fakta bahwa metode ini dalam subclass cukup untuk "mendapatkan akses" ke metode yang dilindungi.


Pertanyaan tindak lanjut potensial: Apa artinya itu, jika saya tidak dapat memanggil metode itu?

Semua metode di Java adalah virtual. Ini berarti kapan pun View kelas melakukan panggilan yang tampaknya internal ke onDraw metode, panggilan ini akan dikirim ke metode ditimpa.


18
2017-09-08 11:56



Itu bukan jenis pengkodean. Itu adalah kelas anonim Java. Ini sangat umum di Android dan secara umum dengan pendengar acara dan hal semacam itu.

Untuk lebih jelasnya Anda bisa membaca Link ini (mungkin bukan yang terbaik):

Kelas-kelas batin anonim sangat berguna dalam beberapa situasi. Untuk   Sebagai contoh, pertimbangkan situasi di mana Anda perlu membuat instance   sebuah objek tanpa membuat subkelas dari suatu kelas dan juga melakukan   tugas tambahan seperti metode overloading.

Tentang pertanyaan kedua Anda, kata kunci protected berarti bahwa metode ini hanya tersedia untuk subclass, sehingga dimungkinkan untuk mengganti metode.


9
2017-09-08 11:56



Ini adalah kelas anonim. Anda benar bahwa Anda mengesampingkan metode yang dilindungi dan ini sangat normal. Metode yang dilindungi terlihat, dan karenanya dapat dikesampingkan, oleh subkelas, yang telah Anda buat di sini.

Paket yang dilindungi adalah ruang lingkup default ketika Anda tidak memberikan ruang lingkup untuk variabel atau metode Anda. Itu berbeda dengan dilindungi.


3
2017-09-08 11:58



Sama seperti orang lain di sini sudah dijawab ini disebut kelas anonim, dan mengesampingkan metode yang dilindungi adalah legal karena metode yang dilindungi terlihat oleh kelas anak dan kelas dalam paket yang sama.


1
2017-09-08 12:00



Begitu banyak jawaban ada di sana untuk "dilindungi", jadi saya akan ke yang lain :)
@override menginformasikan kompiler untuk mengganti metode kelas dasar, dan jika tidak ada metode kelas dasar tanda tangan ini maka melemparkan kesalahan kompilasi.

Ini disebut anotasi. Anda dapat mencari topik anotasi di java. Anda juga dapat membuat anotasi khusus.

Salam,
SSuman185


1
2017-09-08 12:09