Rumah > Java > javaTutorial > Mengapakah pemilihan kaedah terlampau beban Java memilih `method(String s)` apabila diluluskan `null`?

Mengapakah pemilihan kaedah terlampau beban Java memilih `method(String s)` apabila diluluskan `null`?

Susan Sarandon
Lepaskan: 2024-11-07 04:47:02
asal
843 orang telah melayarinya

 Why does Java's overloaded method selection choose `method(String s)` when passed `null`?

Pemilihan Kaedah Terlebih Beban dengan Parameter Null

Pertimbangkan kod Java berikut:

kelas awam MoneyCalc {

kaedah lompang awam(Objek o) {

  System.out.println("Object Verion");
Salin selepas log masuk

}

kaedah lompang awam(String s) {

  System.out.println("String Version");
Salin selepas log masuk
Salin selepas log masuk

}

utama kekosongan statik awam(String args[]) {

  MoneyCalc question = new MoneyCalc();
  question.method(null);
Salin selepas log masuk
Salin selepas log masuk

}
}

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.

Memahami Null sebagai Objek

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>

Menentukan Kekhususan Kaedah

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.

Ambiguous Overload dengan StringBuffer dan String

Jika kita ubah suai kod untuk memasukkan lebihan "kaedah(StringBuffer sb)" tambahan, kami menghadapi ralat lebihan samar-samar:

MoneyCalc kelas awam {

kaedah lompang awam(StringBuffer sb) {

  System.out.println("StringBuffer Verion");
Salin selepas log masuk

}

kaedah lompang awam(String s) {

  System.out.println("String Version");
Salin selepas log masuk
Salin selepas log masuk

}

utama lompang statik awam(Args rentetan[] ) {

  MoneyCalc question = new MoneyCalc();
  question.method(null);
Salin selepas log masuk
Salin selepas log masuk

}
}

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan