суббота, 13 июля 2013 г.

Абстрактные классы и интерфейсы

Наверное каждый слышал (читал) про интерфейсы и абстрактные классы. И иногда задумывался, а в чем между ними разница?
Мне самому было интересно, почитав литературу и полистав станицы интернета, решил написать что к чему, потому что информация идет вразброс, я решил попробовать ее собрать воедино.

Абстрактные классы

Абстрактный класс может содержать(и не содержать) абстрактные методы и свойства, а также  обозначается как abstract. В таком классе не реализуются методы, однако они должны быть реализованы в неабстрактных потомках.
Немаловажным фактором есть то, что абстрактные классы реализуют на практике один из принципов ООП - полиморфизм.
Ну  вроде понятно. Абстрактные классы пишутся для уменьшения кода, за счет наследования и являются, я бы даже назвал "каркасом" для наследников.
Ниже приведен пример абстрактного класса:

public abstract class Human {
  abstract void say(String word); 
  abstract void setName(String name); 
  abstract String getName();
} 

Интерфейсы

Интерфейс в моем понимании, это класс, в котором реализовываются методы(без тела кода). Класс реализующий интерфейс, должен описать реализацию каждого метода этого интерфейса.
Кстати интерфейс может наследовать другие интерфейсы. Возможно вы слышали в С++ про множественное наследование классов,так вот,в Java такую возможность убрали, поскольку это путает код и небезопасно. Вместо этого есть интерфейсы, и класс может  реализовывать их множество. Стоит помнить, что интерфейс не порождает объектов, да и в принципе такая возможность не нужна, ведь можно создать объект из класса который реализует интерфейс.
Перед описанием интерфейса указывается ключевое слово interface. Когда класс реализует интерфейс, то после его имени указывается ключевое слово implements и далее через запятую перечисляются имена тех интерфейсов, методы которых будут полностью описаны в классе. Все методы интерфейса по-умолчанию являются публичными (public) и абстрактными (abstract), а поля - public static final.
 Пример интерфейса приведен ниже:

public interface Human {
  void setName(String name); 
  String getHumenName(); 
}

Ключевые моменты:

  • Абстрактный класс может реализовывать методы; интерфейс такой возможности не имеет;
  • В Java класс может наследоваться (реализовываться) от многих интерфейсов, но только от одного абстрактного класса.
  • С абстрактными классами вы теряете индивидуальность класса, наследующего его; с интерфейсами вы просто расширяете функциональность каждого класса.
  • Интерфейс расширяет класс, определяет поведение класса;
  • Абстрактный класс - это каркас для наследников, или базовый класс;
  • Интерфейсы и абстрактные классы не порождают объектов.

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

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