Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51

Для чего нужен абстрактные классы/интерфейсы?

13.04.2016, 22:47. Показов 3801. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для чего нужны абстрактные классы/интерфейсы? Уже устал лазить по форумам, везде довольно размытые ответы. Я понимаю, что абстрактный класс и интерфейс это разные вещи, но вообщем для чего это применяется? В чем смысл пустого метода/поля , который все равно придется реализовать? К примеру, интерфейс гарантирует, что мы реализуем метод, но что мешает просто написать этот метод в классе и всё? Или же абстрактный класс, часто приводится пример с классом "Фигура", и его наследники "Квадрат", "Треугольник" и тд. Но все равно во всех наследниках придется писать свою реализацию метода. Возможно вопрос глупый, но не пойму я, в чем такая польза метода "пустышки", который можно и написать с нуля, не переопределяя. Надеюсь, что раскрою сей секрет, а то мозги уже кипят...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2016, 22:47
Ответы с готовыми решениями:

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для классов: interface Mobil
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для классов: interface Mobile <- abstract class...

Абстрактные классы и интерфейсы
Уважаемые, помогите новичку разобраться с абстрактными классами и интерфейсами. Не магу понять разницу между ними. Объясните доступным...

Абстрактные классы и Интерфейсы
Помогите пожалуйста решить задание)))) Цель выполнения задания: реализовать абстрактные классы или интерфейсы, а также наследование и...

18
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.04.2016, 22:56
На самом деле нет никакой пустышки. Есть команда зарезервировать место под метод в VMT. А реализовав метод у квадрата и треугольник, можем как квадрат так и треугольник привести к фигуре и вызвать этот метод. При этом у рожденного квадратом вызовется метод квадрата а у рожденного треугольником вызовется метод треугольника. Т.е. можем засунуть к примеру в один массив фигур и квадраты и треугольники, и всем элементам массива по очереди вызвать к примеру метод отрисовки. При этом квадраты отрисуются квадратами а треугольники треугольниками.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
13.04.2016, 23:04  [ТС]
Fulcrum_013, все равно не пойму, в чем проблема просто прописать метод у квадрата и треугольника без наследования? Результат же не изменится
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.04.2016, 23:32
Цитата Сообщение от farta Посмотреть сообщение
Результат же не изменится
А теперь попробуй этот неизменившийся результат запихнуть в один массив.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
13.04.2016, 23:39
Цитата Сообщение от farta Посмотреть сообщение
все равно не пойму, в чем проблема просто прописать метод у квадрата и треугольника без наследования? Результат же не изменится
С интерфейсом:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
interface Figure {
 
    double square();
}
 
final class Rectangle implements Figure {
 
    private final double width;
    private final double height;
 
    public Rectangle(final double width, final double height) {
        this.width = width;
        this.height = height;
    }
 
    @Override
    public double square() {
        return width * height;
    }
 
    @Override
    public String toString() {
        return String.format("%s{ width = %f ; height = %f }",
                getClass().getSimpleName(), width, height);
    }
}
 
final class Circle implements Figure {
 
    private final double radius;
 
    public Circle(final double radius) {
        this.radius = radius;
    }
 
    @Override
    public double square() {
        return Math.PI * radius * radius;
    }
 
    @Override
    public String toString() {
        return String.format("%s{ radius = %f }",
                getClass().getSimpleName(), radius);
    }
}
 
public class Main {
 
    private static void printSquares(final Figure... figures) {
        Stream.of(figures).forEach(f ->
                System.out.printf("%s square = %f%n", f.toString(), f.square()));
    }
 
    public static void main (String[] args) throws java.lang.Exception {
        printSquares(new Rectangle(3, 4), new Circle(2));
    }
}
Bash
1
2
Rectangle{ width = 3.000000 ; height = 4.000000 } square = 12.000000
Circle{ radius = 2.000000 } square = 12.566371
http://ideone.com/3ehYgL

Без интерфейса:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
final class Rectangle {
 
    private final double width;
    private final double height;
 
    public Rectangle(final double width, final double height) {
        this.width = width;
        this.height = height;
    }
 
    public double square() {
        return width * height;
    }
 
    @Override
    public String toString() {
        return String.format("%s{ width = %f ; height = %f }",
                getClass().getSimpleName(), width, height);
    }
}
 
final class Circle {
 
    private final double radius;
 
    public Circle(final double radius) {
        this.radius = radius;
    }
 
    public double square() {
        return Math.PI * radius * radius;
    }
 
