Rumah  >  Artikel  >  Java  >  Cara menggunakan model penghantaran kaedah Java JVM

Cara menggunakan model penghantaran kaedah Java JVM

WBOY
WBOYke hadapan
2023-04-21 10:49:071339semak imbas

1. Rizab Pengetahuan

1.1 Penghantaran

  • Definisi: Proses menentukan kaedah yang hendak dilaksanakan

a. Soalan Sesetengah pembaca akan bertanya, bukankah pelaksanaan kaedah bergantung pada objek pelaksanaan dalam tetapan kod? Kenapa pilih? b. Jawapan

  • Jika objek sepadan dengan pelbagai kaedah, anda perlu membuat pilihan

  • Pembaca harus Mereka semua memikirkan ciri dalam Java: polimorfisme, iaitu, menulis ganti & terlebih muatan. Saya akan menerangkannya secara terperinci di bawah.

  • Kategori: Penghantaran statik & penghantaran dinamik. Saya akan menerangkannya secara terperinci di bawah.

1.2 Jenis statik & jenis dinamik pembolehubah

Pertama lihat kod berikut

public class Test { 
    static abstract class Human { 
    } 
    static class Man extends Human { 
    } 
    static class Woman extends Human { 
    } 
// 执行代码
public static void main(String[] args) { 
  Human man = new Man(); 
  // 变量man的静态类型 = 引用类型 = Human:不会被改变、在编译器可知
  // 变量man的动态类型 = 实例对象类型 = Man:会变化、在运行期才可知
    } 
}

Iaitu:

  • Jenis pembolehubah statik = jenis rujukan: tidak akan diubah, boleh diketahui pada masa penyusunan

  • Jenis pembolehubah dinamik = jenis objek contoh: akan berubah, boleh diketahui pada masa jalan

Di bawah, saya akan menerangkan secara terperinci jenis penghantaran dalam Java: penghantaran statik & penghantaran dinamik

2 🎜>

    Tentukan kelakuan penghantaran kaedah berdasarkan jenis statik pembolehubah
    Iaitu, tentukan kaedah yang hendak dilaksanakan berdasarkan jenis statik pembolehubah
  • berlaku semasa penyusunan, jadi ia tidak dilaksanakan oleh
  • mesin maya

    Java

    Kaedah senario aplikasi berlebihan (
  • )

    OverLoad

  • Contoh penerangan
Menurut penjelasan di atas, semua orang harus memahami sebab hasil operasi:
public class Test { 
// 类定义
    static abstract class Human { 
    } 
// 继承自抽象类Human
    static class Man extends Human { 
    } 
    static class Woman extends Human { 
    } 
// 可供重载的方法
    public void sayHello(Human guy) { 
        System.out.println("hello,guy!"); 
    } 
    public void sayHello(Man guy) { 
        System.out.println("hello gentleman!"); 
    } 
    public void sayHello(Woman guy) { 
        System.out.println("hello lady!"); 
    } 
// 测试代码
    public static void main(String[] args) { 
        Human man = new Man(); 
        Human woman = new Woman(); 
        Test test = new Test(); 
        test.sayHello(man); 
        test.sayHello(woman); 
    } 
}
// 运行结果
hello,guy! 
hello,guy!

    Kaedah terlebih beban (
  • ) = penghantaran statik = tentukan kaedah yang hendak dilaksanakan (lebih beban) berdasarkan jenis statik pembolehubah

    OverLoad

  • Jadi apabila kaedah di atas dilaksanakan, ia adalah berdasarkan pembolehubah (
  • ,

    ) menentukan jenis statik (man) kaedah terlampau beban woman yang parameternya Human, iaitu sayHello()Human guysayHello(Human guy)

  • Beri perhatian khusus kepada

a Apabila jenis pembolehubah statik berubah

Anda boleh tukar jenis statik pembolehubah melalui

penukaran jenis paksa

b.
Human man = new Man(); 
test.sayHello((Man)man); 
// 强制类型转换
// 此时man的静态类型从 Human 变为 Man
// 所以会调用sayHello()中参数为Man guy的方法,即sayHello(Man guy)

  • Latar belakang kini perlu dihantar secara statik

    Jenis statik yang ditentukan tidak dipaparkan dalam program masalah
  • Program penyelesaian akan memilih jenis statik pilihan untuk peruntukan kaedah berdasarkan keutamaan jenis statik.
  • Contoh
  • Kerana
  • ialah data jenis
