Pertimbangkan kod Java berikut:
kaedah lompang awam(Objek o) {
System.out.println("Object Verion");
}
kaedah lompang awam(String s) {
System.out.println("String Version");
}
utama kekosongan statik awam(String args[]) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
Di sini, kaedah terlebih beban dipilih apabila menghantar nilai nol sebagai parameter ialah kaedah "kaedah(String s)". Ini mungkin kelihatan berlawanan dengan intuisi, kerana null tidak diisytiharkan secara eksplisit sebagai pembolehubah String.
Walaupun namanya "Versi Objek," "method(Object o)" overload tidak terhad kepada objek. Di Java, null boleh ditukar kepada ungkapan mana-mana jenis kelas, termasuk String. Oleh itu, tugasan berikut adalah sah:
String x = null;<br>
Pengkompil Java memilih beban yang paling spesifik, mengikut bahagian Spesifikasi Bahasa Java (JLS) 15.12.2.5. Secara tidak formal, sesuatu kaedah adalah lebih khusus jika seruan yang dikendalikan olehnya juga boleh dikendalikan oleh kaedah lain tanpa ralat jenis masa kompilasi.
Dalam kes ini, beban berlebihan "kaedah(String s)" adalah lebih khusus kerana ia boleh mengendalikan invokasi dengan argumen String. Sebaliknya, beban berlebihan "kaedah(Objek o)", boleh mengendalikan sebarang jenis objek, termasuk null. Walau bagaimanapun, ia tidak boleh mengendalikan invokasi dengan argumen String tanpa menghantar, yang akan mengakibatkan ralat masa kompilasi.
Jika kita ubah suai kod untuk memasukkan lebihan "kaedah(StringBuffer sb)" tambahan, kami menghadapi ralat lebihan samar-samar:
kaedah lompang awam(StringBuffer sb) {
System.out.println("StringBuffer Verion");
}
kaedah lompang awam(String s) {
System.out.println("String Version");
}
utama lompang statik awam(Args rentetan[] ) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
Ini kerana kedua-dua "kaedah(StringBuffer sb)" mahupun "kaedah(String s) " beban berlebihan adalah lebih khusus daripada yang lain. Kedua-duanya boleh mengendalikan hujah nol dan tidak boleh mengendalikan jenis hujah yang lain tanpa menghantar.
Atas ialah kandungan terperinci Mengapakah pemilihan kaedah terlampau beban Java memilih `method(String s)` apabila diluluskan `null`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!