Pertanyaan Jika metode statis tidak dapat dikesampingkan, bagaimana cara kerjanya di sini (Untuk Java)?


Pemahaman saya adalah bahwa variabel statis dan metode statis adalah kelas, bukan dari objek kelas. Jadi, a Override dari metode statis tidak akan berfungsi di Java, seperti untuk mengesampingkan kita membutuhkan instance dari kelas yang akan dibuat. Tapi saya mencoba sesuatu hari ini yang bertentangan dengan pengetahuan saya tentang Jawa.

Silakan ikuti kode ini:

class Parent{
   public static void doIt(){
      System.out.println("In static method 'doit' of class Parent ");
   }
}

class Child extends Parent{    
   public static void doIt(){
      System.out.println("In static method 'doit' of class Child ");
   }
}

public class StaticPractise{
   public static void main(String[] args){
      Parent.doIt();
      Child.doIt();
   }    
}

Output dari implementasi di atas adalah:

D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Child

Dari output ini saya bisa mengerti bahwa meskipun Child kelas meluas Parent kelas, yang doit metode bersifat individual untuk setiap kelas sebagaimana adanya static. Jadi tidak ada pengabaian dari mereka yang diizinkan.

Sekarang silakan ikuti kode di bawah ini, di mana @Override ditambahkan ke anak doIt metode:

class Parent{
   public static void doIt(){
      System.out.println("In static method 'doit' of class Parent ");
   }
}

class Child extends Parent{    
   @Override // Adding this annotation here
   public static void doIt(){
      System.out.println("In static method 'doit' of class Child ");
   }
}

public class StaticPractise{
   public static void main(String[] args){
      Parent.doIt();
      Child.doIt();
   }    
}

Output dari kode di atas memberikan kesalahan kompilasi sebagai berikut:

D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:31: error: method does not override or implement a method from a supertype
    @Override
    ^
1 error

Di sini jelas mengatakan bahwa anotasi Override tidak bisa diterapkan static metode karena mereka tidak ditimpa.

Sekarang silakan ikuti kode di bawah ini, di mana Child tidak punya doIt metode:

class Parent{
   public static void doIt(){
      System.out.println("In static method 'doit' of class Parent ");
   }
}

class Child extends Parent{ /* no doIt method */ }

public class StaticPractise{
   public static void main(String[] args){
      Parent.doIt();
      Child.doIt();
   }    
}

Outputnya adalah:

D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Parent

Mengapa kode di atas dikompilasi dan dijalankan? Saya mengharapkan kesalahan kompilasi untuk metode doit untuk kelas Anak, dan saya mengharapkan "Metode tidak ditemukan". Saya tidak mengerti.

Juga silakan ikuti kode di bawah ini. Di sini, the doIt metode dalam Parent sekarang final.

class Parent{
   public static final void doIt(){ // now final
      System.out.println("In static method 'doit' of class Parent ");
   }
}

class Child extends Parent{
   public static void doIt(){
      System.out.println("In static method 'doit' of class Parent ");
   }
}

public class StaticPractise{
   public static void main(String[] args){
      Parent.doIt();
      Child.doIt();
   }    
}

Output setelah menjalankan kode di atas adalah sebagai berikut:

D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:30: error: doIt() in Child cannot override doIt() in Parent
    public static void doIt(){
                       ^
  overridden method is static,final
 1 error

 D:\Rahul Shivsharan\MyPractise\JAVA>

Apa yang saya harapkan adalah bahwa kode di atas harus berfungsi dengan baik sebagai doit metode bersifat statis di setiap kelas, jadi bahkan a final kata kunci tidak boleh membuat kesalahan kompilasi apa pun karena metodenya static.

Tolong jelaskan kepada saya bagaimana metode overriding bekerja dalam kelas statis di Java.

  1. Dapatkah metode statis dikesampingkan? Jika ya, maka kenapa annotating @Override gagal?
  2. Jika metode statis tidak dapat ditimpa, lalu kenapa blok kode 3 saya berjalan baik?
  3. Jika metode statis tidak dapat dikesampingkan, lalu kenapa final kata kunci membuat perbedaan?

36
2017-08-20 08:01


asal


Jawaban:


Pertama-tama ada mekanisme berbeda yang terlibat di sini: Override dan Shadowing (juga disebut bersembunyi).

1) Metode statis tidak dapat ditimpa karena melekat pada kelas yang ditentukan. Namun, Anda bisa bayangan / sembunyi metode statis seperti yang Anda lakukan dengan Anda Parent/Child kelas. Ini berarti, metode tersebut akan diganti di Child kelas tetapi masih tersedia dari Parent kelas.

Semakin jelas bahwa Anda tidak menimpa saat Anda memanggil metode statis dari instance kelas-kelas tersebut (dan tidak menggunakan Class.staticMethod() doa).

Parent parent = new Parent();
Child child1 = new Child();
Parent child2 = new Child();

parent.StaticMethod();
child1.StaticMethod();
child2.StaticMethod();

hasilnya adalah

Static method from Parent
Static method from Child
Static method from Parent

Jawabannya adalah pengiriman metode. Anda bisa ambil kode sumber di sini

2) Pengiriman menemukan metode di Parent kelas. Tidak ada pengiriman dinamis karena jenis runtime digunakan untuk menemukan metode yang ditangani. Ia menggunakan tipe waktu kompilasi. MengingatkanMemanggil metode statis dari instance dianggap sebagai praktik yang buruk karena hal-hal seperti di atas dapat terjadi dan mudah diabaikan.

3) Dengan finalAnda menyatakan bahwa metode tidak dapat dikesampingkan tidak dibayangi / disembunyikan.


41
2017-08-20 08:06



Kamu membingungkan utama dengan bersembunyi


6
2017-08-20 08:05



Meskipun tidak disarankan untuk mengajukan 3 pertanyaan dalam satu posting, saya masih bersedia menjawabnya.

  1. Metode statis tidak dapat dikesampingkan karena tidak ada gunanya melakukan itu. Dalam kasus Anda, Jika Anda ingin mengganti metode statis, Anda cukup memanggil metode dan menambahkan implementasi Anda sendiri setelah itu atau Anda hanya membuat metode lain.

  2. Jadi sekarang Anda tahu bahwa metode statis tidak dapat dikesampingkan. Tetapi Anda bertanya mengapa kode ketiga bekerja? Kode ketiga adalah kode dengan

    Kelas publik Anak memperluas Orang Tua {}

kanan? Meskipun metode statis tidak dapat ditimpa, mereka bisa diwariskan. Apa yang Anda lakukan adalah mewarisi Parent jadi itu baik-baik saja!

  1. Sekarang izinkan saya memberi tahu Anda, dalam contoh kode pertama Anda bersembunyi metode dalam Parent kelas, tidak menimpa. Itu sebabnya Anda mendapatkan hasilnya. SEBUAH final kata kunci berarti metode bisa tak pernah diubah, bahkan tidak disembunyikan. Jadi itu sebabnya

3
2017-08-20 08:19