Este documento discute conceitos básicos de Java como encapsulamento, construtores, modificador static, enumerações, herança, sobrescrita e polimorfismo. O documento explica como encapsular atributos e métodos, criar construtores, usar modificador static em variáveis e métodos, definir enumerações e como classes podem herdar características através da herança.
2. Ementa
• Encapsulamento e Construtores;
• Modificador Static e Enumerations;
• Herança, sobrescrita, covariância e
polimorfismo;
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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