    @Override
    public String toString() {
        return String.format("%s{ radius = %f }",
                getClass().getSimpleName(), radius);
    }
}
 
public class Main {
 
    private static void printSquares(final ?... figures) {
        Stream.of(figures).forEach(f ->
                System.out.printf("%s square = %f%n", f.toString(), f.square()));
    }
 
    public static void main (String[] args) throws java.lang.Exception {
        printSquares(new Rectangle(3, 4), new Circle(2));
    }
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Main.java:51: error: illegal start of type
    private static void printSquares(final ?... figures) {
                                           ^
Main.java:51: error: ')' expected
    private static void printSquares(final ?... figures) {
                                            ^
Main.java:51: error: ';' expected
    private static void printSquares(final ?... figures) {
                                               ^
Main.java:51: error: illegal start of type
    private static void printSquares(final ?... figures) {
                                                       ^
Main.java:51: error: <identifier> expected
    private static void printSquares(final ?... figures) {
                                                        ^
Main.java:51: error: ';' expected
    private static void printSquares(final ?... figures) {
                                                          ^
Main.java:52: error: illegal start of type
        Stream.of(figures).forEach(f ->
              ^
Main.java:52: error: <identifier> expected
        Stream.of(figures).forEach(f ->
                         ^
Main.java:52: error: ';' expected
        Stream.of(figures).forEach(f ->
                          ^
Main.java:56: error: class, interface, or enum expected
    public static void main (String[] args) throws java.lang.Exception {
                  ^
Main.java:58: error: class, interface, or enum expected
    }
    ^
11 errors
http://ideone.com/kBNyUC


Сам догадаешься, в чём разница?
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
13.04.2016, 23:48  [ТС]
korvin_, эмммм... Честно говоря, я не понял, каким образом лишь переоопределенный метод интерфейса делает прогу рабочей, а если писать их ручками, то начинается дикая куча ошибок... Конкретней, если можно, новичок же:3
0
Кандёхаем веселее!
 Аватар для MLPMan
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
14.04.2016, 00:12
farta, с интерфейсами можно непосредственно обращаться к элементам, как к Figure, а если без, то только как к Object-ам, и перед каждым действием придётся проверять типы (instanceof), а затем приводить к нужному. Полиморфизм жи есть.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2016, 00:12
Цитата Сообщение от farta Посмотреть сообщение
Честно говоря, я не понял, каким образом лишь переоопределенный метод интерфейса делает прогу рабочей, а если писать их ручками, то начинается дикая куча ошибок..
Да все очень просто. Когда два класса порождены от одного интерфейса они гарантированно имеют набор методов определенный в интерфейсе. Тогда указатели на эти методы для каждого класса можно сохранить в одинаковых таблицах а в каждый класс положить указатель на эти таблицы. При вызове берется указатель на таблицу, из нее выбирается указатель на метод и вызывается. При этом тупо по номеру. А под каким номером что в таблице лежит и задается списком методов в базовом абстрактном классе.
Если же базового класса нет, то эти два класса ничем между собой не связаны кроме твоего воображения. По большому счету этот абстрактный класс и нужен для того чтобы об этой воображаемой тобой (абстрактной) связи сообщить компилятору.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
14.04.2016, 00:16
Цитата Сообщение от farta Посмотреть сообщение
эмммм... Честно говоря, я не понял, каким образом лишь переоопределенный метод интерфейса делает прогу рабочей, а если писать их ручками, то начинается дикая куча ошибок... Конкретней, если можно, новичок же:3
Попробуй сделать нерабочую прогу рабочей.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
14.04.2016, 07:52  [ТС]
Fulcrum_013, Так, если я правильно понял, то абстрактный класс нужен для того, чтобы создавать исключительно родственные классы, интерфейс же позволяет сделать "полу родственными"(типо появляется возможность множественного наследования) даже два совершенно разных класса, повязав их одним общим методом, и при вызове этого метода будет проявляться полиморфизм? Тогда еще остается вопрос, что же компилятор не устраивает, не пойму
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.04.2016, 08:17
Цитата Сообщение от farta Посмотреть сообщение
интерфейс же позволяет сделать "полу родственными"
интерфейс это контракт работы классов с окружением. Их удобно использовать т.к это уменьшает общую связанность программы. Пока примите это как данное. Реальзую пользу вы поймете когда начнете учить всякие j2ee фреймворки

Цитата Сообщение от farta Посмотреть сообщение
Тогда еще остается вопрос, что же компилятор не устраивает
То что вы говорите что вы можете сами определить нужные методы в двух классах и вы как бы обещаете компилятору типа "я сам напишу эти методы чесслово и когда их надо будет вызвать, они там будут", однако компилятор вашему слову не верит. Вдруг вы его обманываете и поэтому требует чтобы вы определили интерфейс или абстрактный класс чтобы быть уверенным что нужный метод правда будет во всех нужных классах. Это если по простому. Если по-сложному, смотрите ответ Fulcrum_013. Он объяснил как это работает с точки зрения внутреннего устройства.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2016, 09:46
Цитата Сообщение от farta Посмотреть сообщение
ак, если я правильно понял, то абстрактный класс нужен для того, чтобы создавать исключительно родственные классы, интерфейс же позволяет сделать "полу родственными"
Интерфейс это просто список виртуальных методов, и он не может иметь ни реализации этих методов, ни невиртуальных методов. Абстрактный же класс может иметь как невиртуальные методы, так и иметь реализацию части виртуальных методов. Пример - если объекты умеют двигаться, а позиция задается какой либо точкой, то метод задания позиции можно один раз реализовать в абстрактном базовом классе, оставив реализацию виртуальных (полиморфных) методов к примеру отрисовки вычисления площади и т.д. потомкам.

Добавлено через 1 минуту
Т.е. разница - у абстрактнонго класса часть методов не реализована. У интерфейса все методы не реализованы.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.04.2016, 13:48
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
У интерфейса все методы не реализованы.
это было так до выхода java 8. Начиная с 8 версии интерфейс может содержать дефолтную реализацию метода
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2016, 13:54
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
может содержать дефолтную реализацию метода
Невиртуального или только виртуального? Если и невиртуального то разница с абстрактными классами вообще исчезла.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.04.2016, 14:02
Fulcrum_013, в джава нет ключевого слова virtual. В интерфейсе можно определить метод и ему можно дать дефолтную реализацию.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
14.04.2016, 19:59  [ТС]
KEKCoGEN, ладно, спасибо, пока приму так, сколько же еще читать...

Добавлено через 1 минуту
Fulcrum_013, Это я понимаю, меня просто заботил вопрос, зачем такие сложности в интерфейсах с пустыми методами, если их всё равно придется реализовать

Добавлено через 19 минут
KEKCoGEN, и дабы не создавать лишних тем, хотел бы узнать, стоит ли читать "философия java", а то все пишут, что данное издание на русском устарело и тд и тп, а мне больше важно сам фундамент из теории заложить
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2016, 23:09
Цитата Сообщение от farta Посмотреть сообщение
Это я понимаю, меня просто заботил вопрос, зачем такие сложности в интерфейсах с пустыми методами, если их всё равно придется реализовать
Компилятор абсолютно ничего от твоих мыслях не знает пока ты ему их явно не напишешь джавой по (какой там у тебя цвет экрана?) цвету. И если ты задумал что у тебя есть какие то взаимосвязанные объекты методы которых ты потом собираешься реализовать, то чтобы компилятор понял что они взаимосвязаны, сначала нужно ему дать эту взаимосвязь (базовый абстрактный класс) и перечислить что у них общего - список методов который потом будет реализован в каждом потомке. Да кстати, точно так же как Java телепатическими способностями не обладают ни PHP ни С# ни Pascal ни даже С++
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.04.2016, 23:34
Цитата Сообщение от farta Посмотреть сообщение
и дабы не создавать лишних тем
см. правила. Один вопрос - одна тема

Цитата Сообщение от farta Посмотреть сообщение
стоит ли читать "философия java"
без понятия. Книг не читал. Спросите в разделе Литература по Java
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
15.04.2016, 00:38  [ТС]
Fulcrum_013, спасибо, вроде что-то прояснилось более менее, для большего понимания нужно наверное больше практики, где придется применять это
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2016, 00:38
Помогаю со студенческими работами здесь

Абстрактные классы и интерфейсы
Помогите пожалуйста!!!Срочно!!! Задание: Создать абстрактный класс Norm с абстрактными методами вычисления нормы и модуля. Определить...

Зачем нужны интерфейсы когда есть абстрактные классы?
Собсно говоря сабж. Не пойму зачем нужны интерфейсы когда то-же самое можно сделать на абстрактных классах. Для примера возьмём...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов: interface Учебное Заведение...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для классов: interface Mobile &lt;- abstract class...

Java интерфейсы и абстрактные класы:
помогите написать программу по Java интерфейсам и абстрактным классам: interface Ткань ß abstract class Одежда ß class Костюм.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru