Curso Java Básico - Aula 03

436 visualizações

Publicada em

Curso Java Básico - Aula 03

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
436
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
19
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Curso Java Básico - Aula 03

  1. 1. Java Básico Aula 03 Natanael Fonseca - Arquiteto de Software
  2. 2. Ementa • Encapsulamento e Construtores; • Modificador Static e Enumerations; • Herança, sobrescrita, covariância e polimorfismo;
  3. 3. Encapsulamento - Em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A ideia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. - Uma grande vantagem do encapsulamento é que toda parte encapsulada pode ser modificada sem que os usuários da classe em questão sejam afetados. - Em Java é possível alcançar o encapsulamento simplesmente protegendo as variáveis com o modificador private e fornecendo métodos de acesso para alteração e consulta dessas informações. Encapsulamento e Construtores 3
  4. 4. Getters e Setters São métodos que permitem a leitura de atributos da classe. É uma boa prática criá-los para cada atributo que será encapsulado. Métodos get <modificadores> <tipoAtributo> get + <nomeAtributo> () String getNome() long getRG() Métodos set <modificadores> void set+<nomeAtributo> (<tipoAtributo> nomeParametro) void setNome(String nome) void setRG(long rg) Métodos is boolean is+<nomeAtributo>() boolean isConnected() boolean isOk() Encapsulamento e Construtores 4
  5. 5. Encapsulamento Vejamos o exemplo abaixo: Encapsulamento e Construtores 5 1) Classe Pessoa public class Pessoa{ private String nome; public String getNome(){ return this.nome; } public void setNome(String nome){ this.nome = nome; } } 2) Classe Principal public class Principal{ public static void main(String[] args){ Pessoa p = new Pessoa(); p.setNome(“Joaozinho”); System.out.println(“Nome :” + p.getNome() ); } }
  6. 6. this Conceito que gera muita confusão, mas de um modo geral essa é a palavra reservada que pode ser utilizada para referenciar o objeto corrente. Dica: O uso do this não é obrigatório, mas ajuda a evitar ambiguidade. Encapsulamento e Construtores 6 1) Classe Pessoa public Pessoa{ private String nome; //Construtor sem argumento public Pessoa(){ this.nome = “Pedro”; } } 2) Classe Principal public class Principal{ public static void main(String[] args){ Pessoa p = new Pessoa(); } }
  7. 7. Sobrecarga de método Criar vários nomes para métodos que fazem basicamente a mesma coisa não parece uma abordagem interessante, a solução para este problema se chama “sobrecarga”; Sobrecarregar um método é escrever métodos com nomes iguais, mas com quantidades e tipos de parâmetros diferentes. Encapsulamento e Construtores 7 1) Classe Calculadora public class Calculadora { public int somar(int x, int y){} public int somar(int x, int y, int z){} public int somar(int[] numeros){} } 2) Classe Principal public class Principal{ public static void main(String[] args){ Calculadora calc = new Calculadora(); calc.somar( 4,4 ); } }
  8. 8. Construtor Método especial que serve para inicializar o objeto de uma classe quando o objeto for criado. Este método não possui declaração de retorno, pois como foi dito serve para configurar o objeto em questão. Encapsulamento e Construtores 8 1) Classe Pessoa public Pessoa{ private String nome; //Construtor sem argumento public Pessoa(){ this.nome = “Pedro”; } //Construtor que recebe o nome como argumento. public Pessoa(String nome){ this.nome = nome; } //....gets e sets } 2) Classe Principal public class Principal{ public static void main(String[] args){ Pessoa p = new Pessoa(); System.out.println(“Nome :” + p.getNome() ); Pessoa p2 = new Pessoa(“Kratos”); System.out.println(“Nome :” + p2.getNome() ); } }
  9. 9. Construtor Algumas regras devem seguidas quando estivermos criando construtores: • Ter obrigatoriamente o mesmo nome da classe em que são definidos; • Não possuir nenhum valor de retorno(nem mesmo void); Além disso, devemos lembrar de que: • Caso não seja fornecido nenhum construtor a própria JVM irá incluir um padrão sem argumento. • E caso seja fornecido um construtor para a classe a JVM não irá criar um construtor padrão. Encapsulamento e Construtores 9
  10. 10. Chamando construtores da própria classe Para alcançar um nível de reaproveitamento pode-se chamar um construtor já criado a partir de outro. Sintaxe: this( <zero ou mais argumentos> ); //Deve ser a primeira instrução no construtor Encapsulamento e Construtores 10 public Pessoa{ private String nome; private String telefone; private String email; public Pessoa(String nome, String telefone, String email){ this(nome, telefone); this.email = email; } public Pessoa(String nome, String telefone){ this.nome = nome; this.telefone = telefone; } }
  11. 11. Destrutor em Java ? • Em algumas linguagens é possível encontrar uma parte do código onde o programador inclui instruções de finalização, normalmente chamado de “destrutor”. • Em Java outro modelo de programação é utilizado, A JVM assume a responsabilidade de remover os objetos indesejados da memoria valendo-se do mecanismo “Garbage Collector” (Coletor de Lixo). • Para descartar um objeto, o programador Java deve, no máximo, atribuir valor nulo as variáveis reference que apontam para este objeto, ou atribuir um outro objeto a essas variáveis. • Um objeto não é necessariamente removido da memória pelo GC no instante em que perde todas as referencias e se torna “descartável”. A especificação formal da JVM permite que o GC decida o melhor momento da remoção dos objetos descartáveis da memoria. • Em Java existe o método finalize, que pode ser utilizado pelo programador para estabelecer um conjunto de instruções de finalização. Encapsulamento e Construtores 11
  12. 12. Lembre-se Apesar da linguagem fornecer os métodos System.gc e Runtime.getRumtime.gc a JVM não tem obrigação de aceitar estas sugestões. Vale a pena ler os artigos: • http://www.ibm.com/developerworks/library/j-leaks/ • http://docs.oracle.com/cd/A97688_16/generic.903/bp/java.htm • http://www.javaworld.com/article/2077581/learn-java/java-tip- 79--interact-with-garbage-collector-to-avoid-memory-leaks.html Encapsulamento e Construtores 12
  13. 13. Exercício Crie um programa que por meio de JOptionpane receba os atributos da classe empregado(nome, rg e salário), entretanto, deve-se utilizar as técnicas aprendidas até agora, tais como: construtores e encapsulamento. Encapsulamento e Construtores 13
  14. 14. Modificador Static Utilizado para indicar que uma variável ou método pertence a classe e não a instancia. Se formos entrar no conceito da orientação a objeto seria como dizer que a variável ou método pertence ao modelo e não a implementação em si. Um modo mais grosseiro de entender esse modificador é pensar que a variável ou método será compartilhada por todos os objetos, ou seja, alterar o valor de uma variável estática de um objeto irá fazer com que todos os outros objetos sofram esta alteração. Modificador Static e Enumerations 14
  15. 15. Acessando uma variável com modificador static Modificador Static e Enumerations 15 1) Classe Pessoa public Pessoa{ public static int id; } 2) Classe Principal public class Principal{ public static void main(String[] args){ Pessoa p = new Pessoa(); System.out.println(“Nome :” + p.getNome() ); Pessoa p2 = new Pessoa(“Kratos”); System.out.println(“Nome :” + p2.getNome() ); } } Vejamos o exemplo a seguir:
  16. 16. Métodos estáticos Modificador Static e Enumerations 16 1) Classe Math public Math { public static int somar(int x,inty){ return x+y; } } 2) Classe Principal public class Principal{ public static void main(String[] args){ System.out.println( Math.somar( 4,4 ) ); } } De maneira semelhante ao que ocorre para atributos, o uso do modificador static em métodos faz sua associação a classe em vez de faze-lo a instancia.
  17. 17. Bloco de Inicialização estático Para atributos estáticos é possível inicializa-los ou na declaração ou por meio de blocos estáticos. Modificador Static e Enumerations 17 1) Classe Pessoa public Pessoa{ public static int id; static { id = 40; } } • Um bloco estatico é executado somente uma vez: Imediatamente após a primeira referencia a classe, isto é, no seu carregamento. • Como o bloco de inicialização estático é executado no carregamento da classe, será executado antes do construtor da classe. • Dentro do bloco somente são acessados atributos e métodos estáticos; • Não podem lançar exceções checked; • É possível criar vários blocos de inicialização, neste caso serão executados na ordem em que aparecem.
  18. 18. Enumerations Utiliza-se a palavra reservada enum seguida do nome desejado, seguindo a convenção de nomes de classes. Sintaxe para a declaração de enumerações: <modificadores> enum nomeEnum { listaValores } Exemplo: public class Cliente{ public enum TipoCliente{ PESSOA_FISICA, PESSOA_JURIDICA }; } Modificador Static e Enumerations 18
  19. 19. Imprimindo elementos da enumeração Todas as enumerações tem um método estático values(), que retorna um array com os elementos da enumeração da mesma ordem em que foram declarados. Desta forma pode ser utilizado um laço for, ou mais facilmente o enhanced for para imprimir os elementos da enumeração. Exemplo: for( Cliente.TipoCliente tipo: Cliente.TipoCliente.values() ){ System.out.println( tipo ); } Modificador Static e Enumerations 19
  20. 20. Exercício A classe java.util.Arrays contém vários métodos para ordenação, busca, comparação e preenchimento de arrays. E muitos destes métodos são estáticos ! Escreva um programa em java que crie um array de 100 posições com números randomicos e teste os diversos métodos existentes na classe Arrays. Utilize o javadoc para saber mais detalhes sobre esta classe. Modificador Static e Enumerations 20
  21. 21. Exercício Modifique a classe empregado criada durante o curso adicionando mais um atributo chamado HUMOR, essa variável será do tipo ENUM, podendo ter dois valores: FELIZ ou TRISTE. Realize um teste condicional no método setSalario() para que caso o valor recebido como argumento seja menor que 100 altere o humor para TRISTE, caso contrário deverá ser FELIZ; Modificador Static e Enumerations 21
  22. 22. Herança Conceito da Orientação a Objetos que permite que uma classe herde características e métodos de outra classe. Em Java é utilizado a palavra extends para indicar tal relação. Em Java a classe Object é chamada de superclasse de todas as classes, por que todas as classes são derivadas dela direta ou indiretamente. Herança, Sobrescrita, Covariância e Polimorfismo 22 1) Classe Pai public SerHumano{ } 2) Classe Filha public class Pessoa extends SerHumano { }
  23. 23. Construtores x Herança • Construtores não são herdados em hipótese nenhuma ! • Cada classe deve declarar seus próprios construtores; • Toda classe deve chamar o construtor da superclasse dentro de seu próprio construtor; • A chamada ao construtor da superclasse deve ser a primeira instrução do construtor da classe; • Caso a chamada não seja feita explicitamente no código da classe, o compilador irá acrescentar uma chamada implícita ao construtor sem parâmetros da superclasse. Herança, Sobrescrita, Covariância e Polimorfismo 23
  24. 24. Sequencia completa de inicialização dos objetos • Espaço em memória é alocado para o objeto sendo construído; • Cada um dos atributos do objeto é criado e inicializado para seu valor default; • É chamado o construtor da superclasse; • Cada um dos atributos da superclasse é criado e inicializado para seu valo default; • A inicialização dos atributos via declaração e o código do bloco de inicialização da superclasse executados na ordem em que aparecem; • O código do construtor da superclasse é executado; • A inicialização dos atributos via declaração e o código do bloco de inicialização da classe são executados na ordem em que aparecem; • O código do construtor da classe; Herança, Sobrescrita, Covariância e Polimorfismo 24
  25. 25. Referencia implícita super Utilizada para acessar atributos e métodos da superclasse, desde que visíveis de acordo com os modificadores de acesso. Herança, Sobrescrita, Covariância e Polimorfismo 25 1) Classe Pai public Pessoa{ protected String nome; protected String rg; } 2) Classe Filha public class Funcionario extends Pessoa { private double salario; public void impressaoRecibo(){ System.out.print(“Eu” + super.nome + “ ” ); System.out.print(“Portador do rg -” + super.rg + “ ” ); System.out.print(“Declaro que recebi o valor de -” + this.salario ); } }
  26. 26. Sobrescrita Quando se estende uma classe e se pretende alterar o comportamento de um método herdado, é necessário reescrever o método na classe filha. sobrescrevendo o método herdado da superclasse. Herança, Sobrescrita, Covariância e Polimorfismo 26 1) Classe Pai public Pessoa{ private String nome; public void imprimir(){ System.out.println(“Aluno - ” + nome ); } } 2) Classe Filha public class Funcionario extends Pessoa { private String matricula; @override public void imprimir(){ System.out.print(“Funcionario - ” + matricula ); } }
  27. 27. Regras para Sobrescrita As seguintes regras devem ser respeitadas para sobrescrever um método de uma superclasse: • O novo método deve ter exatamente o mesmo nome daquele que quer se sobrescrever. • O método deve ter a mesma lista de parâmetros, caso contrário será uma sobrecarga e não sobrescrita; • O tipo do valor de retorno deverá ser o mesmo do método que esta se sobrescrevendo, caso contrário ocorrerá um erro de compilação. • A partir do Java 5 foi introduzido a covariância de valores de retorno. • Não se pode lançar exceções que não estejam declaradas no método, mas apenas as mesmas exceções declaradas na assinatura do método ou que sejam subclasses daquela declarada. • Um método static não pode sobrescrever um método não static e vice e versa; • Um método não deve ter o modificador de acesso mais restritivos que o método sobrescrito. Herança, Sobrescrita, Covariância e Polimorfismo 27
  28. 28. toString() Método existente na classe Object que possui a função de descrever o próprio objeto. Esta representação pode ser utilizada para imprimir o objeto no console. Por padrão ao imprimir o objeto no console será exibido uma msg no formato: <nomeDaClasse>@hashcode Exemplo: public class Pessoa{ private String nome; @override public String toString(){ return “[Nome - ” + this.nome + “ ]”; } } Herança, Sobrescrita, Covariância e Polimorfismo 28
  29. 29. Modificador final Utilizado na declaração de atributos, métodos e classes, tendo comportamentos diferentes em cada uma das situações. Na declaração de classes: - Indica que a classe não pode ser estendida por outra classe, ou seja, não poderá ser herdada. Na declaração de um método: - Indica que o método em questão não pode ser sobrescrito. Na declaração de uma variável: - Define que somente uma atribuição deverá ser feita ao atributo, podendo ser feita na declaração ou no construtor. Isto é o equivalente a criação de constantes. Herança, Sobrescrita, Covariância e Polimorfismo 29
  30. 30. Classe Abstrata O modificador abstract é usado para indicar que uma classe não está pronta para ser utilizada e não pode ser instanciada, mas apenas estendida. Sintaxe para declaração de classes abstratas abstract class NomeDaClasse{ } O modificador abstract pode ser combinado com outros modificadores, em qualquer ordem. Herança, sobrescrita, covariância e polimorfismo; 30
  31. 31. Método Abstrato Um método abstrato é utilizado quando o desenvolvedor ou projetista percebe que: • É possível implementar um método de varias maneiras interessantes; • Ainda não existem requisitos bem definidos para decidir por uma implementação de método. Sintaxe: Abstract <tipoRetorno> nomeDoMetodo(<parametrosDeMetodos>); Regras: • Sempre que se declara um método abstrato, a classe deve também ser abstrata; • todas as classes filhas deverão implementar o método abstrato ou declara-lo como abstrato. Herança, sobrescrita, covariância e polimorfismo; 31
  32. 32. Interface Define um contrato de comunicação entre classes. A interface é um protótipo de classe, com uma estrutura semelhante a de uma classe abstrata. Uma diferença importante é que uma classe abstrata pode definir métodos concretos e uma interface só pode definir métodos abstratos. <modificadores> interface nomeDaInterface{ //Definição de constantes //Definição de métodos abstratos } Exemplo: public interface Transportavel{ public String UNIDADE_PESO = “kg” public double getVolume(); public double getPeso(); } Herança, sobrescrita, covariância e polimorfismo; 32
  33. 33. Implementando uma Interface Para implementar uma interface em uma classe utiliza-se a instrução implements, sendo obrigatório implementar todos os métodos definidos pela interface, e respeitar a assinatura dos métodos. Sintaxe para implementação de interfaces <modificadores> class nomeDaClasse implements NomeDaInterface{} Dica: Uma classe abstrata pode implementar uma interface sem implementar todos os seus métodos. Herança, sobrescrita, covariância e polimorfismo; 33
  34. 34. Estendendo uma Interface Uma interface pode ser estendida por outras, fazendo com que a interface filha herde todos os métodos definidos pela super-interface, ou seja, as classes que implementam a interface filha terão que implementar todos os métodos definidos nas duas interfaces. Exemplo: public interface Inflamavel extends Transportavel{ public int getTemperaturaMaxima(); } Herança, sobrescrita, covariância e polimorfismo; 34
  35. 35. Polimorfismo O polimorfismo é um conceito de orientação a objetos que permite ver um objeto de várias formas. Polimorfismo pode ser usado em diferentes situações: na criação de objetos, nos parâmetros de método e etc. Vejamos o exemplo abaixo: //criando uma instância da classe cliente Cliente cliente = new Cliente(); //vendo a instância de cliente como pj PessoaJuridica pJuridica = cliente; //vendo cliente como pj, e a pj como pessoa Pessoa pessoa = pJuridica; Herança, sobrescrita, covariância e polimorfismo; 35
  36. 36. Covariância O retorno covariante é uma funcionalidade adicionada na plataforma Java a partir da versão 5 que permite utilizar a hierarquia das classes no retorno de métodos. A ideia é permitir que em uma sobrescrita seja retornado um objeto mais especifico e compatível com o retorno declarado na classe pai. Vejamos o exemplo abaixo: Herança, sobrescrita, covariância e polimorfismo; 36 1) Classe Pai public X{ public Object getValue(){ } } 2) Classe Filha public class Y extends X { @override public String getValue(){ } }
  37. 37. Exercício Padrões GoF ('Group of Four') • Os padrões "GoF" são organizados em 3 famílias : • Padrões de criação : relacionados à criação de objetos • Padrões estruturais : tratam das associações entre classes e objetos. • Padrões comportamentais : tratam das interações e divisões de responsabilidades entre as classes ou objetos. Com base no que foi aprendido durante a aula, tente implementar em Java os padrões FACTORY, DAO, SINGLETON e TEMPLATE METHOD. Herança, sobrescrita, covariância e polimorfismo; 37
  38. 38. Fim da Terceira Aula Obrigado !

×