Resumidamente, eu posso afirmar que na herança eu posso usar os atributos e métodos da classe "pai" e na composição também posso, então qual a verdadeira vantagem de usar composição em vez de herança?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Resumidamente, eu posso afirmar que na herança eu posso usar os atributos e métodos da classe "pai" e na composição também posso, então qual a verdadeira vantagem de usar composição em vez de herança?
Olá Tadeu, tudo bem?
Embora tanto a herança quanto a composição permitam que você acesse atributos e métodos de outras classes, a escolha entre elas depende do que você está tentando realizar em seu projeto.
A herança é útil quando você deseja criar uma classe que é uma versão especializada de outra classe. Por exemplo, se você tiver uma classe Animal e quiser criar uma classe Cachorro que herda os atributos e métodos da classe Animal, mas adiciona seus próprios atributos e métodos específicos para Cachorro, então a herança é a melhor escolha.
Já a composição é útil quando você deseja criar um objeto que contém outros objetos. Por exemplo, se você tiver uma classe Pessoa e quiser adicionar um endereço a essa pessoa, você poderia criar uma classe Endereço separada e, em seguida, compor a classe Pessoa com a classe Endereço. Dessa forma, a classe Pessoa teria um atributo que é uma instância da classe Endereço.
Ou seja, a herança é usada para criar uma relação "é um" entre as classes, enquanto a composição é usada para criar uma relação "tem um" entre as classes. A escolha entre elas depende do que você está tentando modelar em seu projeto e da relação que você deseja estabelecer entre as classes.
Excelente explicação @Otávio! Obrigado.