Interfaces, Abstracts - Quando usar?

Quando vou ter certeza em ter que usar estes recursos?

Obrigado!

Abstract seria quando você precisa fazer objetos que são o pai e algo mais, por exemplo a da Pessoa abstract e suas filhas Juridica e Fisica, são todas pessoas com algo a mais

Interface não sei bem explica(olha como expliquei abstract o.0)
Compliquei mais??

Vou tentar explicar de forma curta:
Abstracts e Interfaces são usados quando existe uma hierarquia de classes que têm um pai em comum, mas essa classe pai não tem sentido na lógica do programa.

Um exemplo clássico: Veículos
Um carro é um veículo, um caminhão é um veículo, uma moto é um veículo, mas instanciar um veículo em si não faz sentido. Se um motorista pode dirigir um veículo, quer dizer que na verdade ele pode dirigir qualquer uma das classes de que veículo é pai, pois todas elas têm um interface em comum, ou seja, todas tem métodos em comum, que podem ser implementados de forma diferente, mas que trazem o mesmo resultado. Então o motorista não precisa saber como o método funciona, mas ele sabe qual os métodos chamar e quais os resultados que ele vai obter.

Espero ter ajudado!

99% do tempo em Java você deve usar Interfaces. Tente não usar classes abstratas, por favor.

Use classes abstratas apenas e tão somente no seguinte caso: você já tem uma interface definida e bastante complexa, mas cuja implementação é uma receita de bolo que você precisa apenas mudar uma ou duas coisas, não tudo.

Exemplo disso que lhe falei:
TableModel (que é uma interface com cerca de 9 métodos) e AbstractTableModel (que é uma classe abstrata que implementa TableModel, mas que tem apenas 3 métodos não implementados:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

Um bom uso seria quando você cria uma interface (ou classe abstrata, dependendo do caso) e você define algum método que você quer que todos as classes que implementarem aquela interface devam implementar.

Por exemplo, você tem uma classe de pesquisa, responsável por pesquisar conteúdo em vários sites, mas você quer saber qual o site que retornou o resultado. Numa visão OO você teria uma interface contendo um método abstrato.

interface Pesquisa{
   public abstract String getResultSource();
}

Uma classe factory receberia o texto que você deseja pesquisar e instanciaria uma classe responsável pela pesquisa. Essa classe específica implementaria a interface Pesquisa, então dentro da sua classe factory você pode chamar.

Pesquisa pesquisa= new ClasseEspecifica();

como a sua classe específica implementa a interface pesquisa, você sabe que pode usar

pesquisa.getResultSource()

para obter o site de onde vieram os dados resultantes.

Isso está relacionado com o fato de que, uma vez que a classe específica implementou uma inteface X, ela precisa implementar todos seus métodos.