(iaitu jenis statik ialah

), jadi jenis parameter akan dipilih sebagai kaedah Terlebih beban

.
public class Overload {  
    private static void sayHello(char arg){  
        System.out.println("hello char");  
    }  
    private static void sayHello(Object arg){  
        System.out.println("hello Object");  
    }  
    private static void sayHello(int arg){  
        System.out.println("hello int");  
    }  
    private static void sayHello(long arg){  
        System.out.println("hello long");  
    }  
// 测试代码
    public static void main(String[] args) {  
        sayHello('a');  
    }  
}  
// 运行结果
hello char

Jika kaedah ‘a’ diulas, maka charcharchar akan dikeluarkan kerana

bukan sahaja boleh mewakili rentetan, tetapi juga nombor 97. Oleh itu

Apabila tiada sayHello(char arg)

sayHello(char arg)
hello int

cara yang paling sesuai untuk membebankan, kaedah kedua paling sesuai (keutamaan kedua) akan dipilih terlebih muatan, iaitu ‘a’ <strong>sayHello(int arg)</strong><strong>sayHello(char arg)</strong> Ringkasan: Apabila tiada kaedah yang paling sesuai untuk lebihan beban, keutamaan akan dipilih Yang kedua kaedah tertinggi adalah terlebih beban, dan sebagainya. <strong>sayHello(int arg)</strong>Tertib keutamaan ialah:

char>int>long>float>double>Character>Serializable>Objek>...

ialah parameter panjang berubah-ubah, yang dianggap sebagai elemen tatasusunan. Parameter panjang boleh ubah mempunyai keutamaan beban yang paling rendah.

Oleh kerana proses menukar
kepada

atau ... adalah tidak selamat, kaedah dengan jenis parameter

atau

tidak akan dipilih untuk lebihan muatan, jadi senarai keutamaan Tidak juga. charbyteBeri perhatian khusus kepadashortbyteshort

Penjelasan di atas terutamanya mengenai masalah padanan keutamaan

jenis data asas

  • Jika ia adalah jenis rujukan, padanan keutamaan dilakukan berdasarkan hubungan warisan

  • Perhatikan bahawa ia hanya berkaitan dengan jenis masa kompilasinya (iaitu jenis statik)

    3. Penghantaran dinamik

Tentukan kelakuan penghantaran kaedah berdasarkan jenis dinamik pembolehubah

  • Iaitu, tentukan kaedah yang hendak dilaksanakan berdasarkan jenis dinamik pembolehubah

Penulisan semula kaedah senario aplikasi (

)

  • Contoh peneranganOverride

  • Beri perhatian khusus kepada

  • untuk kod:
// 定义类
    class Human { 
        public void sayHello(){ 
            System.out.println("Human say hello"); 
        } 
    } 
// 继承自 抽象类Human 并 重写sayHello()
    class Man extends Human { 
        @Override 
        protected void sayHello() { 
            System.out.println("man say hello"); 
        } 
    } 
    class Woman extends Human { 
        @Override 
        protected void sayHello() { 
            System.out.println("woman say hello"); 
        } 
    } 
// 测试代码
    public static void main(String[] args) { 
        // 情况1
        Human man = new man(); 
        man.sayHello(); 
        // 情况2
        man = new Woman(); 
        man.sayHello(); 
    } 
}
// 运行结果
man say hello
woman say hello
// 原因解析
// 1. 方法重写(Override) = 动态分派 = 根据 变量的动态类型 确定执行(重写)哪个方法
// 2. 对于情况1:根据变量(Man)的动态类型(man)确定调用man中的重写方法sayHello()
// 3. 对于情况2:根据变量(Man)的动态类型(woman)确定调用woman中的重写方法sayHello()

Langkah pertama dalam pelaksanaan arahan = Tentukan jenis sebenar penerima
Human man = new Man(); 
man = new Woman(); 
man.sayHello(); 
// man称为执行sayHello()方法的所有者,即接受者。
  • invokevirtualLangkah kedua pelaksanaan arahan =

    Selesaikan rujukan simbol kaedah kelas dalam kolam malar kepada rujukan langsung yang berbeza

Langkah kedua ialah intipati kaedah penulisan semula (Override)

4 Perbezaan antara keduanya

Cara menggunakan model penghantaran kaedah Java JVM

Atas ialah kandungan terperinci Cara menggunakan model penghantaran kaedah Java JVM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam