Betulkan: Kaedah Bukan Statik Tidak boleh Dirujuk dari Konteks Statik

Ramai pengaturcara menghadapi mesej ralat ' Kaedah tidak statik tidak boleh dirujuk dari konteks statik ' apabila mereka sedang kod. Mesej ralat ini tidak khusus dan boleh berlaku di mana-mana IDE jika syarat-syarat untuk kesilapan itu benar.

Kaedah Non Statik Tidak Boleh Dirujuk dari Konteks Statik

Ini adalah kesilapan yang sangat biasa untuk pemula di mana programmer cuba menggunakan kelas 'secara statistik' tanpa membuat contoh kelas. Terdapat beberapa syarat yang mesti dipenuhi apabila anda menggunakan kelas yang statik. Dalam artikel ini, kami akan melalui beberapa kes yang berbeza dan membimbing anda bagaimana menggunakan kelas statik.

Apakah Kaedah Statik?

Menambah kata kunci 'statik' kepada kaedah mana-mana kaedah ini dikenali sebagai kaedah statik. Kaedah statik kepunyaan kelas dan bukan kepunyaan objek (yang merupakan norma). Kaedah statik boleh digunakan dengan mudah tanpa syarat membuat contoh kelas.

Terdapat beberapa kegunaan kaedah Statik contohnya, menggunakannya, anda boleh menukar ahli data statik dan nilainya. Walau bagaimanapun, terdapat beberapa batasan apabila menggunakan kaedah Statik. Sebagai contoh, jika anda ingin mengakses medan bukan statik kelas anda, anda mesti menggunakan kaedah bukan statik. Oleh itu, kaedah statik digunakan dengan sangat jarang tetapi mereka mempunyai manfaatnya.

Berikut adalah contoh ringkas tentang bagaimana kaedah statik boleh dibuat untuk menukar harta semua objek.

 pelajar kelas {int roll_no; Nama rentetan; statik String college = "InformationTech"; void change () {System.out.println (rollno + "" + name + "" + kolej);} public static void main (String args []) {Students.change (); Pelajar stu_1 = Pelajar baru (100, "Mexico"); Pelajar stu_2 = Pelajar baru (202, Pelajar baru (309, "British"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Keluaran program ini akan:

 100 Pengurusan Mexico 202 Pengurusan Amerika 309 Pengurusan British 

Apakah Perbezaan antara kelas dan contoh kelas?

Fikirkan anda berjalan di jalanan dan anda melihat kereta. Kini anda segera mengetahui bahawa ini adalah kereta walaupun anda tidak tahu apa model atau jenisnya. Ini kerana anda tahu bahawa ini tergolong dalam kelas 'kereta' yang sudah anda ketahui. Fikirkan kelas di sini sebagai templat atau idea.

Sekarang ketika anda bergerak lebih dekat, anda melihat model dan membuat kereta. Di sini anda mengenali 'contoh' kereta 'kelas'. Di sini semua sifat akan hadir dengan terperinci; roda, kuasa kuda, rim dan lain-lain.

Contoh sifat boleh jadi bahawa 'kereta' kelas menyatakan bahawa semua kereta sepatutnya mempunyai roda. Kereta yang anda lihat (contoh kelas kereta) mempunyai rim aloi.

Dalam pengaturcaraan berorientasikan objek, anda menentukan kelas sendiri dan di dalam kelas, anda menentukan medan jenis 'warna'. Setiap kali kelas itu ditiru, memori secara automatik dikhaskan untuk warna pada backend dan kemudiannya, anda boleh memberikan nilai tertentu (contohnya merah). Oleh kerana atribut seperti ini adalah khusus, mereka tidak statik.

Sebaliknya, kaedah statik dan medan dikongsi dengan semua keadaan. Ini dibuat untuk nilai atau item yang khusus untuk kelas dan bukan contoh itu sendiri. Untuk kaedah, boleh ada kaedah global (contohnya, penukar stringtoInt) dan untuk medan, ia biasanya berlarutan mengikut kod anda (contohnya, jenis kereta boleh statik jika anda hanya mengeluarkan kereta biasa).

Sekarang, kami akan melihat semua kes yang berbeza di mana pengekodan anda boleh salah dan melihat penyelesaian untuk membaikinya.

Isu 1: Anda memanggil sesuatu yang tidak wujud

Kami mendapati beberapa kes di mana pengguna menggunakan kedua-dua kaedah statik dan bukan statik antara satu sama lain. Apabila kita melakukan ini, anda perlu berhati-hati tentang kaedah yang memanggil apa (dari segi statik atau tidak). Sila lihat kod berikut:

 java.util.List private someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Pernyataan berikut menyebabkan ralat. Anda tahu mengapa .. java.util.List someList = someMethod (); } 

Di sini, kaedah statik memanggil beberapa kaedah. Dalam pengaturcaraan berorientasikan objek, kami merangkum data bersama-sama dengan data yang ingin kami beroperasi. Di sini, tanpa objek, tiada data contoh dan sementara kaedah contoh wujud sebagai sebahagian daripada definisi kelas, mesti ada contoh objek untuk menyediakan data kepada mereka.

Jadi untuk meringkaskan, anda tidak boleh memanggil sesuatu yang tidak wujud. Oleh kerana anda mungkin tidak membuat objek, kaedah bukan statik masih belum wujud. Walau bagaimanapun, sebaliknya, kaedah statik akan sentiasa wujud (kerana definisi).

Isu 2: Kaedah tidak dibuat Statik

Jika anda menggunakan kaedah dari kaedah utama Statik anda tanpa membuat contoh kaedah, anda akan mendapat mesej ralat. Di sini, prinsip yang sama digunakan; anda tidak boleh mengakses sesuatu yang tidak wujud.

 kelas awam BookStoreApp2 {// pemalar untuk pilihan Input pengimbas = Pengimbas baru (System.in); public static void main (String [] args) {BookStoreItem [] item; // declaring array item = new BookStoreItem [10]; // initializing array int itemType = -1; printMenu (); getUserChoice (); untuk (int i = 0; i <item.length; i ++) {} // akhir pernyataan suis} // akhir untuk gelung untuk (int i = 0; i <item.length; i ++) {} // end untuk} // akhir kaedah utama 

Di sini dalam kod ini, anda perlu menukar kedua-dua kaedah printMenu () dan getUserChoice () ke dalam kaedah statik.

Oleh itu, jika anda ingin mendapatkan keadaan seperti ini, anda boleh menggunakan pembina sebaliknya. Sebagai contoh, anda boleh mengambil kandungan kaedah utama anda () dan meletakkannya di dalam pembina.

 public BookStoreApp2 () {// Masukkan kandungan kaedah utama di sini} Setelah melakukan ini, lakukan perkara berikut di dalam utama () kaedah: public void main (String [] args) {new BookStoreApp2 (); } 

Jika petua-petua ini tidak berfungsi pada kod anda atau anda adalah berbeza, anda perlu mengingati prinsip-prinsip asas kelas dan kaedah statik dan semak semula kod anda untuk memastikan prinsip asas tidak dilanggar.

Artikel Yang Menarik