Rumah  >  Artikel  >  Java  >  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
Susan Sarandonasal
2024-11-07 04:47:02733semak imbas

 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");

}

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.

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");

}

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!

Kenyataan:
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