Поиск по сайту:

Интерфейс в 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

  1. interface is the code that is used to create an interface in java.

  2. We can’t instantiate an interface in java.

  3. 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.

  4. Interfaces can’t have constructors because we can’t instantiate them and interfaces can’t have a method with body.

  5. 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.

  6. 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.

  7. 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.

  8. implements keyword is used by classes to implement an interface.

  9. 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;
    	}
    
    }
    
  10. 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

  1. Интерфейс предоставляет контракт для всех классов реализации, поэтому лучше писать код с точки зрения интерфейсов, поскольку классы реализации не могут удалить используемые нами методы.
  2. Интерфейсы хороши в качестве отправной точки для определения типа и создания иерархии верхнего уровня в нашем коде.
  3. Поскольку класс Java может реализовывать несколько интерфейсов, в большинстве случаев лучше использовать интерфейсы в качестве суперкласса.

Недостатки интерфейса Java

Хотя интерфейсы предоставляют много преимуществ, они также имеют некоторые недостатки.

  1. 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.

  2. 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.