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.
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
Java
OverLoad
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!
OverLoad
) menentukan jenis statik (man
) kaedah terlampau beban woman
yang parameternya Human
, iaitu sayHello()
Human guy
sayHello(Human guy)
a Apabila jenis pembolehubah statik berubah
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
), 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 char
char
char
akan dikeluarkan kerana
Apabila tiada sayHello(char arg)
</p>sayHello(char arg)<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">hello int</pre><div class="contentsignin">Salin selepas log masuk</div></div>
cara yang paling sesuai untuk membebankan, kaedah kedua paling sesuai (keutamaan kedua) akan dipilih terlebih muatan, iaitu ‘a’
<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:
<🎜 🎜> ialah parameter panjang berubah-ubah, yang dianggap sebagai elemen tatasusunan. Parameter panjang boleh ubah mempunyai keutamaan beban yang paling rendah. Oleh kerana proses menukarkepada
atau ...
adalah tidak selamat, kaedah dengan jenis parameter
tidak akan dipilih untuk lebihan muatan, jadi senarai keutamaan Tidak juga. char
byte
Beri perhatian khusus kepadashort
byte
short
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)
Contoh peneranganOverride
Beri perhatian khusus kepada
// 定义类 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()
Human man = new Man(); man = new Woman(); man.sayHello(); // man称为执行sayHello()方法的所有者,即接受者。
invokevirtual
Langkah kedua pelaksanaan arahan =
Langkah kedua ialah intipati kaedah penulisan semula (Override
)
Atas ialah kandungan terperinci Cara menggunakan model penghantaran kaedah Java JVM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!