1. One of the main difference is introduction of static and default methods in interface. This will gradually obsolete the use of abstract classes in java
reference ; http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
example :
public interface HasFieldValue<T> { T getFieldValue(); static <T> String getFieldAsString( HasFieldValue<T> hasFieldValue ) { return ( hasFieldValue != null ) ? hasFieldValue.getFieldValue().toString() : ""; } static <R extends HasFieldValue<V>, V> R fromValue( R[] possibleResultValues, V fieldValue ) { if ( fieldValue != null ) { for ( R resultValue : possibleResultValues ) { if ( resultValue.getFieldValue().toString().equals( fieldValue.toString() ) ) { return resultValue; } } } default Object getDefaultForEmptyField() { throw new IllegalArgumentException( "Field cannot be blank" ); } }
2. lamba expressions..