关于java中继承静态方法的问题
PHPz
PHPz 2017-04-18 09:42:18
0
3
514

Base父类代码如下

public class Base {
    public static String showme(){
        return "Base";
    }

    public void print(){
        System.out.println(showme());
    }

}

Sub子类代码如下

public class Sub extends Base {
    public static String showme(){
        return "Sub";
    }
 }
 

main函数如下

public class AppMain {
    public static void main(String args[]){
        Base base=new Sub();
        base.print();

        Sub sub=new Sub();
        sub.print();
        }
}

打印结果两个都为Base

请问怎样解释在print方法中showme()方法的调用与什么有关?

PHPz
PHPz

学习是最好的投资!

membalas semua(3)
左手右手慢动作

Untuk kaedah statik, arahan invokestatik digunakan Arahan invokestatik tidak memerlukan rujukan contoh sebagai operan Ia hanya memerlukan rujukan simbol untuk kaedah statik, dan beberapa perkataan kaedah cetakan Kod bahagian:

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
INVOKESTATIC com/kyle/Base.showme ()Ljava/lang/String;
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

Seperti yang anda lihat, invokestatic telah menentukan bahawa Base.showme dipanggil, jadi cara anda memanggil kaedah cetakan tidak akan mengubah tingkah laku invokestatic.

Selain itu, saya merasakan penyoal mempunyai pemahaman yang salah tentang pengikatan statik dan pengikatan dinamik Saya cadangkan penyoal merujuk kepada soalan ini: Java, memanggil kaedah polimorfik dalam pembina

刘奇

Subkelas boleh mewarisi sifat statik dan kaedah statik kelas induk, tetapi mereka tidak boleh mengatasi kaedah statik.
Jika terdapat label kaedah dalam subkelas yang mempunyai label kaedah yang sama dengan kelas induk (nama kaedah yang sama, jenis parameter yang sama, jenis nilai pulangan yang sama dan juga tahap akses yang sama), ia hanya boleh bermakna bahawa yang baharu dicipta untuk subkelas Kaedah statik dengan nama yang sama dengan kelas induk, bukannya menimpa kaedah statik kelas induk.

Ty80

Seperti yang @kylewang menunjukkan kod byte bahagian kaedah cetakan

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
**INVOKESTATIC** com/kyle/**Base.showme ()**Ljava/lang/String;
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

Panggilan kaedah dinyatakan dengan jelas sebagai Base.showme()

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan