Кто мне может объяснить..
Fox bigFox = new BigFox();
System.out.println(bigFox.getName());
System.out.println(bigFox.getColor());
Вот в этих 3х строчках, мы создаем объект класса BigFox, и присваиваем ссылку на него в переменную bigFox типа Fox , а это значит, что несмотря на то что у нас объект типа BigFox, но он может использовать только методы которые объявлены в Fox ? Или я ошибаюсь? И еще вопрос, вот в этом куске кода
public static class BigFox extends Fox {
        public Color getColor() {
            return Color.GRAY;
        }
Функция public Color getColor() то есть возвращаемый параметр должен быть типа Color, но нигде в коде программы мы этот тип не определили, как такое может быть? И вот эта строчка тоже непонятна return Color.GRAY; как мы можем возвращать что то неопределенного типа, и что такое .GRAY; То есть пример компилируется и выполняется, но не понятно каким образом.
public class Solution {

    public static void main(String[] args) throws Exception {
        Fox bigFox = new BigFox();
        System.out.println(bigFox.getName());
        System.out.println(bigFox.getColor());

    }

    public interface Animal {
        Color getColor();
    }

    public static abstract class Fox implements Animal {
        public String getName() {
            return "Fox";
        }
    }

    public static class BigFox extends Fox {
        public Color getColor() {
            return Color.GRAY;
        }
    }

}