Talvez um exemplo de código ajude, eu vou usar o C #, mas você deve acompanhar.
Vamos fingir que temos uma interface chamada IPayable
public interface IPayable
{
public Pay(double amount);
}
Agora, temos duas classes concretas que implementam essa interface:
public class BusinessAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
public class CustomerAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
Agora, vamos fingir que temos uma coleção de várias contas. Para isso, usaremos uma lista genérica do tipo IPayable
List<IPayable> accountsToPay = new List<IPayable>();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());
Agora, queremos pagar R $ 50,00 a todas essas contas:
foreach (IPayable account in accountsToPay)
{
account.Pay(50.00);
}
Então agora você vê como as interfaces são incrivelmente úteis.
Eles são usados apenas em objetos instanciados. Não em classes estáticas.
Se você tivesse feito o pagamento estático, ao percorrer o IPayable em accountsToPay, não haveria maneira de descobrir se ele deveria pagar pelo BusinessAcount ou CustomerAccount.