#java #классы #объекты
Почему когда Абстрактный класс имплиментирует(реализовывает) 2-3 интерфейса к примеру, он не имплиментирует(реализовывает) методы в себя(Абстрактный класс). То есть если в обычном классе при имплиментации мы обязаны реализовать методы, то в Абстрактном классе компилятор никак не ругается, что мы не реализовали методы. Пробовал через наследников абстрактного класса достучаться до этих методов, да всё работает, но не пойму почему мы их не определяем в абстрактном классе.
Ответы
Ответ 1
Интерфейс по идее должен содержать только сигнатуры методов, определяющие возможности того или иного объекта, к сожалению начиная с Java 8, вас могут смущать интерфейсы, содержащие default реализации методов, но не стоит на них обращать внимания, пока не поймёте, что вам это необходимо. Абстрактный класс имеет всё, что имеет обычный класс, однако один или более его методов не содержит реализации, но тем не менее он является почти полноценным. Т.е. он уже достаточно специфичен и описывает только малую часть моделей, однако он всё ещё обобщает некоторые свойства. Типичный пример приводят на животных. Интерфейс Movable может содержать метод move, однако каждое животное двигается по своему, кто-то летает, кто-то плавает. Далее абстрактным классом может выступать птица - Bird, которая будет содержать поле крыло - Wing. А далее мы реализуем конкретную модель цыплёнок - Chicken, который вроде и содержит крыло, однако летать не умеет, поэтому ему требуется реализовать метод move, не использовав поле Wing, а только перемещение по земле. Однако при написании класса сов - Owl, будем реализовывать метод move в виде полёта используя Wing.Ответ 2
Абстрактным является класс, содержащий один или более абстрактных методов. Такой класс может содержать и обычные методы, наследоваться от другого абстрактного класса, а также имплементировать интерфейсы. Любой класс, который наследуется от абстрактного, обязан реализовать абстрактные методы предка, либо сам быть объявлен абстрактным, оставляя их реализацию потомкам. Полностью свойства интерфейса здесь рассматривать не будем, поясним только то, что касается вопроса. Интерфейс содержит методы без реализации (не считая методов по умолчанию). Имплементировать интерфейсы могут как обычные, так и абстрактные классы. Обычные классы обязаны реализовать методы интерфейса, но абстрактные могут это делать, а могут и нет. interface Iface1{ void method1(); } interface Iface2{ void method2(); } interface Iface3{ void method3(); } abstract class Abs implements Iface1, Iface2, Iface3{ //объявляем собственный абстрактный метод abstract void absMethod(); //объявляем метод интерфейса Iface1, но не реализуем //его здесь (имеем право, но не обязаны!) public abstract void method1(); //реализуем метод из интерфейса Iface2 прямо здесь public void method2(){ System.out.println("I'm method2!"); } /*метод method3 из интерфейса Iface3 мы даже не объявляем и оставляем его для реализации потомкам*/ } class Real extends Abs{ void absMethod(){ System.out.println("I'm a real absMethod!"); } public void method1(){ System.out.println("I'm a real Iface1.method1!"); } public void method3(){ System.out.println("I'm a real Iface3.method3!"); } } class PrimerAbs{ public static void main(String[] args){ Real real = new Real(); real.absMethod(); real.method1(); real.method2(); real.method3(); } } В данном примере объявлены три интерфейса, абстрактный класс, имплементирующий эти интерфейсы и обычный класс, который наследуется от абстрактного. В абстрактном объявлен свой собственный абстрактный метод absMethod(), объявлен метод method1 из интерфейса Iface1, но не реализован, т.к. здесь не обязательно (но можно) это делать, реализован метод method2 из интерфейса Iface2, что возможно, но не обязательно. Метод method3 из интерфейса Iface3 даже не объявлен и предоставлен для решения потомкам. Следует обратить внимание, что в абстрактном классе объявление методов из интерфейса, если они не реализуются в нём, должны быть с модификаторами public и abstract, иначе компилятор начнёт ругаться.
Комментариев нет:
Отправить комментарий