Interface in java is one of the core concept. Java Interface is core part of java programming language and used a lot not only in JDK but also java design patterns. Most of the frameworks use java interface heavily.
Interface in java provide a way to achieve abstraction. Java interface is also used to define the contract for the subclasses to implement. For example, let’s say we want to create a drawing consists of multiple shapes. Here we can create an interface Shape
and define all the methods that different types of Shape objects will implement. For simplicity purpose, we can keep only two methods - draw()
to draw the shape and getArea()
that will return the area of the shape.
Based on above requirements, our Shape interface will look like this. 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();
}
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.
Now lets see some implementation of our Shape interface in 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;
}
}
Notice that Circle class has implemented all the methods defined in the interface and it has some of its own methods also like getRadius()
. The interface implementations can have multiple type of constructors. Lets see another interface implementation for Shape interface. Rectangle.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;
}
}
Notice the use of override annotation, learn about annotations in java and why we should always use override annotation when overriding a method in java. Here is a test program showing how to code in terms of interfaces and not implementations. 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());
}
}
Output of the above java interface example program is:
Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0
Although interfaces provide a lot of advantages but it has some disadvantages too.
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.
Thats all I have for interface in java. Since we use java interface a lot, we should be aware of its features. Make sure you use interfaces in designing the system and as a contract between the client and the subclasses implementing the interfaces. Update: Java 8 has changed the definition of interfaces with the introduction of default methods and static methods implementation. For more details, please read Java 8 interface.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
Please Light on Java8 and above Interface.
- Saeed
why LABEL is used in shape class???
- divija
why we cant create object for abstract class ?
- Rani
Hi, Pankaj I dont understand interfaces! how does interfaces support code reusability when interface dont have any definition (only declaration) and the fact that anyways we’ve to write a definition in the class which we are using to implement interfaces ? why we need extra code of interface… and if we want to use the same behavior then we can call that method by creating that class object… please help me with proper example of interface…… Thanks, Ram R
- Ramachandran R
nice very nice. keep writing thanks
- Anurag Singh
@Asha import java.util.*; import java.lang.*; interface Circle{ void area_circle(); void circum_circle(); } interface Square{ void area_square(); void circum_square(); } interface Rectangle{ void area_rect(); void circum_rect(); } class Shapes implements Circle,Square,Rectangle{ public void area_circle(int r){ double area=3.14*Math.sqrt®; System.out.println(“Area of Circle :”+ area); } public void circum_circle(int r){ double circum=6.28*r; System.out.println(“Circumference of Circle :”+ circum); } public void area_square(int a){ int area=a*a; System.out.println(“Area of Square :”+ area); } public void circum_square(int a){ int circum=4*a; System.out.println(“Circumference of Square :”+ circum); } public void area_rect(int l,int b){ int area=l*b; System.out.println(“Area of Rectangle :”+ area); } public void circum_rect(int l,int b){ int circum=2*l+b; System.out.println(“Circumference of Rectangle :”+ circum); } } class ShapesTest{ public static void main(String args[]){ Shapes sh=new Shapes(); sh.area_circle(3); sh.circum_circle(3); sh.area_square(4); sh.circum_square(4); sh.area_rect(10,20); sh.circum_rect(10,20); } } You have to implement all the unimplemented methods from all the interfaces. like … @Override public void area_rect() { } @Override public void circum_rect() { } @Override public void area_square() { } @Override public void circum_square() { } @Override public void area_circle() { } @Override public void circum_circle() { }
- APPPYA
Hi, Pankaj I dont understand interfaces! how does interfaces support code reusability when interface dont have any definition (only declaration) and the fact that anyways we’ve to write a definition in the class which we are using to implement interfaces ? why we need extra code of interface… and if we want to use the same behavior then we can call that method by creating that class object… please help me with proper example of interface… Thanks, Gandhimathi
- Gandhimathi
PLS DO HELP ME!!!..It sayz “Shape is not abstract and does not override abstract method circum_circle() in Circle.”“” import java.util.*; import java.lang.*; interface Circle{ void area_circle(); void circum_circle(); } interface Square{ void area_square(); void circum_square(); } interface Rectangle{ void area_rect(); void circum_rect(); } class Shapes implements Circle,Square,Rectangle{ public void area_circle(int r){ double area=3.14*Math.sqrt®; System.out.println(“Area of Circle :”+ area); } public void circum_circle(int r){ double circum=6.28*r; System.out.println(“Circumference of Circle :”+ circum); } public void area_square(int a){ int area=a*a; System.out.println(“Area of Square :”+ area); } public void circum_square(int a){ int circum=4*a; System.out.println(“Circumference of Square :”+ circum); } public void area_rect(int l,int b){ int area=l*b; System.out.println(“Area of Rectangle :”+ area); } public void circum_rect(int l,int b){ int circum=2*l+b; System.out.println(“Circumference of Rectangle :”+ circum); } } class ShapesTest{ public static void main(String args[]){ Shapes sh=new Shapes(); sh.area_circle(3); sh.circum_circle(3); sh.area_square(4); sh.circum_square(4); sh.area_rect(10,20); sh.circum_rect(10,20); } }
- asha
In java, an interface is a blueprint of a class. It has provide only static constants and abstract methods in java.The interface is a mechanism to achieve fully abstraction. There can be only abstract methods in interface, not method body. An Interface is used to achieve fully abstraction and multiple inheritance in Java.Java Interface represents IS-A relationship. Interface is also not be instantiated just like abstract class.By default, Interface fields are public, static and final and methods are public abstract in java.
- RoyJain
Thanks, your article is very useful and unique, because illustrates the reasons for using interfaces perfectly.
- Mohammed