[ my previous stupid reply has been deleted ] When more than one overloaded methods are valid candidates, the "most specific" overloaded method is chosen. Hence the Base version will be chosen, not the SuperBase version.
According me the Base class contains two overloaded methods 1.public void print(SuperBase sb){ System.out.println("Super"); } from SuperBase class 2.public void print(Base b){ System.out.println("Base"); } from Base class check code below