java interface abstract class tutorial with examples
Този видео урок обяснява какво е интерфейс Java, как да го внедрите и множествено наследяване с помощта на интерфейси в Java с примери:
В един от нашите по-ранни уроци обсъдихме детайлно абстракцията. Там обсъдихме абстрактни класове и абстрактни методи. Знаем, че абстрактните класове осигуряват абстракция, тъй като можем да имаме и някакъв не абстрактен метод в абстрактния клас.
Функцията, която осигурява 100% абстракция в Java, се нарича „ Интерфейс ”. В този урок ще обсъдим интерфейси в Java.
=> Погледнете тук ръководството за начинаещи Java.
Какво ще научите:
- Видео уроци за интерфейси и абстрактни класове
- Какво е интерфейс в Java
- Множество интерфейси в Java
- Заключение
Видео уроци за интерфейси и абстрактни класове
Въведение в интерфейсите и абстрактните класове в Java - Част 1:
Преглед на интерфейсите и абстрактните класове в Java - Част 2:
Абстракция и наследяване в Java:
Какво е интерфейс в Java
Интерфейсът в Java се дефинира като абстрактен тип, който определя поведението на класа. Интерфейсът е вид протокол, който задава правила относно това как трябва да се държи определен клас.
Интерфейсът в Java може да съдържа абстрактни методи и статични константи. По подразбиране всички методи в интерфейса са публични и абстрактни.
Един прост пример за интерфейс в Java е даден по-долу.
interface shape{ public static final String color = “Red”; public void calculateArea(); }
Горният пример дефинира интерфейс ‘shape’, който има статична променлива и абстрактен метод ‘calcuArea ()’.
Интерфейсът е обект, чието тяло има само абстрактни методи. В него може да има и статични крайни променливи.
Така че точно като клас, интерфейсът също може да има методи и променливи, но имайте предвид, че методите са абстрактни (без изпълнение) и променливите са статични.
По-долу са изброени някои свойства, които трябва да се имат предвид, свързани с интерфейсите:
- Интерфейсите са планове за клас. Те казват на класа какво да правят чрез техните методи.
- Интерфейсът определя абстрактни методи и класове, които изпълняват този интерфейс, също трябва да прилагат тези методи.
- Ако клас, изпълняващ интерфейса, не дефинира всички методи на интерфейса, тогава този клас се превръща в абстрактен клас.
Общият синтаксис на декларацията за интерфейса е даден по-долу.
interface { //constant or static fields declaration //abstract method declaration //default declarations }
Както е показано в горната декларация, ние използваме ключова дума Java „интерфейс“, което показва, че декларираме интерфейс сега.
въпроси и отговори за интервю за качествен анализатор
Ключовата дума „интерфейс“ е последвана от име на интерфейс и след това отварящите се фигурни скоби. След това имаме различни декларации за абстрактни методи, декларация за статични полета и т.н. Накрая затваряме фигурните скоби.
Например,ако искаме да декларираме интерфейс „TestInterface“ с два метода в него, т.е. method_one и method_two, тогава декларацията на TestInterface ще бъде както по-долу:
interface TestInterface{ void method_one(); void method_two(); }
Използване на интерфейса в Java
- Интерфейсите в Java осигуряват 100% абстракция, тъй като могат да имат само абстрактни методи.
- Използвайки интерфейси, можем да постигнем множество наследства в Java, което не е възможно при използване на класове.
- За да се постигне свободно свързване, може да се използва интерфейс.
Как да внедрим интерфейс в Java
След като интерфейсът бъде деклариран, можем да го използваме в клас използвайки ключовата дума “implements” в декларацията на класа.
Тази ключова дума ‘implements’ се появява след името на класа, както е показано по-долу:
class implements { //class body }
Внедряването на интерфейс е същото като подписването на договор. Следователно клас, изпълняващ интерфейс, означава, че е подписал договор и се е съгласил да прилага абстрактните методи на интерфейса или с други думи да изпълнява поведението, определено от интерфейса.
Ако класът, изпълняващ интерфейса, не реализира точното поведение, посочено в интерфейса, тогава класът трябва да бъде деклариран като абстрактен.
Пример за изпълнение на интерфейс
По-долу е даден прост пример за интерфейс в Java.
//interface declaration interface Polygon_Shape { void calculateArea(int length, int breadth); } //implement the interface class Rectangle implements Polygon_Shape { //implement the interface method public void calculateArea(int length, int breadth) { System.out.println('The area of the rectangle is ' + (length * breadth)); } } class Main { public static void main(String() args) { Rectangle rect = new Rectangle(); //declare a class object rect.calculateArea(10, 20); //call the method } }
Изход:
Горната програма демонстрира простия пример за интерфейси в Java. Тук декларираме интерфейс с име Polygon_Shape и след това класът Rectangle го реализира.
Конвенция за имената на интерфейси в Java
Конвенциите за именуване на Java са насоките за именуване, които трябва да следваме като програмисти, за да можем да създадем четлив последователен код. Java използва обозначения „TitleCase“ за класовете за именуване и интерфейсите. Той използва обозначения „CamelCase“ за променливи, методи и т.н.
Що се отнася до интерфейса, името на интерфейса е в заглавната част с първата буква на всяка дума от името на интерфейса с главни букви. Имената на интерфейсите са подбрани така, че обикновено са прилагателни. Но когато интерфейсите представляват семейството класове като map или list, тогава те могат да бъдат наречени след съществителни.
Някои примери за валидни имена на интерфейси са дадени по-долу:
public interface Iterable {} public interface List {} public interface Serializable {} public interface Clonable {} public interface Runnable {}
Конструктор на интерфейс
Следващият въпрос е дали интерфейсът има конструктор?
Знаем, че ни трябват обекти за извикване на методи. За да създаваме обекти се нуждаем от конструктори. Но в случай на интерфейси в Java, методите не се прилагат.
Методите на интерфейсите са абстрактни. Следователно няма полза от извикването на тези методи от интерфейса. Второ, тъй като интерфейсите по подразбиране са абстрактни, не можем да създаваме обекти от интерфейса. По този начин не се нуждаем от конструктори за интерфейс.
Методи на интерфейса
В този раздел ще обсъдим как да декларираме интерфейсни методи. По правило интерфейсът може да има само публични методи или по подразбиране методите на интерфейса са публични. В интерфейса не е разрешено да се използва друг модификатор на достъп.
Така че независимо дали изрично го декларираме или не, всеки метод в интерфейса по подразбиране е абстрактен с публична видимост.
Следователно, ако void printMethod () е прототипът, който възнамеряваме да декларираме в интерфейс, тогава следните декларации са еднакви.
void printMethod(); public void printMethod(); abstract void printMethod (); public abstract void printMethod ();
Имайте предвид, че не можем да използваме следните модификатори вътре в интерфейса за интерфейсните методи.
- финал
- статични
- Частен
- защитен
- синхронизирани
- местен
- Strogfp
Сега нека приложим Java програма, за да демонстрираме видимостта на метода на интерфейса.
//declare an interface interface TestInterface { void printMethod(); //default visibility is public. } //interface implementation class TestClass implements TestInterface { //if the access modifier is changed to any other, compiler generates error public void printMethod() { System.out.println('TestClass::printMethod()'); } } class Main { public static void main(String() args) { TestClass tc = new TestClass(); //create an object tc.printMethod(); //call concrete method } }
Изход:
Както вече споменахме, по подразбиране методите на интерфейса са публични. Следователно, когато не посочим модификатор за достъп за метода на интерфейса, тогава той е публичен, както в горната програма.
Да предположим, че променяме декларацията на метода на интерфейса в горната програма, както следва:
private void printMethod ();
Тогава това означава, че посочихме метода на интерфейса printMethod () като частен. Когато компилираме програмата, получаваме следната грешка на компилатора.
грешка: модификатор частен не е разрешен тук
private void printMethod ();
Вторият случай, който можем да тестваме, е чрез промяна на модификатора на внедрения метод в класа TestClass от публичен на частен. Сега модификаторът по подразбиране в класа е private. Така че просто премахваме публичната ключова дума от прототипа на метода в класа, както следва:
void printMethod() { System.out.println('TestClass::printMethod()'); }
Сега, ако компилираме програмата, получаваме следната грешка.
грешка: printMethod () в TestClass не може да внедри printMethod () в TestInterface
void printMethod ()
^
опит за присвояване на по-слаби привилегии за достъп; беше публично
Следователно въпросът, който трябва да се отбележи тук, е, че не можем да променим модификатора на достъпа на внедрения метод на интерфейса на друг модификатор на достъп. Тъй като методите на интерфейса са по подразбиране публични, когато те се прилагат от класове, които реализират интерфейси, тези методи също трябва да бъдат публични.
Интерфейсни полета в Java
Полетата или променливите, декларирани в интерфейс, са по подразбиране публични, статични и окончателни. Това означава, че веднъж декларирани тяхната стойност не може да бъде променена.
Имайте предвид, че ако интерфейсните полета са дефинирани, без да се посочва някой от тези модификатори, тогава Java компилаторите приемат тези модификатори. Например, ако не дефинираме публичен модификатор при деклариране на полето в интерфейса, тогава това се приема по подразбиране.
Когато интерфейсът е реализиран от клас, той осигурява изпълнение за всички абстрактни методи на интерфейса. По същия начин всички полета, декларирани в интерфейса, също се наследяват от класа, който реализира интерфейса. По този начин копие от полето на интерфейса присъства в класа на внедряване.
Сега всички полета в интерфейса са по подразбиране статични. Следователно можем да осъществим достъп до тях, като използваме името на интерфейса директно като същото като достъп до статичните полета на класа, използвайки името на класа, а не обекта.
Примерът на Java програма по-долу показва как можем да осъществим достъп до интерфейсните полета.
//interface declaration interface TestInterface{ public static int value = 100; //interface field public void display(); } //Interface implementation class TestClass implements TestInterface{ public static int value = 5000; //class fields public void display() { System.out.println('TestClass::display () method'); } public void show() { System.out.println('TestClass::show () method'); } } public class Main{ public static void main(String args()) { TestClass testObj = new TestClass(); //print interface and class field values. System.out.println('Value of the interface variable (value): '+TestInterface.value); System.out.println('Value of the class variable (value): '+testObj.value); } }
Изход:
Както е показано в горната програма, до полетата на интерфейса може да се осъществи използване на име на интерфейс, последвано от точков оператор (.) И след това действителното име на променлива или поле.
Общият интерфейс в Java
Ние обсъдихме Java generics в нашите предишни уроци. Освен че имаме общи класове, методи и т.н., можем да имаме и общи интерфейси. Общите интерфейси могат да бъдат посочени по подобен начин по начина, по който ние определяме родови класове.
Общите интерфейси се декларират с параметри на типа, които ги правят независими от тип данни.
Общият синтаксис на родовия интерфейс е както следва:
примери за устройства с интернет на нещата
interface { //interface methods and variables }
Сега, ако искаме да използваме горния родов интерфейс в клас, тогава можем да го използваме дефиницията на класа, както е показано по-долу:
class implements interface_name { //class body }
Имайте предвид, че ние трябва да посочим същия параметър с класа, както и с интерфейса.
Следващата програма на Java демонстрира общите интерфейси в Java.
//generic interface declaration interface MinInterface>{ T minValue(); } //implementation for generic interface class MinClassImpl> implements MinInterface { T() intArray; MinClassImpl(T() o) { intArray = o; } public T minValue() { T v = intArray(0); for (int i = 1; i intMinValue = new MinClassImpl (intArray); MinClassImpl charMinValue = new MinClassImpl(charArray); //call interface method minValue for int type array System.out.println('Min value in intOfArray: ' + intMinValue.minValue()); //call interface method minValue for char type array System.out.println('Min value in charOfArray: ' + charMinValue.minValue()); }
Изход:
Горната програма реализира интерфейс, съдържащ метод за намиране на минималната стойност в масива. Това е родов интерфейс. Класът изпълнява този интерфейс и отменя метода. В основния метод извикваме метода на интерфейса, за да намерим минималната стойност в цяло число и масив от знаци.
Множество интерфейси в Java
В нашата тема за наследяване видяхме, че Java не позволява даден клас да се наследи от множество класове, тъй като води до неяснота, наречена „Диамантен проблем“.
Класът обаче може да наследи или внедри повече от един интерфейс. В този случай това е известно като множествено наследяване. Така че, въпреки че не ни е позволено да реализираме множествено наследяване в Java чрез класове, можем да го направим с помощта на интерфейси.
Следващата диаграма показва множествено наследяване с помощта на интерфейси. Тук клас реализира два интерфейса, т.е. Interface_one и Interface_two.
Имайте предвид, че когато клас изпълнява множество интерфейси, имената на интерфейса са разделени със запетая в декларацията на класа. Можем да приложим толкова много интерфейси, стига да можем да се справим със сложността.
Програмата Java, която демонстрира множество интерфейси, е показана по-долу.
//Interface_One declaration interface Interface_One{ void print(); } //Interface_Two declaration interface Interface_Two{ void show(); } //multiple inheritance - DemoClass implementing Interface_One&Interface_Two class DemoClass implements Interface_One,Interface_Two{ public void print(){ //Override Interface_One print() System.out.println('Democlass::Interface_One_Print ()'); } public void show(){ //Override Interface_Two show() System.out.println('DemoClass::Interface_Two_Show ()'); } } public class Main{ public static void main(String args()){ DemoClass obj = new DemoClass(); //create DemoClass object and call methods obj.print(); obj.show(); } }
Изход:
уебсайтове за конвертиране на видеоклипове в YouTube в mp3
Както е показано по-горе, ние прилагаме два интерфейса. След това заместваме съответните им методи и ги извикваме в основния метод.
Множественото наследяване в Java предоставя всички предимства, които множественото наследяване предоставя в C ++. Но за разлика от множественото наследяване с използване на класове, множественото наследяване с използване на интерфейси е без никаква неяснота.
Наследяване на интерфейса в Java: Интерфейсът разширява интерфейса
Когато клас реализира интерфейс, това се прави с помощта на приспособления Ключова дума. В Java интерфейсът може да наследи друг интерфейс. Това се прави с помощта на удължава Ключова дума. Когато интерфейсът разширява друг интерфейс, той се нарича „ Наследяване на интерфейса ”В Java.
Програмата Java за реализиране на наследяване на интерфейс е показана по-долу.
//Interface_One declaration interface Interface_One{ void print(); } //Interface_Two declaration; inherits from Interface_One interface Interface_Two extends Interface_One{ void show(); } //multiple inheritance - DemoClass implementing Interface_Two class DemoClass implements Interface_Two{ public void print(){ //Override Interface_Two print() System.out.println('Democlass public class Main{ public static void main(String args()){ DemoClass obj = new DemoClass(); //create DemoClass object and call methods obj.print(); obj.show(); } }
Изход:
Променихме същата програма, която използвахме за множествено наследяване, използвайки интерфейси, за да демонстрираме наследяването на интерфейса. Тук ние разширяваме Interface_one в Interface_two и след това започваме да прилагаме Interface_two в клас. Тъй като интерфейсите се наследяват, и двата метода са достъпни за отмяна.
често задавани въпроси
В # 1) Каква е ползата от интерфейса в Java?
Отговор: Интерфейсът в Java е обект, който се използва за постигане на 100% абстракция. Той може да съдържа само абстрактни методи, които могат да бъдат заменени от класа, изпълняващ интерфейса.
Интерфейсът по някакъв начин действа като план на класа, в който предоставя на класа абстрактните методи прототипи и статични константи и след това класът трябва да замени тези методи чрез прилагане на интерфейса.
В # 2) Какви са предимствата на интерфейса в Java?
Отговор: Някои от предимствата на интерфейса са както следва:
- Интерфейсът действа като план на класа.
- Интерфейсът осигурява 100% абстракция в Java, тъй като има всички абстрактни методи.
- Интерфейсите могат да се използват за постигане на множествено наследяване в Java. Java не позволява да наследява от повече от един клас, но клас може да реализира множество интерфейси.
# 3) Може ли интерфейсът да има методи?
Отговор: Интерфейсите могат да имат прототипи на методи и статични и крайни константи. Но като се започне от Java 8, интерфейсите могат да съдържат статични и стандартни методи.
В # 4) Можем ли да обявим интерфейса за окончателен?
Отговор: Не. Ако обявим интерфейс за окончателен, тогава класът няма да може да го реализира. Без да бъде реализиран от какъвто и да е клас, интерфейсът няма да служи на никаква цел.
Повече за интерфейсите
Интерфейсите са чертежи като клас, но той ще има само декларацията на метода. Няма да има метод за изпълнение. Всички методи в интерфейса са публични абстрактни по подразбиране. Интерфейсът на Java 1.8 може да има статични и методи по подразбиране.
Интерфейсите се използват главно в API.
Например: Помислете, че проектирате двигателя на превозното средство.
Когато приключите с хардуерната част, искате някои от софтуерните функционалности да бъдат внедрени от клиент, който използва вашия двигател. Така че, в този случай можете да определите функционалностите на двигателя си в интерфейс.
Interface Engine { void changeGear(int a); void speedUp(int a); }
Правила за интерфейс
- Класът, който изпълнява интерфейса, трябва да реализира всички методи в интерфейса.
- Интерфейсът може да съдържа крайни променливи.
public class Vehicle implements Engine { int speed; int gear; @Override public void speedUp(int a) { this.speed=a; System.out.println('speed'+speed); } @Override public void changeGear(int a) { this.gear=a; System.out.println('gear'+gear); } public static void main(String() args) { // TODO Auto-generated method stub Vehicle objv=new Vehicle(); objv.changeGear(3); objv.speedUp(70); } }
Тук класът Vehicle е подкласът, който изпълнява интерфейса на двигателя.
Какво представляват абстрактните класове?
Абстрактният клас е като клас, но той ще има абстрактни методи и конкретни методи. Абстрактните методи нямат изпълнение. Той ще има само декларацията на метода.
Правила, които трябва да се спазват за абстрактния клас
- Абстрактният клас не може да бъде създаден.
- Child клас, който разширява абстрактния клас, трябва да реализира всички абстрактни методи на родителския клас, или Child класът трябва да бъде деклариран като абстрактен клас.
Когато искате да проектирате частично изпълнение, можете да отидете на абстрактен клас.
Примерна програма за абстрактни класове:
EmployeeDetails.java
public abstract class EmployeeDetails { private String name; private int emp_ID; public void commonEmpDetaills() { System.out.println('Name'+name); System.out.println('emp_ID'+emp_ID); } public abstract void confidentialDetails(int s,String p); }
Класът, който ще разшири абстрактния клас.
HR.java
public class HR extends EmployeeDetails { private int salary; private String performance; @Override public void confidentialDetails(int s,String p) { this.salary=s; this.performance=p; System.out.println('salary=='+salary); System.out.println('performance=='+performance); } public static void main(String() args) { HR hr =new HR(); hr.confidentialDetails(5000,'good'); } }
Основни моменти, които трябва да се отбележат:
- В интерфейсите всички методи няма да имат изпълнение на метод.
- Класът, който изпълнява интерфейса, трябва да реализира всички методи в този конкретен интерфейс.
- Абстрактните класове могат да имат абстрактни методи, както и нормални конкретни методи. Абстрактните методи нямат изпълнение.
- Класът, който разширява абстрактния клас, трябва да има изпълнение за всички абстрактни методи в абстрактния клас.
- Ако подкласът няма достатъчно информация за реализиране на абстрактните методи, тогава подкласът трябва да бъде деклариран като абстрактен клас.
Заключение
В този урок представихме основните концепции за интерфейсите в Java. Обсъдихме дефиницията на интерфейса, заедно с необходимостта от интерфейси. Проучихме техния основен синтаксис и дефиниция. След това обсъдихме как да използваме интерфейси, за които използваме ключовата дума ‘implements’.
Научихме как да използваме множество интерфейси и наследяване на интерфейси в Java. Използвайки множество интерфейси, можем да реализираме множество наследяване в Java. Наследяване на интерфейса е, когато един интерфейс разширява друг интерфейс.
=> Посетете тук, за да видите серията за обучение за Java за всички
Препоръчително четене
- OOP Java: Въведение в обектно-ориентираното програмиране в Java
- Сравними и сравнителни интерфейси в Java
- Подобрения на интерфейса в Java 8 - Java функционален интерфейс
- Урок за интерфейс на Java Map с внедряване и примери
- ListIterator интерфейс в Java с примери
- Интерфейс на маркер в Java: Сериализуем и клонируем
- Задаване на интерфейс в Java: Урок за задаване на Java с примери
- Урок за отражение на Java с примери