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 ABtetapi Anda juga bisa memanggil metode pada instance:
A a = new A();
a.ts();
B b = new B();
b.ts();
yang akan menghasilkan ABjuga.
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 Bdengan 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 Aatau dariB .
Sekarang katakanlah Anda adalah pengembang kelas Adan 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 finaldan 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.