# Java/Características de linguagens orientadas a objetos

Antes de aprender Java, é preciso conhecer quais são as características da Programação Orientada a Objetos (POO) que ela possui. Este capítulo tem por intuito mostrar a filosofia da POO para programadores não habituados à ela.

## O que são Objetos

Em programação, objetos nada mais são do que um conjunto de dados sobre o qual estão definidas algumas operações. Se fôssemos criar um programa capaz de gerar na tela formas geométricas, por exemplo, poderíamos criar um objeto chamado "quadrado" que seria um conjunto de quatro números (que em POO são chamados de Atributos) que representam os seus vértices. O objeto "quadrado" poderia possuir as operações (que em POO são chamadas de Métodos) "MudaPosicao" que serviria para posicionar o quadrado em uma coordenada específica passada como argumento e MudaCor que trocaria a cor do quadrado desenhado na tela.
Os Atributos de um objeto são quaisquer variáveis que eles possuam que representam um número, caractere ou string. Se fôssemos programar um jogo, por exemplo, o personagem que o jogador controla poderia possuir atributos chamados Força, Resistência e Velocidade que seriam variáveis inteiras dentro do código. Ele também poderia possuir um atributo chamado Posição, que seria um vetor de inteiros que armazenariam a sua coordenada na tela.
Os Métodos de um objeto podem ser qualquer ação que o objeto pode executar. No jogo do exemplo acima, o personagem principal poderia possuir métodos chamados Pular, Atirar e Andar. Os Métodos nada mais são do que funções executadas sobre os Atributos de um Objeto.

## Classes

Classes nada mais são do que uma declaração de um objeto no começo do código. Nesta declaração, você especifica quais são os Atributos e Métodos(Comportamentos)de seu objeto. Por exemplo, uma vez que você crie uma classe chamada "quadrado", você pode passar a criar novos objetos pertencentes à esta classe, que poderiam ter diferentes valores para cada um de seus Atributos.
Classe é um conjunto de especificaçãos técnica de um objeto, Nesta declaração, pode-se especificar quais são os Atributos e Metodos(Comportamentos) da classe. Por exemplo, uma vez que seja criada uma classe chamada "quadrado", pode-se passar a criar novos objetos pertencentes à esta classe, que podem ter diferentes valores para cada um de seus Atributos.

## Herança

Herança é a capacidade que as classes tem de passar informações umas para as outras. Através da herança é possível criar fácil e rapidamente novos tipos de classes baseadas nas classes existentes. Por exemplo, assumindo que existe uma classe chamada "Veiculo", poderíamos gerar uma nova classe chamada "Carro", e outra classe chamada "Caminhao" que herdam (ou são filhas) de "Veiculo".
A classe "Veiculo" possui todos os Atributos que tem em comum entre um caminhão e um carro. Ambos possuem caracteristicas (Atributos) como, número de rodas, tipo de combustível, quantidade de portas, etc. Estes Atributos estão definidos na classe "Veiculo". Por sua vez, as classes "Carro" e "Caminhão", além de herdarem os atributos da classe "Veiculo", podem possuir seus próprios Atributos exclusivos. O mesmo ocorre com os Metodos.
Por exemplo, a classe "Caminhao", que poderia ter o Atributo numero de marchas reduzidas, que não faz sentido para um carro, apenas para um caminhão.
Para identificar se dois objetos tem uma relação de herança, deve-se analisar se o relacionamento é do tipo "é um tipo de". Por exemplo, Carro é um tipo de Veiculo, logo Carro herda de Veiculo; Cachorro é um tipo de Mamifero, e assim por diante.
Nota: em outras linguagens orientadas a objeto, como C++, existe herança múltipla, ou seja, uma classe pode herdar de mais de uma. Ex.: 'morcego é um tipo de mamífero' E 'morcego é um tipo de animal que voa'. Em java NÃO EXISTE herança múltipla! O que pode ser feito para simular isso é implementar uma Interface, mas isso será visto mais adiante.

## Sobrecarga de métodos

Algumas vezes uma mesma operação pode ser feita de diversas maneiras, utilizando informações diferentes. Isso pode ser feito utilizando a sobrecarga de métodos. Consiste em criar mais de um método com o mesmo nome, porém com parâmetros de entrada diferentes. Isso é muito usado quando uma função tem valores padrão. Cria-se um método que recebe 3 parâmetros de entrada, e outro que não recebe nenhum, este ultimo irá invocar o primeiro passando os 3 valores padrão.

## Sobreescrita de métodos

Quando a herança é usada, a classe 'filha' herda todos os métodos da classe 'pai', porém, as vezes isso pode trazer alguns problemas. Para dar mais flexibilidade, é possível sobreescrever um método, ou seja, criar uma nova implementação daquele método para a classe filha.

## Polimorfismo

Poli (muitas) morphos (formas) permite ao desenvolvedor utilizar uma mesma assinatura de método para desempenhar funções similares, de acordo com o contexto. Um exemplo de polimorfismo no exemplo utilizado na herança seria um método que retorna a autonomia do veículo. No carro, este método tem que verificar a potência do motor e o combustível usado (alcool ou gasolina) no caminhão, teria que verificar o peso da carga e a potência do motor.
A vantagem do polimorfismo está no fato que um trecho de código, muitas vezes não sabe se o objeto Veiculo é um caminhão ou um carro, bastando chamar o método que retorna a autonomia, se o objeto for um carro, a virtual machine invoca o método do carro, se o objeto for um caminhão, ela invoca o método do caminhão.

## Associação

Uma associação define uma relação entre duas classes que permite com que um objeto de uma classe utilize objetos de outra classe. Exemplo: Uma classe Motorista possui uma associação com a classe Volante, visto que objetos da classe Motorista vão utilizar objetos da classe Volante . Agregação e composição são dois casos específicos de associação.

## Agregação

A agregação é um relacionamento onde a classe A se relaciona com a classe B, de forma com que objetos da classe A utilizam objetos da classe B. No entanto, a existência dos objetos da classe B não depende da existência dos objetos da classe A. Exemplo: Um objeto da classe Estudante utiliza objetos da classe SalaDeAula, porém a existência dos objetos da classe Estudante não depende da existência dos objetos da classe SalaDeAula.

## Composição

A composição é um relacionamento onde a classe A se relaciona com a classe B, de forma com que objetos da classe A utilizam objetos da classe B, e a existência dos objetos da classe B dependem da existência dos objetos da classe A. Exemplo: Um objeto da classe SalaDeEstar dependem de objetos da classe Casa.

## Vantagens da Programação orientada à Objetos

* Modularidade: Uma vez que um objeto é criado, ele pode funcionar independente do resto do programa. Ele pode ser aproveitado em outros programas ou substituído por algum outro objeto.
* Encapsulamento: Uma vez que objetos são criados, você só precisa se concentrar em usá-los, sem se preocupar com os detalhes de sua implementação.

## Desvantagens da Programação Orientada à Objetos

* Alguns tipos de programas podem ficar mais difíceis de serem criados usando POO.
* Por ser uma filosofia de programação de mais alto nível, os programas tendem a ser mais lentos.

## Ver também

* Programação orientada a objetos - conceitos