Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polymorphism java thinking

consider the following code:

public class A{
    private int num;
    public A(int n){
        num = n;
    }
    public int getNum(){
        return num;
    }
    public boolean f(A a){
        return num == a.num * 2;
    }
}

public class B extends A {
    public B(int n) {
        super(n);
    }

    public boolean f(B b) {
        return getNum() == b.getNum();
    }
}

public class Main
{
    public static void main(String[] args){
        A y1 = new B(10);
        B y2 = new B(10);
        System.out.println("y1.f(y2) is: "+y1.f(y2));
    }
}

What I don't understand is why the method f is running for class A (and printing false) and not B, cause in run time y1 is of type B, and should go down to method f in class B?

like image 532
Yuval Levy Avatar asked Jan 11 '23 06:01

Yuval Levy


1 Answers

cause in run time y1 is of type B, and should go down to method f in class B?

No:

  • B.f() doesn't override A.f() because the parameter types are different. It overloads it.
  • Overloads are picked at compile-time, not at execution time

If you change B.f() to accept a parameter of type A rather than B, you'll see it get executed. That doesn't depend on the execution-time type of the argument, but on the execution-time type of the target of the call.

The method implementation which is chosen never depends on the execution-time type of an argument.

like image 167
Jon Skeet Avatar answered Jan 19 '23 01:01

Jon Skeet