Conceitos De Orientação a Objetos em Java

Conceitos De Orientação a Objetos em Java

Composição

É quando uma classe compõe outra. Imagem uma empresa que trabalhe com pedidos. Então um cliente desta empresa pode ter um pedido. Neste sentido, a classe cliente tem na sua composição uma ou várias instancias da classe de pedido. Para saber em qual contexto utilizar composição, basta se perguntar se uma classe tem outra, como no exemplo em que um cliente tem um ou vários pedidos.

Herança

Utilizado quando se com o objetivo de permitir o reuso de código uma classe é criada para ser herdada por outras classes. Por exemplo, imagine que uma empresa trabalhe com conta corrente e conta poupança, para não criar dados repetidos entre as duas classes, como o saldo, é criado então uma terceira classe, que pode ser chamada de conta. Nela, ficara os dados em comum das duas contas e então as outras duas classes herdarão as propriedades e métodos dela. Para saber em qual contexto deve ser usado a herança, basta se perguntar se uma classe é a outra, no caso, uma conta poupança é uma conta, por isso a sua utilização se torna válida.

Upcasting

Utilizado quando se vai fazer o casting da subclasse para a superclasse. Reutilizando o exemplo de herança, upcasting seria criar uma instancia de conta corrente em uma variável do tipo conta. Isso é utilizado para fazer polimorfismo, como será explicado mais pra frente.

Downcasting

O inverso do upcasting. Serve para fazer o casting da superclasse para a subclasse. Reutilizando o exemplo da herança, seria criar uma instancia de conta em conta corrente. Tem uso comum em métodos que recebem parâmetros genéricos.

Sobreposição

É utilizado quando o método de uma subclasse precisa sobrepor o de uma super classe. No exemplo das contas, imagine que a classe conta tenha um método saque. Este método saca um determinado valor subtraindo do saldo da conta. Mas na classe de conta corrente, esse saque adiciona uma taxa de 5 reais. Sendo assim, é possível na classe da conta corrente sobrepor esse método de saque, enquanto na outra conta, a da poupança, continuasse utilizando o método saque da superclasse.

É comum utilizar a anotação @Override em cima de um método que está sobrepondo outro, melhorando a legibilidade do código e possibilitando que o compilador consiga prever alguns possíveis erros de sua implementação.

Mesmo fazendo a sobreposição, ainda é possível chamar o método da superclasse. Isso é possível através do método super. No exemplo do saque com taxa de 1% para conta corrente, no método que sobrepões o método original basta colocar o código que considera a taxa dos 5 reais e depois chamar o método super, ex: super.saque(300.0), para chamar o método de saque da superclasse, evitando assim o trabalho de reescrever o código.

Outro exemplo de utilização do super é no construtor. Para chamar o construtor da superclasse em uma subclasse, basta chamar do construtor da subclasse o método super.

Final

Aplicada a classe, determina que está não pode ser herdade por mais nenhuma classe. Aplicado em um método, impede que ele possa ser sobreposto. Essas práticas servem para engessar um pouco o código, diminuído assim a possibilidade de que outros programadores possam criar implementações incorretas a partir das classes e dos métodos com o Final.

Polimorfismo

Basicamente o polimorfismo permite aquilo que já foi explicado em upcasting. A sua implementação é simples, mas saber quando utilizar pode ser um problema. Um exemplo de utilização é quando se precisa trabalhar várias instancias de conta corrente e de conta poupança. Neste caso, para evitar criar duas listas, uma para cada tipo de conta, basta criar uma lista do tipo conta, e ir instanciando-a com contas corrente e contas poupança.

Classes Abstratas

São classes que basicamente não podem ser instanciadas. No exemplo das contas, caso exista somente a conta bancária e a conta poupança, sendo o objetivo da existência da classe conta apenas o de servir as outras duas classes, é interessante então transformar está em uma classe abstrata, para que não possa ser instanciada.

Métodos Abstratos

São métodos que não possuem implementação. Uma classe que possui um método abstrato também deve ser uma classe abstrata. São utilizados quando existem implementações especificas de acordo com a subclasse, não podendo assim ser implementado na superclasse. Serve principalmente como uma forma de promessa que esse método será implementado nas subclasses