Так с каждым днем н=возникают новые вопросы и я знаю что мне помогут на этом замечательном форуме более детально разобраться) Тема вопроса: не могу понять как реализуется код указанный ниже
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Привет", "как", "дела?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s);
   }
});
А именно в метод forEach мы передаем аргумент - new Consumer<String>() ( то есть мы создаем объект типа Consumer<String>() , что же это за объект такой ? Интернет говорит что это Consumer - встроенный функциональный интерфейс, добавленный в Java SE 8 в пакет java.util.function.Принимает значение в качестве аргумента и ничего не возвращает.) То есть мы создаем новый объект который имеет тип интерфейса и делаем это для того чтобы создать анонимный класс (чтобы не создавать новый класс отдельно) , чтобы в этом анонимном классе переопределять дефолтный метод accept - который будет выводить на консоль каждый элемент s нашей коллекции Consumer<String>? Далее вообще не могу разобрать вот это выражение:
объект::метод
x -> объект.метод(x)
Что такое х? Как реализуется ссылка на метод объекта, ссылка на метод класса и ссылка на конструктор? Как это вообще ссылка на конструктор? Даже не могу привести аналогию. В лекции приведен пример
list.forEach( System.out::println );
То есть поле out класса System это наш объект у которого мы вызываем функцию println? Допустим я создал класс Cat с одни методом
public class Cat {
    int age;

    public int getAge() {
        return age;
    }
}
Значит я могу записать вызов функции на объект age следующим образом?
Cat.age::getAge
Но что тогда в этом случае будет являться x-ом?Передаваемый возраст кота?