В первом случае все компилирует, выводит "Василий Тигранович". Во втором просто не видит функцию getName(). Объясните, пожалуйста, почему в первом случае вызвается функция объекта, а не ссылки, но на этапе компиляции проверка доступна ли та или иная функция осуществляется по ссылке? Более общий вопрос: что вообще происходит на этапе компиляции? Какие проверки осуществляются?
public class Main {

    public static void main(String[] args) {
        Cat tiger = new Tiger();
        System.out.println(tiger.getName());
    }
}
class Cat
{
    public String getName()
    {
        return "Васька";
    }
}
class Tiger extends Cat
{
    public String getName()
    {
        return "Василий Тигранович";
    }
}
public class Main {

    public static void main(String[] args) {
        Cat tiger = new Tiger();
        System.out.println(tiger.getName());
    }
}
class Cat
{
}
class Tiger extends Cat
{
    public String getName()
    {
        return "Василий Тигранович";
    }
}