Yuval Levy
Yuval Levy

Reputation: 2516

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?

Upvotes: 4

Views: 177

Answers (2)

Udi
Udi

Reputation: 618

pay attention that the parameters in class B & class A in f function are diffrent. that is the reason that the "gravity low" dont exist here and this time it enter to the A.f function

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1500525

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.

Upvotes: 8

Related Questions