Seperti disebutkan sebelumnya, resolusi overloading dilakukan pada waktu kompilasi.
Java Puzzlers memiliki contoh yang bagus untuk itu:
Teka-teki 46: Kasus Pembuat yang Membingungkan
Teka-teki ini memberi Anda dua konstruktor yang Membingungkan. Metode utama memanggil konstruktor, tetapi yang mana? Keluaran program tergantung pada jawabannya. Apa yang dicetak program itu, atau apakah itu legal?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Solusi 46: Kasus Pembuat yang Membingungkan
... Proses resolusi kelebihan beban Java beroperasi dalam dua fase. Tahap pertama memilih semua metode atau konstruktor yang dapat diakses dan dapat diterapkan. Fase kedua memilih metode atau konstruktor yang paling spesifik yang dipilih pada fase pertama. Satu metode atau konstruktor kurang spesifik dari yang lain jika ia dapat menerima parameter yang diteruskan ke yang lain [JLS 15.12.2.5].
Dalam program kami, kedua konstruktor dapat diakses dan diterapkan. Konstruktor
Confusing (Object) menerima parameter apapun yang diteruskan ke Confusing (double []) , jadi
Confusing (Object) kurang spesifik. (Setiap larik ganda adalah Objek , tetapi tidak setiap Objek adalah larik ganda .) Oleh karena itu, konstruktor paling spesifik adalah Membingungkan (ganda []) , yang menjelaskan keluaran program.
Perilaku ini masuk akal jika Anda mengirimkan nilai bertipe double [] ; itu berlawanan dengan intuisi jika Anda meneruskan null . Kunci untuk memahami teka-teki ini adalah bahwa pengujian untuk metode atau konstruktor mana yang paling spesifik tidak menggunakan parameter sebenarnya : parameter yang muncul dalam pemanggilan. Mereka hanya digunakan untuk menentukan kelebihan beban yang berlaku. Setelah compiler menentukan overloading mana yang dapat diterapkan dan dapat diakses, compiler akan memilih overloading yang paling spesifik, dengan hanya menggunakan parameter formal: parameter yang muncul dalam deklarasi.
Untuk memanggil konstruktor Confusing (Object) dengan parameter null , tulis Confusing ((Object) null) baru . Ini memastikan bahwa hanya Confusing (Object) yang berlaku. Secara lebih umum, untuk memaksa compiler memilih overloading tertentu, masukkan parameter aktual ke tipe yang dideklarasikan dari parameter formal.