Anda mungkin menemukan diri Anda dalam posisi untuk berpikir tentang membuat final metode statis, dengan mempertimbangkan hal-hal berikut:
Memiliki kelas-kelas berikut:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
Sekarang cara yang 'benar' untuk memanggil metode ini adalah
A.ts();
B.ts();
yang akan menghasilkan AB
tetapi Anda juga bisa memanggil metode pada instance:
A a = new A();
a.ts();
B b = new B();
b.ts();
yang akan menghasilkan AB
juga.
Sekarang pertimbangkan yang berikut:
A a = new B();
a.ts();
yang akan mencetak A
. Itu mungkin mengejutkan Anda karena Anda benar-benar memiliki objek kelas B
. Tetapi karena Anda memanggilnya dari referensi tipe A
, itu akan memanggil A.ts()
. Anda dapat mencetak B
dengan kode berikut:
A a = new B();
((B)a).ts();
Dalam kedua kasus, objek yang Anda miliki sebenarnya dari kelas B
. Tetapi bergantung pada penunjuk yang menunjuk ke objek, Anda akan memanggil metode dari A
atau dariB
.
Sekarang katakanlah Anda adalah pengembang kelas A
dan Anda ingin mengizinkan sub-pengelompokan. Tetapi Anda benar-benar menginginkan metode ts()
, kapan pun dipanggil, bahkan dari subclass, yaitu melakukan apa yang Anda inginkan dan tidak disembunyikan oleh versi subclass. Kemudian Anda bisa membuatnya final
dan mencegahnya disembunyikan di subclass. Dan Anda dapat yakin bahwa kode berikut akan memanggil metode dari kelas Anda A
:
B b = new B();
b.ts();
Oke, harus diakui entah bagaimana dibangun, tapi mungkin masuk akal untuk beberapa kasus.
Anda tidak boleh memanggil metode statis pada instance tetapi langsung di kelas - maka Anda tidak akan mengalami masalah itu. Juga IntelliJ IDEA misalnya akan menampilkan peringatan, jika Anda memanggil metode statis pada sebuah instance dan juga jika Anda membuat metode statis final.