Всем привет, я на 15 уровне джавараша на данный момент Все шло как по маслу, пока не начались задачи в разных файлах (проект, содержащий не один, к примеру Solution.java, а несколько) и тут началась путанница. Я перестал понимать, зачем нужны интерфейсы и в чем отличие их от абстрактного класса. Я читал на эти темы лекции в джавараше и на 100% был уверен что все понимаю. Я считал, что интерфейс - это пульт, а его класс-реализация - это телевизор (как в лекции JR). Когда пошли задачи, где внутри интерфейса объявляется метод, типом возвращаемого значения которого является сам интерфейс, я расстроился что ничего не понимаю:(
interface DBObject {
    DBObject initializeIdAndName(long id, String name);
}
Значит ли этот код то, что типом возвращаемого объекта (медота initializeIdAndName()) должен стать любой класс, имплементирующий этот интерфейс? Просто я совсем не могу уловить здесь логику "пульта". Что касается абстрактных классов, а вернее их отношению к интерфейсам тоже не понятно. Из лекций JR я узнал, что программисты "с опытом" практикуют метод взаимосвязи абстрактных классов и интерфейсов, и я даже потренировался использовать их, так скажем, вместе. Но дилемма возникла тогда, когда я, вспомнив свои "забитые установки", что, мол, абстрактный класс есть описание поведения и состояния, а интерфейс - только состояния, обратил свое внимание на код, где в теле интерфейса появились переменные и куча всего мне незнакомого. Исходя из этого вопрос. Как этим всем правильно оперировать в коде? Как построить правильную цепочку взаимосвязи в голове? Подскажите пожалуйста хорошие, немудреные статьи для зеленых программистов) Буду рад также почитать все, что касается ООП и его принципов, дженериков, InputStream/OutputStream (тут тоже есть пробелы) В общем, делитесь своими закладками и отложенными материалами, зараннее всем спасибо)