Ola,
A vantagem de se ter esta estrutura é a facilidade de diagramação, UML, e manutenção.... a definição de uma arquitetura... bom, enfim, acho que tudo de melhor, vc consegue pensar em objetos e em ações.. acho melhor.
Em relação a se ter atributos com tipos de outras classes... em OO tudo são objetos, então se vc quer ter atributos... eles serão objetos, isto serve pra vc conseguir estruturar melhor seu programa, seguindo o exemplo que vc deu, considere os dois cenários:
Cenario 1:
public class Pessoa{
private String logradouro;
private String UF;
private String pais;
private String numero;
private String compl;
private String nome;
private String cpf;
private String RG;
.....
Cenário 2:
public class Endereco{
private String logradouro;
private String UF;
private String pais;
private String numero;
private String compl;
....
}
public class Pessoa{
private Endereco endereco;
private String nome;
private String cpf;
private String RG;
....
Pense da seguinte forma... no cenário 1 esta tudo definido na classe Pessoa, mas pessoa tem atributos que não são diretamente relacionadas a ela... tudo bem, uma pessoa mora numa casa que tem um logradouro... via que volta que dei pra chegar no relacionamento pessoa->logradouro?
No cenario 2 acho que este relacionamento fica melhor estruturado.. não acha?
Em relação a segunda pergunta, o tipo que vc deve usar para passar no construtor de Pessoa é um Endereco.
Bom, espero ter ajudado.