Search code examples
javainterfacejava-8default-implementation

Can an interface method have a body?


I know that an interface is like a 100% pure abstract class. So, it can't have method implementation in it. But, I saw a strange code. Can anyone explain it?

Code Snippet:

 interface Whoa {
        public static void doStuff() {
            System.out.println("This is not default implementation");
        }
 }

EDIT:

My IDE is Intellij Idea 13.1. The project SDK is java 7 <1.7.0_25>. The IDE is not showing any compiler error. But, When I compile the code at command line I am getting the following message.

Whoa.java:2: error: modifier static not allowed here
    public static void doStuff() {
                       ^

Solution

  • From Java 8 you can define static methods in interfaces in addition to default methods.

    • A static method is a method that is associated with the class in which it is defined rather than with any object. Every instance of the class shares its static methods.

    • This makes it easier for you to organize helper methods in your libraries; you can keep static methods specific to an interface in the same interface rather than in a separate class.

    • The following example defines a static method that retrieves a ZoneId object corresponding to a time zone identifier; it uses the system default time zone if there is no ZoneId object corresponding to the given identifier. (As a result, you can simplify the method getZonedDateTime)

    Here is code :

    public interface TimeClient {
       // ...
        static public ZoneId getZoneId (String zoneString) {
            try {
                return ZoneId.of(zoneString);
            } catch (DateTimeException e) {
                System.err.println("Invalid time zone: " + zoneString +"; using default time zone instead.");
                return ZoneId.systemDefault();
            }
        }
    
       default public ZonedDateTime getZonedDateTime(String zoneString) {
          return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
       }    
    }
    

    See also