O relacionamento tem um define um acoplamento entre duas classes distintas.
Por exemplo:
Um carro tem um motor.
Se definirmos a classe carro fica assim:
public class Carro {
private Motor motor;
}
Note que o motor é uma propriedade do carro. Se tornou um atributo privado da classe.
Agora, um Carro é um automóvel. Novamente, nossa classe carro fica assim:
public class Carro extends Automovel {
private Motor motor;
//Demais implementações
}
Por isso, o carro é filho da classe automóvel, e é perfeitamente legal dizer:
Automovel palio = new Carro(); //O automóvel da variável palio é um carro.
Mas não é valido fazer:
Carro carro = new Motor(); //O carro tem um motor, mas não é um motor!
Motor motor = new Carro(); //O motor não é um carro!
Quanto a usarmos os dois relacionamentos ao mesmo tempo. Sim, é possível. Considere a classe Diretorio:
public class Diretorio extends File {
private List<File> files;
//Demais implementações
}
Um diretório tem uma lista de arquivos, mas por sua vez também é um arquivo!!! Note que nesse caso são dois relacionamento e não um só com dupla função.