Копаясь в интернете я до сих пор встречаю вопросы от пользователей в чем же отличия абстрактного класса от интерфейса. Как оказалось он до сих пор актуален среди работодатель, которые вовремя собеседования предлагают ответить на этот вопрос. При чем некоторые из них пытаются сбить столку начинающего программиста, дают код и предлагают объяснить в чем разница.
Можете посмотреть код и подумать в чем разница:
1 2 3 4 5 6 |
public abstract class One_Abstract { public static final int two = 0; public abstract void methodAbs1(); public abstract void methodAbs2(); } |
1 2 3 4 5 6 |
public interface One_Interface { public static final int one = 0; public abstract void method1(); public abstract void method2(); } |
Кто то смотря на него пытается сравнить методы и переменные. Но это все не верно. Верным ответом на этот вопрос будет разница приведенного блока код в наследовании.
Начнем с теории. В абстрактных классах можно реализовать методы без ключевого слова abstract которые могут содержать тело метода. Вот пример:
1 2 3 4 5 6 7 8 9 10 |
public abstract class One_Abstract { public static final int two = 0; public abstract void methodAbs1(); public abstract void methodAbs2(); public void abs(){ System.out.println("nookery.ru"); } } |
А вот в интерфейс методы можно только объявить, тела они не могут иметь.
Теперь подробно разберем наследования интерфейса и абстрактного класса в примерах. Создадим два интерфейса у моих имя One_Interface и Two_Interface, объявим в нем переменную и методы. Так же создадим один абстрактный класс с именем One_Abstract и объявим в нем переменную и методы. Смотрим что у меня получилось.
1 2 3 4 5 6 7 |
//nookery.ru public interface One_Interface { public static final int one = 0; public abstract void method1(); public abstract void method2(); } |
1 2 3 4 5 6 7 8 9 |
//nookery.ru public interface Two_Interface { public static final int two = 0; public abstract void method3(); public abstract void method4(); } |
1 2 3 4 5 6 7 8 9 |
//java-soft.ru public abstract class One_Abstract { public static final int two = 0; public abstract void methodAbs1(); public abstract void methodAbs2(); } |
Теперь перейдем в главный класс в котором создадим два внутренних класса. Один класс будет наследоваться от абстрактного класса и реализует все его методы. Второй класс будет наследовать одновременно оба интерфейса и реализовывать их методы. Можете посмотреть мой код ниже как у меня это получилось.
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 |
//nookery.ru public class Test_interface implements One_Interface,Two_Interface{ @Override public void method1() { System.out.println("Мы использовали 1 метод интерфейса "); } @Override public void method2() { System.out.println("Мы использовали 2 метод интерфейса "); } @Override public void method3() { System.out.println("Мы использовали 3 метод интерфейса "); } @Override public void method4() { System.out.println("Мы использовали 4 метод интерфейса "); } } public class Test_abstract extends One_Abstract { @Override public void methodAbs1() { System.out.println("Мы использовали 1 метод абстрактного класса"); } @Override public void methodAbs2() { System.out.println("Мы использовали 2 метод абстрактного класса"); } } Test_interface i=new Test_interface(); Test_abstract a=new Test_abstract(); public static void main(String[] args){ Test t=new Test(); t.a.methodAbs1(); t.a.methodAbs2(); t.i.method1(); t.i.method2(); t.i.method3(); t.i.method4(); } } |
Результатом работы программы будет:
Мы использовали 1 метод абстрактного класса
Мы использовали 2 метод абстрактного класса
Мы использовали 1 метод интерфейса
Мы использовали 2 метод интерфейса
Мы использовали 3 метод интерфейса
Мы использовали 4 метод интерфейса