public class Solution {
    public static void main(String[] args) throws Exception {
        Drink beer = new AlcoholicBeer();
        System.out.println(beer.toString());              //////////// вызывается метод toString() результат  "Напиток алкогольный"
        AlcoholicBeer beer1 = new AlcoholicBeer();
        System.out.println(beer1);                        ////////////// тоже вызывается метод toString()        "Напиток алкогольный";


    public interface Drink {
        boolean isAlcoholic();
    }

    public static class AlcoholicBeer implements Drink {
        @Override
        public boolean isAlcoholic() {
            return true;
        }

        @Override
        public String toString() {
            if (isAlcoholic()) {
                return "Напиток алкогольный";
            } else {
                return "Напиток безалкогольный";
            }

        }

    }
}
помогите понять .. System.out.println вызывает метод toString() который находится где-то там в классах , но мы его перезаписываем как нам удобно(нужно), разве при вызове System.out.println(beer1); он же будет вызывать наш метод а не тот оригинал? зачем нам добавлять после обьекта .toString() если он и так знает что обьект класса AlchoolicBeer с переопределёном методом тоСтринг() зачем нам это
System.out.println(beer.toString()
); нужно ли его писать или нет ?