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 newkata 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
fooadalah variabel instan . Ketika kita membuat Testobjek kelas maka variabel instan foo, akan disalin di dalam objek Testkelas. Jika kita menetapkan foodi dalam konstruktor, maka kompiler tahu bahwa konstruktor akan dipanggil hanya sekali, jadi tidak ada masalah menugaskannya di dalam konstruktor.
Jika kita menetapkan foodi dalam suatu metode, kompiler tahu bahwa suatu metode dapat dipanggil beberapa kali, yang berarti nilainya harus diubah beberapa kali, yang tidak diperbolehkan untuk suatu finalvariabel. 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();
foosekarang menjadi variabel statis . Ketika kita membuat turunan Testkelas, footidak akan disalin ke objek karena foostatis. Sekarang foobukan properti independen dari setiap objek. Ini adalah properti Testkelas. Tetapi foodapat dilihat oleh banyak objek dan jika setiap objek yang dibuat dengan menggunakan newkata kunci yang pada akhirnya akan memanggil Testkonstruktor yang mengubah nilai pada saat beberapa objek dibuat (Ingat static footidak disalin di setiap objek, tetapi dibagi antara beberapa objek .)
Skenario 3
t.foo.add("bar"); // Modification-2
Di atas Modification-2adalah dari pertanyaan Anda. Dalam kasus di atas, Anda tidak mengubah objek referensi pertama, tetapi Anda menambahkan konten di dalamnya fooyang diizinkan. Compiler mengeluh jika Anda mencoba untuk menetapkan new ArrayList()ke foovariabel referensi.
Aturan Jika Anda telah menginisialisasi finalvariabel, 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)