Search code examples
javamethods

Java calling overloaded methods


Consider this code segment

class StockServer { 

   StockServer(String company, int Shares,double currentPrice, double cashOnHand) {}

   double buy(int numberOfShares, double pricePerShare) { 
        System.out.println("buy(int,double)"); 
        return 3.0;
   } 

   float buy(long numberOfShares, double pricePerShare) {     
        System.out.println("buy(long,double)");
        return 3.0f; 
   } 
}

If I execute this lines of code,

StockServer a = new StockServer("",2,2.0,2);
byte b=5;
a.buy(b,2);

The results would be : buy(int,double)

I want to know how the compiler decide which method to execute?


Solution

  • If you have overloaded methods, the compiler figures out the most specific candidate using the method signature. In this case the two signatures are

    buy(int, double)
    

    and

    buy(long, double).
    

    Note that the return type is not part of the signature. You are calling a method using buy(byte, int). Since int is more specific than long, the first method is called. More specific means that int is the smaller of the two type to contain byte.

    However, the compiler cannot figure out the most specific candidate all the time:

    public static void foo(long a, double b) {
        // body
    }
    
    public static void foo(double a, long b) {
        // body
    }
    
    foo(3, 4);
    

    This code will not compile, because it is not clear which of the methods is meant.