Javaのインターフェースの利点とは?

Javaのインターフェースの利点がイマイチ分かりにくい。その道のプロに聞くと、継承の代わりに使われることが多くなったとか。

ただ、メソッドの引数にインターフェース型を使えるという点が一つの便利さかも知れない。

--- GreetingMessages1.java ---

package testFolder.interface2;

public interface GreetingMessages1 {

    void morning();
    void afternoon();
    void night();
}


--- English1.java ---

package testFolder.interface2;

public class English1 implements GreetingMessages1 {

public English1() {

}

@Override
public void morning() {
        System.out.println("Good morning.");
}

@Override
public void afternoon() {
System.out.println("Good afternoon.");
}

@Override
public void night() {
System.out.println("Good night.");
}

}


--- Janapese1.java ---

package testFolder.interface2;

public class Japanese1 implements GreetingMessages1 {

public Japanese1() {

}

@Override
public void morning() {
        System.out.println("Ohayo.");
}

@Override
public void afternoon() {
        System.out.println("Konnichiwa.");
}

@Override
public void night() {
        System.out.println("Kombanwa.");
}

}


--- InvokeGreet1.java ---

package testFolder.interface2;

public class InvokeGreet1 {

// interface GreetingMessages1 as parameter
public InvokeGreet1(){
}
public void invoke(GreetingMessages1 greeter){ // <-- ここに注目
greeter.afternoon();
}

public static void main(String[] args) {
English1 person_eng  = new English1();
Japanese1 person_jpn = new Japanese1();
InvokeGreet1 invokegreet = new InvokeGreet1();

// Polymorphism? if文やswitch文が不要?
invokegreet.invoke(person_eng); // <-- ここに注目
invokegreet.invoke(person_jpn); // <-- ここに注目
}

}