Страницы

Поиск по вопросам

пятница, 22 марта 2019 г.

Зачем абстрактный класс в java

Java изучаю недавно. Застрял на том, что не могу понять роль абстрактного класса в java. В учебнике (не только в одном) нашел пример, описывающий роль абстрактного класса: // Базовая арифметическая операция abstract class Operation { public abstract int calculate(int a, int b); } // Сложение class Addition { public int calculate(int a, int b) { return a+b; } } // Вычитание class Subtraction { public int calculate(int a, int b) { return a-b; } } class Test { public static void main(String s[]) { Operation o1 = new Addition(); Operation o2 = new Subtraction(); o1.calculate(2, 3); o2.calculate(3, 5); } } Но переделав из абстрактного класса обычный, и даже удалив его вообще программа не перестала работать: // Базовая арифметическая операция class Operation { public int calculate(int a, int b) { return a*b; } } // Сложение class Addition extends Operation { public int calculate(int a, int b) { return a+b; } } // Вычитание class Subtraction extends Operation { public int calculate(int a, int b) { return a-b; } } class Test { public static void main(String s[]) { Operation/*Addition*/ o1 = new Addition(); Operation/*Subtraction*/ o2 = new Subtraction(); Operation/*Subtraction*/ o3 = new Subtraction(); Operation o4 = new Operation(); System.out.println(o1.calculate(2, 3)); System.out.println(o2.calculate(3, 5)); System.out.println(o3.calculate(10, 20)); System.out.println(o4.calculate(10, 10)); System.out.println(o1.getClass()==o2.getClass()); System.out.println(o3.getClass()==o2.getClass()); } } Опишите, пожалуйста, пример, в котором удаление абстрактного класса (или "переделывание" в обычный) невозможно и приведёт к ошибке, или просто растолкуйте в каких ситуациях обычный класс не заменит абстрактный. Заранее спасибо.


Ответ

Что за учебник, если не секрет? В приличных книгах по Java все-таки даются основы ООП. Суть вот в чем. Когда вы отмечаете класс как abstract , вы тем самым запрещаете создавать его экземпляры. Поскольку в классе Operation не определен метод calculate, вы не должны иметь возможность создавать его экземпляры: Operation o = new Operation(); Если в классе нет абстрактных методов, то "переделывание" его в обычный никак себя не проявит внешне. Просто появится возможность создать экземпляр этого класса. Конкретно в вашей "переделке" вы определили тело для метода calculate, тем самым изменив логику работы всей вашей иерархии. Если теперь создать еще один дочерний от Operation класс и не определять в нем метод calculate, то он будет использовать реализацию из родительского класса, то есть вычислять произведение двух аргументов. и даже удалив его вообще программа не перестала работать: Не верю. Если вы удалили класс Operation вам пришлось бы править дочерние классы (убирать extends и править main). Кроме того после этого ваши классы Addition и Subtraction стали бы независимыми друг от друга. Вообще, абстрактные классы широко применяются, когда нужно реализовать некоторую общую функциональность для семейства классов.

Комментариев нет:

Отправить комментарий