Interface
Abstract
Interface
Difference
When to use what?
Abstract and Interface

public interface Drivable
{
	// Constant
	int wheel = 4;

	// Abstract methods
	String getMaker();
	void setMaker(String m);

	// Static methods
	static String getType()
	{
		return "Wheel: "+4;
	}

	// Default methods
	default void display()
	{
		System.out.println("Wheel: "+wheel);
	}
}
			
public abstract class Car implements Drivable
{
	private String maker;

	public Car(String m)
	{
		maker = m;
	}

	public String getMaker()
	{
		return maker;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	@Override
	public String toString()
	{
		return "Maker: "+maker;
	}

	public abstract void display();
}
			
public class Buick extends Car
{
	private String color;

	public Buick(String m, String c)
	{
		super(m);
		color = c;
	}

	public String getColor()
	{
		return color;
	}

	public void setColor(String c)
	{
		color = c;
	}

	public String toString()
	{
		return super.toString()+" "+"Color: "+color;
	}

	@Override
	public void display()
	{
		System.out.println("Buick display ...");
	}
}
			
public class Test
{
	public static void main(String args[])
	{
		Drivable d = new Buick("Buick", "White");

		System.out.println(d.wheel);//static field
		System.out.println(Drivable.getType());//static method
		d.display();//default method
		System.out.println(d);//toString

		Buick b = new Buick("Honda", "Buick");

		System.out.println(b.getMaker()+" "+b.getColor());//abstract methods
	}
}
			

Multiple Inheritance
public interface Drivable
{
	// Constant
	int wheel = 4;

	// Abstract methods
	String getMaker();
	void setMaker(String m);

	// Default methods
	default void display()
	{
		System.out.println("Wheel: "+wheel);
	}
}
			
public interface Paintable
{
	String getColor();
	void setColor(String c);
}
			
public class Car implements Drivable, Paintable
{
	private String maker;
	private String color;

	public Car(String m, String c)
	{
		maker = m;
		color = c;
	}

	public String getColor()
	{
		return color;
	}

	public String getMaker()
	{
		return maker;
	}

	public void setColor(String c)
	{
		color = c;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	@Override
	public String toString()
	{
		return "Maker: "+maker+" Color: "+color;
	}
}
			
public class Test
{
	public static void main(String args[])
	{
		Drivable c = new Car("Buick", "White");

		System.out.println(c.getMaker());

		Paintable c2 = new Car("Honda", "Blue");

		System.out.println(c2.getColor());
	}
}
			

Implements Interfaces Containing Same Functions
public interface Drivable
{
	// Constant
	int wheel = 4;

	// Abstract methods
	String getMaker();
	void setMaker(String m);

	// Default methods
	default void display()
	{
		System.out.println("Driable ...");
	}
}
			
public interface Paintable
{
	String getColor();
	void setColor(String c);

	default void display()
	{
		System.out.println("Paintable ...");
	}
}
			
public class Car implements Drivable, Paintable
{
	private String maker;
	private String color;

	public Car(String m, String c)
	{
		maker = m;
		color = c;
	}

	public String getColor()
	{
		return color;
	}

	public String getMaker()
	{
		return maker;
	}

	public void setColor(String c)
	{
		color = c;
	}

	public void setMaker(String m)
	{
		maker = m;
	}

	@Override
	public void display()
	{
		Drivable.super.display();
		Paintable.super.display();
	}

	@Override
	public String toString()
	{
		return "Maker: "+maker+" Color: "+color;
	}
}
			
Reference