Интерфейс в Java
Интерфейс в java является одним из основных понятий. Интерфейс Java является основной частью языка программирования Java и широко используется не только в JDK, но и в шаблонах проектирования Java. Большинство фреймворков активно используют интерфейс Java.
Интерфейс в Java
Пример интерфейса Java
Исходя из вышеуказанных требований, наш интерфейс Shape будет выглядеть следующим образом. Shape.java
package com.journaldev.design;
public interface Shape {
//implicitly public, static and final
public String LABLE="Shape";
//interface methods are implicitly abstract and public
void draw();
double getArea();
}
Важные моменты об интерфейсе в Java
-
interface
is the code that is used to create an interface in java. -
We can’t instantiate an interface in java.
-
Interface provides absolute abstraction, in last post we learned about abstract classes in java to provide abstraction but abstract classes can have method implementations but interface can’t.
-
Interfaces can’t have constructors because we can’t instantiate them and interfaces can’t have a method with body.
-
By default any attribute of interface is public, static and final, so we don’t need to provide access modifiers to the attributes but if we do, compiler doesn’t complain about it either.
-
By default interface methods are implicitly abstract and public, it makes total sense because the method don’t have body and so that subclasses can provide the method implementation.
-
An interface can’t extend any class but it can extend another interface.
public interface Shape extends Cloneable{}
is an example of an interface extending another interface. Actually java provides multiple inheritance in interfaces, what is means is that an interface can extend multiple interfaces. -
implements
keyword is used by classes to implement an interface. -
A class implementing an interface must provide implementation for all of its method unless it’s an abstract class. For example, we can implement above interface in abstract class like this:
ShapeAbs.java
package com.journaldev.design; public abstract class ShapeAbs implements Shape { @Override public double getArea() { // TODO Auto-generated method stub return 0; } }
-
We should always try to write programs in terms of interfaces rather than implementations so that we know beforehand that implementation classes will always provide the implementation and in future if any better implementation arrives, we can switch to that easily.
Пример реализации интерфейса Java
Теперь давайте посмотрим на реализацию нашего интерфейса Shape в java. Circle.java
package com.journaldev.design;
public class Circle implements Shape {
private double radius;
public Circle(double r){
this.radius = r;
}
@Override
public void draw() {
System.out.println("Drawing Circle");
}
@Override
public double getArea(){
return Math.PI*this.radius*this.radius;
}
public double getRadius(){
return this.radius;
}
}
Обратите внимание, что класс Circle реализовал все методы, определенные в интерфейсе, и у него есть некоторые собственные методы, такие как getRadius()
. Реализации интерфейса могут иметь несколько типов конструкторов. Давайте посмотрим на другую реализацию интерфейса для интерфейса Shape. Прямоугольник.java
package com.journaldev.design;
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double w, double h){
this.width=w;
this.height=h;
}
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
@Override
public double getArea() {
return this.height*this.width;
}
}
Обратите внимание на использование аннотации переопределения, узнайте, почему мы всегда должны использовать аннотацию переопределения при переопределении метода в java. Вот тестовая программа, показывающая, как кодировать с точки зрения интерфейсов, а не реализаций. ShapeTest.java
package com.journaldev.design;
public class ShapeTest {
public static void main(String[] args) {
//programming for interfaces not implementation
Shape shape = new Circle(10);
shape.draw();
System.out.println("Area="+shape.getArea());
//switching from one implementation to another easily
shape=new Rectangle(10,10);
shape.draw();
System.out.println("Area="+shape.getArea());
}
}
Вывод приведенной выше примерной программы интерфейса Java:
Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0
Преимущества интерфейса Java
- Интерфейс предоставляет контракт для всех классов реализации, поэтому лучше писать код с точки зрения интерфейсов, поскольку классы реализации не могут удалить используемые нами методы.
- Интерфейсы хороши в качестве отправной точки для определения типа и создания иерархии верхнего уровня в нашем коде.
- Поскольку класс Java может реализовывать несколько интерфейсов, в большинстве случаев лучше использовать интерфейсы в качестве суперкласса.
Недостатки интерфейса Java
Хотя интерфейсы предоставляют много преимуществ, они также имеют некоторые недостатки.
-
We need to chose interface methods very carefully at the time of designing our project because we can’t add of remove any methods from the interface at later point of time, it will lead compilation error for all the implementation classes. Sometimes this leads to have a lot of interfaces extending the base interface in our code that becomes hard to maintain.
-
If the implementation classes has its own methods, we can’t use them directly in our code because the type of Object is an interface that doesn’t have those methods. For example, in above code we will get compilation error for code
shape.getRadius()
. To overcome this, we can use typecasting and use the method like this:Circle c = (Circle) shape; c.getRadius();
Although class typecasting has its own disadvantages.
Это все, что у меня есть для интерфейса в java. Поскольку мы часто используем интерфейс Java, мы должны знать о его особенностях. Убедитесь, что вы используете интерфейсы при проектировании системы и в качестве контракта между клиентом и подклассами, реализующими интерфейсы. Обновление: Java 8 изменил определение интерфейсов с введением методов по умолчанию и реализацией статических методов. Для получения более подробной информации, пожалуйста, прочитайте интерфейс Java 8.