Ini pertanyaan wawancara favorit . Dengan pertanyaan ini, pewawancara mencoba untuk mengetahui seberapa baik Anda memahami perilaku objek sehubungan dengan konstruktor, metode, variabel kelas (variabel statis) dan variabel instan.
import java.util.ArrayList;
import java.util.List;
class Test {
private final List foo;
public Test() {
foo = new ArrayList();
foo.add("foo"); // Modification-1
}
public void setFoo(List foo) {
//this.foo = foo; Results in compile time error.
}
}
Dalam kasus di atas, kami telah mendefinisikan konstruktor untuk 'Tes' dan memberinya metode 'setFoo'.
Tentang konstruktor: Konstruktor dapat dipanggil hanya satu kali per pembuatan objek dengan menggunakan new
kata kunci. Anda tidak dapat memanggil konstruktor beberapa kali, karena konstruktor tidak dirancang untuk melakukannya.
Tentang metode: Suatu metode dapat dipanggil sebanyak yang Anda inginkan (Bahkan tidak pernah) dan kompiler mengetahuinya.
skenario 1
private final List foo; // 1
foo
adalah variabel instan . Ketika kita membuat Test
objek kelas maka variabel instan foo
, akan disalin di dalam objek Test
kelas. Jika kita menetapkan foo
di dalam konstruktor, maka kompiler tahu bahwa konstruktor akan dipanggil hanya sekali, jadi tidak ada masalah menugaskannya di dalam konstruktor.
Jika kita menetapkan foo
di dalam suatu metode, kompiler tahu bahwa suatu metode dapat dipanggil beberapa kali, yang berarti nilainya harus diubah beberapa kali, yang tidak diperbolehkan untuk suatu final
variabel. Jadi kompiler memutuskan konstruktor adalah pilihan yang bagus! Anda dapat menetapkan nilai ke variabel akhir hanya satu kali.
Skenario 2
private static final List foo = new ArrayList();
foo
sekarang menjadi variabel statis . Ketika kita membuat turunan Test
kelas, foo
tidak akan disalin ke objek karena foo
statis. Sekarang foo
bukan properti independen dari setiap objek. Ini adalah properti Test
kelas. Tetapi foo
dapat dilihat oleh banyak objek dan jika setiap objek yang dibuat dengan menggunakan new
kata kunci yang pada akhirnya akan memanggil Test
konstruktor yang mengubah nilai pada saat beberapa objek dibuat (Ingat static foo
tidak disalin di setiap objek, tetapi dibagi antara beberapa objek .)
Skenario 3
t.foo.add("bar"); // Modification-2
Di atas Modification-2
adalah dari pertanyaan Anda. Dalam kasus di atas, Anda tidak mengubah objek referensi pertama, tetapi Anda menambahkan konten di dalamnya foo
yang diizinkan. Compiler mengeluh jika Anda mencoba untuk menetapkan new ArrayList()
ke foo
variabel referensi.
Aturan Jika Anda telah menginisialisasi final
variabel, maka Anda tidak dapat mengubahnya untuk merujuk ke objek yang berbeda. (Dalam hal ini ArrayList
)
kelas akhir tidak dapat disubklasifikasikan metode
akhir tidak dapat diganti. (Metode ini dalam superclass) metode
terakhir dapat menimpa. (Baca ini dengan cara tata bahasa. Metode ini dalam subkelas)