Prévia do material em texto
ORIENTAÇÃO A OBJETOS BÁSICA
Os três pilares da programação orientada a objetos são:
· Encapsulamento,
· Herança e
· Polimorfismo.
Mas antes, veremos alguns conceitos importantes.
Na POO utilizamos classes e objetos:
· Classe: Uma classe representa objetos do mundo real. Em outras palavras, uma classe descreve um grupo de objetos.
· Cada objeto tem propriedades (atributos) e comportamentos.
Exemplo:
Uma conta de um banco:
· Banco é o projeto
· Conta é uma classe
· Conta n° 10 da Maria, conta n°11 do João, são objetos
Para usar a conta de um banco, precisamos criar instâncias da classe conta. Uma instância é a ação de criar um objeto.
Exemplo de classe:
Mas como usar essa classe?
Vamos criar o Programa.Java:
A classe conta, além de atributos, pode ter também os métodos (aquilo que o objeto pode fazer, ou seja, o que cada conta faz).
· A variável minhaConta se refere a um objeto.
· NÃO é correto dizer que minhaConta é um objeto.
· A minhaConta é uma variável de referência.
· Basta lembrar que, em Java, uma variável NUNCA é um objeto.
· Todo objeto é acessado por uma variável de referência.
MÉTODO: É a maneira de fazer uma operação com um objeto.
Exemplo de métodos na classe Conta:
A palavra-chave void significa que o método sacar não retornará nenhuma informação a quem chamou o método.
A variável double quantidade é chamada de argumento ou parâmetro do método, ela irá ‘morrer’ no fim do método, porque esse é o seu escopo.
A palavra-chave this indica que vamos acessar o atributo saldo. A palavra this indica que saldo é um atributo, e não uma simples variável.
Exemplo usando os métodos da classe conta:
MÉTODOS COM RETORNO
Podemos mudar o método sacar da classe conta, para retornar falso se não tiver saldo:
E agora, o Programa.java alterado:
TESTA DUAS CONTAS
Podemos manter na memória uma ou mais de uma conta:
ALOCANDO MEMÓRIA
Cada objeto é armazenado em um local diferente da memória, por isso, no exemplo abaixo, o teste do IF será FALSE.
Ainda que os atributos estejam recebendo valores iguais, os objetos estão alocados em espaços diferentes na memória:
Para fazer um objeto ficar alocado no mesmo espaço que outro objeto, deveríamos fazer:
Quando damos new em um objeto, ele inicializa o objeto com seus valores default:
· 0 para números,
· false para boolean e
· null para referências.
CONTROLANDO O ACESSO
IMPORTANTE: Geralmente, em Java, os atributos são privados, e os métodos são públicos.
· Atributos -> private
· Métodos -> public
Isso porque se precisarmos alterar um método, o método sacar por exemplo, teremos que mexer só na classe conta, por isso os métodos ficam públicos.
É aqui que entra o conceito de modificadores de acesso.
Modificadores de acesso:
Os modificadores de acesso são padrões de visibilidade de acesso a classes e membros de uma classe (atributos e métodos).
Em Java, temos dois níveis de modificadores de acesso:
Nível superior:
· Aplicado às classes – public e default
Nível de membro:
· Aplicado à métodos e atributos – private, public, protected, default
Default: permite acesso para classes e membros do mesmo pacote.
Public: Para qualquer classe em qualquer pacote.
Private: Torna um membro acessível apenas para a classe que o contém.
Protected:
· Um membro é acessível para classes do mesmo pacote e para classes que estendem a classe através de herança.
· Os membros herdados NÃO são acessíveis a outras classes fora do pacote em que foram declarados.
Exemplo:
ENCAPSULAMENTO
· Encapsular é ocultar os membros de uma classe, como vimos acima.
· Encapsular permite que o sistema seja suscetível a mudanças, ou seja, não precisamos mudar regras de negócio em vários lugares.
· Se precisar alterar, devemos alterar em só um lugar, já que a regra fica encapsulada.
INTERFACE da classe:
· É o conjunto de métodos PÚBLICOS de uma classe, também chamado de interface da classe.
· Essa é a única maneira pela qual podemos nos comunicar com objetos dessa classe.
· Sempre que acessamos um objeto, utilizamos sua interface.
· Em resumo, a interface permite acessar os objetos da classe.
· É sempre bom programar pensando na interface da sua classe, em como seus usuários estarão utilizando-a, e não somente em como ela funcionará.
GETTERS E SETTERS
O modificador privado faz com que ninguém consiga modificar e nem ler o atributo em questão.
Com isso, temos um problema: como fazer para mostrar o saldo de uma Conta?
Precisamos de uma maneira de fazer esse acesso. Para isso, utilizamos os métodos.
Podemos criar um método chamado getSaldo:
ATENÇÃO: É uma má prática criar uma classe e, logo em seguida, fazer getters e setters para todos seus atributos. Você só deve criar um getter ou setter se tiver a real necessidade. (Aqui temos o um dos princípios SOLID -> ISP - Princípio da Segregação da Interface — Uma classe não deve ser forçada a implementar interfaces e métodos que não irão utilizar).
Repare que, nesse exemplo, setSaldo não precisa ser criado, pois queremos que todos usem deposita() e sacar() .
CONSTRUTORES
Anteriormente, no Programa.java, usamos:
Conta minhaConta = new Conta();
O new indica que estamos instanciando a classe, e a minhaConta é a referência para o objeto do tipo conta.
Na verdade, o new, chama o construtor da classe. O construtor inicializa a classe.
O Java cria por default um construtor, automaticamente, mesmo sem o desenvolvedor criar.
O construtor da classe é um bloco declarado com o mesmo nome que a classe:
Então, quando fizermos:
A mensagem "construindo uma conta" aparecerá no console ao executar o programa. É como uma rotina de inicialização que é chamada sempre que um novo objeto é criado.
ATENÇÃO: Embora pareça, um construtor NÃO é um método.
O CONSTRUTOR DEFAULT
Até agora, as nossas classes não tinham nenhum construtor.
Então, como era possível dar new se todo new chama um construtor obrigatoriamente?
Quando você não declara nenhum construtor na sua classe, o Java cria um para você. Esse construtor é o construtor default.
ATENÇÃO:
· Construtor não é um método.
· Construtor é um bloco com o mesmo nome da classe.
· Quando a gente declara um construtor, o construtor default não é mais fornecido.
· Porque não é método? Não tem retorno e só é chamado durante a construção do objeto.
Um construtor pode receber um argumento:
Esse construtor recebe o titular da conta. Desta maneira, quando criarmos uma conta, ela já terá um determinado titular:
Tudo estava funcionando até agora. Para que utilizamos um construtor?
Os construtores, basicamente, são funções de inicialização de uma classe, as quais são invocadas no momento em que objetos desta classe são criados.
Eles permitem inicializar campos internos da classe e alocar recursos que um objeto da classe possa demandar, tais como memória, arquivos, semáforos, soquetes, etc.
Imagine o seguinte:
Toda conta precisa de um titular, como obrigar todos os objetos criados a ter um valor desse tipo? É só criar um construtor que receba essa string.
Em resumo, é isso, o construtor permite: dar possibilidades ou obrigar o usuário de uma classe a passar argumentos para o objeto durante o seu processo de criação.
ATENÇÃO: Podemos usar mais de um construtor, e no momento do new, o construtor apropriado será escolhido, de acordo com o número de parâmetros passados.
JAVA BEAN
Java Bean é uma classe que contém:
· Atributos privados,
· Getters, setters
· E um construtor vazio (padrão),
Na verdade, estamos criando um Java Bean (mas NÃO CONFUNDA com EJB, que é Enterprise Java Beans).
O EJB é um componente da plataforma Java Enterprise Edition (Java EE).
ATRIBUTOS DE CLASSE
Imagine que devemos controlar a quantidade de contas novas no sistema. Como fazer isso? Devemos criar uma variável única, compartilhada por todos os objetos dessa classe. Para isso, usamos a palavra static:
ATENÇÃO:
· Para acessar um atributo estático, NÃO usamos a palavra-chave this, e sim, o nome da classe.
HERANÇA, REESCRITA E POLIMORFISMO
No banco, precisa de funcionários, assim, poderíamos criar uma classe de funcionáriose outra gerente.
Porém, será que precisa mesmo de outra classe (gerente)?
Poderíamos ter deixado a classe Funcionario mais genérica, mantendo nela a senha de acesso e o número de funcionários gerenciados. Caso o funcionário não fosse um gerente, deixariam esses atributos vazios.
Essa é uma possibilidade, porém, com o tempo, podemos passar a ter muitos atributos opcionais, e a classe ficaria estranha. E em relação aos métodos? A classe Gerente tem o método autentica, que não faz sentido existir em um funcionário o qual não é gerente.
Herança
Existe um jeito, em Java, de relacionarmos uma classe de tal maneira que uma delas herda tudo que a outra tem. Isso é uma relação de classe mãe e classe filha.
No nosso caso, gostaríamos de fazer com que o Gerente tivesse tudo que um Funcionário tem, gostaríamos que ela fosse uma extensão de Funcionário. Fazemos isso por meio da palavra-chave extends.
Vamos mudar nossa classe gerente, que ficará:
Em resumo, Gerente é classe filha ou subclasse, Funcionário é classe mãe ou superclasse.
ATENÇÃO: Na classe funcionário, mudamos os atributos de private para protected, para ser possível as subclasses acessarem os atributos.
protected String nome;
protected String cpf;
protected double salario;
Uma classe pode ter várias filhas, mas apenas uma mãe. É a chamada herança simples do Java.
REESCRITA DE MÉTODO
Todo fim de ano, os funcionários do nosso banco recebem uma bonificação. Os funcionários comuns recebem 10% do valor do salário e os gerentes, 15%.
Podemos criar um método na classe Funcionario:
Se deixarmos a classe Gerente como está, ela herdará o método getBonificacao. Com isso, o gerente também receberia 10% de aumento, e o correto seria ele receber 15%.
A saída será 500, o correto seria ser 750.
Em JAVA podemos reescrever (sobrescrever, override) o comportamento de um método.
Então, na classe gerente, vou ter esse método:
Em resumo, no Programa.java, ao usar gerente.setSalario(5000.0); , se não existir o método setSalario em gerente, ele usará o método da classe mãe, que é funcionário.
ATENÇÃO: A ANOTAÇÃO @OVERRIDE
Há como deixar explícito no seu código que determinado método é a reescrita de um método da classe mãe dele. Podemos fazê-lo colocando @Override em cima do método. Isso é chamado anotação.
INVOCANDO O MÉTODO REESCRITO (palavra-chave super)
Depois de reescrito, não podemos mais chamar o método antigo que fora herdado da classe mãe, pois, alteramos o seu comportamento.
Mas podemos invocá-lo no caso de estarmos dentro da classe.
Exemplo: para calcular a bonificação de um Gerente, devemos fazer igual ao cálculo de um Funcionário, porém adicionando R$1000. Poderíamos fazer assim:
Porém, teríamos um problema:
O dia que o getBonificacao do Funcionario mudar, seria preciso mudar o método do Gerente também.
Para evitar isso, o getBonificacao do Gerente pode chamar o do Funcionário utilizando a palavra-chave super.
Essa invocação procurará o método com o nome getBonificacao de uma superclasse de Gerente.
No caso, ele logo encontrará esse método em Funcionario. Essa é uma prática comum, pois, em muitos casos, o método reescrito geralmente faz algo a mais que o método da classe mãe.
SUPER = invoca o método da classe mãe dentro da classe filha
POLIMORFISMO
Na herança, vimos que todo Gerente é um Funcionario.
Podemos fazer o seguinte código dentro de Programa.java:
Polimorfismo é a capacidade de um objeto poder ser referenciado de várias formas.
ATENÇÃO: polimorfismo não quer dizer que o objeto fica se transformando, muito pelo contrário, um objeto nasce de um tipo e morre daquele tipo, o que pode mudar é a maneira como nos referimos a ele.
No dia em que criarmos uma classe Secretaria, por exemplo, que é filha de Funcionario, precisaremos mudar a classe de ControleDeBonificacoes ? Não. Basta a classe Secretaria reescrever os métodos que lhe parecerem necessários.
É exatamente esse o poder do polimorfismo juntamente com a reescrita de método: diminuir o acoplamento entre as classes para evitar que novos códigos resultem em modificações em inúmeros lugares.
HERANÇA VERSUS ACOPLAMENTO
Note que o uso de herança aumenta o acoplamento entre as classes, isto é, o quanto uma classe depende de outra.
A relação entre as classes mãe e filha é muito forte e isso acaba fazendo com que o programador das classes filhas, tenha que conhecer a implementação da classe mãe, e vice-versa – fica difícil fazer uma mudança pontual no sistema.
Por exemplo, para mudar algo na classe Funcionario, sem mudar todos os funcionários (gerentes, etc), seria preciso passar por cada uma das filhas de Funcionario, verificando se ela se comporta como deveria, ou se deveríamos sobrescrever o tal método modificado.
Esse é um problema da herança, e NÃO do polimorfismo, que resolveremos mais tarde com a ajuda de Interfaces.
CLASSES ABSTRATAS
PÁGINA 136(do livro)
O que é classe abstrata: é uma classe que permite criar métodos genéricos que se encaixem em diversos objetos. Por exemplo:
A palavra-chave da classe indica que ela não pode ser instanciada diretamente.
Exemplo:
public abstract class Funcionario {
protected double salario;
public double getBonificacao() {
return this.salario * 1.2;
}
// outros atributos e métodos comuns a todos Funcionarios
}
Se em outra classe, tentarmos usar:
Funcionario f = new Funcionario(); // não compila!!!
Vai ocorrer erro.
Uma classe abstrata pode ser referenciada, mas NÃO instanciada.
Classe abstrata = não pode ser chamada por NEW
Classe abstrata = não pode ser instanciada
Considere o ControleDeBonificacao:
Nosso método registra recebe qualquer referência do tipo Funcionario (podem ser objetos do tipo Funcionario e quaisquer de seus subtipos: Gerente, Diretor e consequentemente, alguma nova subclasse que venha a ser escrita sem prévio conhecimento do autor da ControleDeBonificacao).
Assim, estamos utilizando a classe Funcionario para o polimorfismo.
RESUMO: As classes abstratas são as que não permitem realizar qualquer tipo de instância.
São classes feitas para serem modelos para suas classes derivadas.
As classes derivadas deverão sobrescrever os métodos para realizar a implementação dos mesmos.
As classes derivadas das classes abstratas são conhecidas como classes concretas.
Classes concretas: são classes derivadas (filhas) de uma classe abstrata.
Como medida de segurança, as classes abstratas somente podem ser estendidas.
MÉTODOS ABSTRATOS
· Estão presentes somente em classes abstratas.
· Não possuem implementação.
· Os métodos abstratos devem ser definidos nas classes filhas.
Exemplo:
Public abstract class pessoa
Desta forma, podemos sobrescrever o método Gravar nas classes que serão derivadas da classe Pessoa:
Agora, a classe funcionario:
Classes abstratas são classes que servem como modelo para suas subclasses.
Métodos abstratos são métodos genéricos a serem implementados nas classes filhas.
INTERFACES
· Interface diminui o acoplamento entre classes.
· Serve para obrigar um grupo de classes a ter métodos ou propriedades em comum. Entretanto, os métodos podem ser implementados de forma diferente em cada classe.
· Dentro das interfaces, existem somente assinaturas de métodos e assinaturas de propriedades.
· Java trabalha com herança simples, ou seja, uma classe só pode ter uma classe mãe. Já na interface, uma classe pode implementar várias interfaces.
Exemplo:
public interface Veiculo {
public String getNome();
public String getId();
}
public interface Motor {
public String getModelo();
public String getFabricante();
}
public class Carro implements Veiculo,Motor{
@Override
public String getId() {
}
@Override
public String getNome() {
}
@Override
public String getFabricante() {
}
@Override
public String getModelo() {
}
}
}
ATENÇÃO: Interface nada mais é que uma espécie de contrato de regras que uma classe deve seguir em um determinado contexto. Como em Java não existe herançamúltipla, a interface passa a ser uma alternativa.
RESUMO:
interface Veiculo{
void cor();
void numPortas(int z);
void dataFabricacao();
}
Qualquer veiculo que você produzir vai ter essas características, não importa se é um ônibus, um caminhão, etc… ele vai ter uma cor, o numero de portas e a data de fabricação.
EXCEÇÕES EM JAVA
ARRAYS
Curso Java bom e rápido:
https://www.youtube.com/watch?v=yqyzN-wAAlo&list=PLesCEcYj003Rfzs39Y4Bs_chpkE276-gD&index=25
Questões sobre JAVA:
https://blog.grancursosonline.com.br/java-operadores-de-incremento-e-decremento/
image3.png
image15.png
image10.png
image1.png
image22.png
image18.png
image20.png
image21.png
image19.png
image27.png
image23.png
image25.png
image24.png
image26.png
image30.png
image28.png
image29.png
image2.png
image17.png
image13.png
image6.png
image14.png
image16.png
image5.png
image8.png
image11.png
image7.png
image33.jpg
image31.jpg
image32.jpg
image4.png
image9.png
image12.png