Чем отличаются интерфейсы от абстрактных классов

 
 
 
Сообщения:3
Хочу чётче понять разницу между этими понятиями.
В интерфейсе можно показать методы, которые будут переопределены через @Override
В абстрактных классах можно указать абстрактные методы, которые потом можно будет переопределить (описать) в классе "ребёнке".

Отличия я пока что вижу только в том, что в абстрактных классах можно указывать не только абстрактные, но и обычные методы, которые описываются полностью прямо в абстрактном классе. В интерфейсе так сделать нельзя.

Прошу инфу (ваши ответы, а не ссылки, если можно =))
 
 
Сообщения:1528
Интерфейс описывает поведение. Например стандартные Serializable, Closeable говорят, что объекты которые их реализуют можно сериализовать и закрыть. Соответственно класс может иметь несколько интерфейсов.

Абстрактные классы представляют основу без конкретики. Например класс AbstractList. Реализаций списков можно написать сколько угодно, но основа у них будет одна. Каждый класс может иметь одного родителя.
 
 
Сообщения:492
keep_yourself:
Отличия я пока что вижу только в том, что в абстрактных классах можно указывать не только абстрактные, но и обычные методы, которые описываются полностью прямо в абстрактном классе. В интерфейсе так сделать нельзя.

Можно. Это так называемые default методы.
public interface MyInterface {
    
    void methodOne();

    default void methodTwo() {
        System.out.println("I'm default method");
    }
}

А в классе, реализующим данный интерфейс можно переопределить methodTwo, а можно и не переопределять а использовать реализацию по умолчанию.
 
 
Сообщения:838
izon:

Можно. Это так называемые default методы.

Соглашусь отчасти. В данных методах вы не можете оперировать данными класса. Так что можно с натяжкой сказать, что они полноценная замена.
 
 
Сообщения:3
Тогда вот другой вопрос на ту же тему: в отличии от абстрактных классов, все описанные методы в имплементированных классах будут вызваны без непосредственного обращения к ним?
Новичок, видел только самые простые примеры работы интерфейсов.
 
 
Сообщения:492
gidravlic:
Соглашусь отчасти. В данных методах вы не можете оперировать данными класса.

Вы имеете в виду напрямую? Ну так в интерфейсе и данных то нет (константы не в счет). Так что то же соглашусь лишь частично :)
В коде ниже метод интерфейса вполне себе оперирует данными реализующего его класса.
public interface MyInterface {

    default void myDefaultMethod(List<String> list) {
        for (int i = 0; i < list.size(); i++) {
            list.set(i, list.get(i).toUpperCase());
        }
    }
}

public class TestMyInterface implements MyInterface{

    private List<String> list = new ArrayList<>();

    public static void main(String[] args) {

        TestMyInterface testMyInterface = new TestMyInterface();

        testMyInterface.list.add("aaa");
        testMyInterface.list.add("bbb");

        testMyInterface.myDefaultMethod(testMyInterface.list);

        for (String s : testMyInterface.list) {
            System.out.println(s);
        }

    }
}

keep_yourself:
в отличии от абстрактных классов, все описанные методы в имплементированных классах будут вызваны без непосредственного обращения к ним?

Вот не понял вопроса, если честно.
 
 
Сообщения:3
izon:
Вот не понял вопроса, если честно.

Допустим у нас есть метод в интерфейсе. В классе под этим интерфейсом мы переопределяем метод. Потом создаём где-то объект этого класса, и вот во время этого все переопределяемые методы исполняются сами по себе, как по умолчанию? Просто сейчас пробую писать приложение-игру, использую интерфейс ActionListener. В своём классе переопределяю методы этого интерфейса, но нигде их не использую. А они работают (хотя как я понял, так и должно быть). Работаю по примеру кода.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет