Решил я немного поиграться с заданием, посоздавать объекты, позасовывать в ссылки и посмотреть как они себя ведут. Однако стразу же словил такую вот штуку:
public class Solution {
   public static void main(String[] args) {
        Dog dog = new Dog(); // ошибка - cannot be referenced from a static context
    }

    public interface CanFly {
        public void fly();
    }

    public interface CanMove {
        public void move();
    }

    public interface CanEat {
        public void eat();
    }

    public class Dog implements CanMove, CanEat{
        @Override
        public void eat() {
            System.out.println("Ем! Гав!");
        }

        @Override
        public void move() {
            System.out.println("Бегу! Гав!");
        }
    }
}
Покопавшись в старых лекциях и интернете выяснил, что нестатические методы вложенных классов нельзя вызывать в статических методах внешнего. Только через объект внешнего класса. В итоге у меня получилась подобная ерунда:
public class Solution {
   public static void main(String[] args) {
       Solution sol = new Solution();
       List list = new ArrayList<>();
       list.add(sol.createDog());
    }
    public Dog createDog(){
        return new Dog();
    }
    public interface CanFly {
        public void fly();
    }

    public interface CanMove {
        public void move();
    }

    public interface CanEat {
        public void eat();
    }

    public class Dog implements CanMove, CanEat{
        @Override
        public void eat() {
            System.out.println("Ем! Гав!");
        }

        @Override
        public void move() {
            System.out.println("Бегу! Гав!");
        }
    }
}
Скажите, это правильный подход? Выглядит как какой-то костыль если честно. Похоже я совсем не улавливаю суть вложенных классов. Почему компилятор запрещает просто по человечески создать объект вложенного класса?