You are on page 1of 47

Módulo VI

Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

Elementos Avançados da Linguagem

Assuntos
Especialização
Construtores
1
Java Beans
2

Créditos
• Autor: Alessandro Cerqueira
• Revisão: Professores da Escola de Informática
da Unigranrio.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007
3

Especialização
• Utilizamos palavra reservada extends para indicar
que uma classe é especialização de outra.
• Em Java não há herança múltipla; ou seja, uma
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

classe só pode ser especialização direta de uma


única classe.
• Toda classe em Java é especialização direta ou
indireta da classe java.lang.Object.
– Se não indicarmos que uma classe é uma
especialização, o compilador irá torná-la
automaticamente uma especialização da classe
Object.
4
Exemplo de Especialização
Classe Pessoa
package dominio;
dominio;

public class Pessoa //extends


//extends Object (é acrescentado pelo compilador)
{
private String cpf;
cpf;
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

private String nome;


nome;
public Pessoa(
Pessoa(String cpf,
cpf, String nome)
nome)
{
// super(); (é
(é acrescentado pelo compilador)
this.
this.cpf = cpf;
cpf;
this.
this.nome = nome;
nome;
}

public String getCpf()


getCpf()
{
return this.
this.cpf;
cpf;
}

public String getNome()


getNome()
{
return this.
this.nome;
nome;
}
}
5
Exemplo de Especialização
Classe Aluno
package dominio;
dominio;

public class Aluno extends Pessoa


{
private String matr;
matr;
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public Aluno(
Aluno(String cpf,
cpf, String nome, String matr)matr)
{
super(
super(cpf,
cpf, nome);
nome); // chamada ao construtor de Pessoa
this.
this.matr = matr;
matr;
}
Pessoa
public String getMatr()
getMatr() cpf
{ nome
return this.
this.matr;
matr; Pessoa(String, String)
} getCpf()
getCpf()
} getNome()
getNome()

Aluno
matr
Aluno(String, String, String)
getMatr()
getMatr()
6

Construtores
• Sabemos que o método construtor é um método que promoverá a
inicializaç
inicialização de um objeto assim que for criado.
• Para ser um construtor, o nome do mé
método deverá
deverá ser exatamente igual
ao da classe e não deve apresentar indicaç
indicação de tipo de retorno.
public class A { public class A { public class A {
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public A() public a() //erro public void A()


{ { {
} } }
} } }

Este é um construtor Este é um construtor invá


inválido Este é um construtor invá
inválido
válido! pois o nome não exatamente pois há
há a indicaç
indicação de tipo de
igual ao nome da classe. Neste retorno (void
(void).
). Mas, neste
caso o compilador dará
dará erro! caso o compilador não dará
dará
erro pois ele permitirá
permitirá a
existência do mémétodo A,
poré
porém este não é um
construtor!
7

Construtores
• Estratégia de Programação: Toda vez que
formos codificar uma classe devemos escrever
um ou mais construtores.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– A estraté
estratégia a ser adotada é verificar para cada atributo
da classe quais devem ser inicializados no momento de
sua instanciaç
instanciação.
– Todos os atributos que precisarem ser inicializados (com
padrões diferentes do proposto pela inicializaç
inicialização default)
deverão ser manipulados no construtor.
construtor.
– Na maioria das vezes, os valores que utilizaremos para a
inicializaç
inicialização precisam ser recebidos atravé
através de
parâmetros no construtor.
construtor.
8

Construtores
• Regra: Quando estabelecermos uma especialização,
todos construtores das subclasses sempre deverão
chamar um construtor de sua superclasse na primeira
linha de código.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– A chamada a um construtor de uma superclasse se dá



atravé
através da instruç
instrução super(...);
super(...);

• Se não especificarmos no código do construtor a


chamada do construtor da superclasse, o compilador
colocará automaticamente a chamada super();
– Se a superclasse não tiver um construtor com a assinatura
vazia, o compilador acusará
acusará erro.
9

Super
• Se um mé
método for redefinido em uma subclasse, mas
desejarmos chamar na subclasse a implementaç
implementação presente em
sua superclasse,
superclasse, utilizamos a instruç
instrução:
super.
super.<nome do mé método>(...)
todo>(...)
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

• Exemplo:
– Considere que adicionamos na classe Pessoa o mé
método toString
com a seguinte implementaç
implementação:
public String toString()
toString()
{
return this.
this.nome;
}

– Veja as consideraç
considerações abaixo:
this.
this.toString();
toString(); // Chama a implementaç
implementação de Pessoa
super.
super.toString();
toString(); // Chama a implementaç
implementação de Object
10

Construtores
• Se não colocarmos pelo menos um construtor na
classe, o compilador colocará um construtor
default.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– A assinatura do construtor default é vazia.


– O construtor default apresenta um código que só terá a
chamada “super();”.
– OBS: Se colocarmos algum construtor na classe, o
compilador não irá colocar o construtor default.
• Regra Semântica: Se um método for chamado em
um construtor, este deverá ser declarado como
final.
11

Construtores - Exemplo
Código Original Código Processado pelo Compilador
public class A public class A extends Object {
{ public A() {
} super();
super();
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

}
}
public class B extends A { public class B extends A {
public B(int x) { public B(int x) {
super();
super();
}
}
}
}
public class C extends B public class C extends B {
{ public C() {
} super();
super(); // Erro!!!
}
OBS: Todo texto que não foi }
escrito em verde corresponde
a coisas que foram acrescentadas // Teremos um erro neste caso pois a classe
pelo compilador. // B não tem um construtor com assinatura
// vazia
12
Construtores - Exemplo
• Considere a classe Disciplina (có
(código, nome e numCré
numCréditos).
ditos).
• Não faz sentido termos um objeto desta classe sem a determinaç
determinação
imediata de seu có
código, nome e numCré
numCréditos.
ditos. Assim estes deverão ser
manipulados pelo construtor e os valores destes deverão ser
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

informados atravé
através do envio de parâmetros.

package dominio;
dominio;
public class Disciplina
{
private String código;
digo;
private String nome;
nome;
private int numCré
numCréditos;
ditos;

public Disciplina(
Disciplina(String código,
digo, String nome, int numCré
numCréditos)
ditos)
{
this.
this.setCó
setCódigo(c
digo(có
ódigo);
this.
. setNome(nome);
this setNome (nome);
this.
this.setNumCré
setNumCréditos(
ditos(numCré
numCréditos);
ditos);
}

public final void setCó


setCódigo(String
digo(String có
código)
{
this.
this.código = có
código;
}
...
13

Construtores - Exemplo
public final String getCódigo()
{
return this.
this.código;
}
public final void setNome(String
setNome(String nome)
{
this.
this.nome = nome;
}
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public final String getNome()


getNome()
{
return this.
this.nome;
}
public final void setNumCré
setNumCréditos(int
ditos(int numCré
numCréditos)
ditos)
{
if(
if(numCré
numCréditos > 0)
this.
this.numCré
numCréditos = numCré
numCréditos;
ditos;
else
this.
this.numCré
numCréditos = 4;
}
public final int getNumCré
getNumCréditos()
ditos()
{
return this.
this.numCré
numCréditos;
ditos;
}
}

OBS: Repare que para instanciar um objeto Disciplina é necessá


necessário repassar para o new os parâmetros
código, nome e numCré
numCréditos.
ditos.

new Disciplina(“
Disciplina(“EIN226”
EIN226”, “Sistemas Distribuí
Distribuídos I”
I”, 4);
14

Construtores
• Quando houver sobrecarga de construtores e desejarmos evitar
que dois ou mais construtores tenham que repetir um trecho de
código, podemos utilizar a instruç
instrução this(
this( ... ) para chamar um
construtor a partir de outro.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

• Exemplo:
public Disciplina(
Disciplina(String código,
digo, String nome, int numCré
numCréditos)
ditos)
{
this.
this.setCó
setCódigo(c
digo(có
ódigo);
this.
this.setNome(nome);
setNome(nome);
this.
this.setNumCré
setNumCréditos(
ditos(numCré
numCréditos);
ditos);
}

public Disciplina(
Disciplina(String código,
digo, String nome)
nome)
{
this(c
this(có
ódigo, nome, 4); // Se não passarmos o númCré
mCréditos,
ditos,
// inicializaremos com o 4.
}
15

Método finalize()
• Método presente na classe Object e que pode
ser redefinido nas classes.
• Teoricamente, este método é chamado
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

sempre que um objeto for finalizado (recolhido


pelo Garbage Collection)
• Não contar com a execução deste método!
16

Classe Abstrata
• Para indicarmos que uma classe é abstrata, utilizamos
o modificador abstract.
– A determinaç
determinação se uma classe é ou não abstrata depende
do domí
domínio.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

package dominio;
dominio;

abstract public class Pessoa


{
private String cpf;
cpf;
private String nome;
nome;
public Pessoa(
Pessoa(String cpf,
cpf, String nome)
nome)
{
this.
this.cpf = cpf;
cpf;
this.
this.nome = nome;
nome;
}
public String getCpf()
getCpf()
{
return this.
this.cpf;
cpf;
}
public String getNome()
getNome()
{
return this.
this.nome;
nome;
}
}
17

Método Abstrato
• Método que colocamos na interface da classe mas
que não apresenta implementação
– Provavelmente não conseguimos colocar a codificaç
codificação pois não conseguimos
definir um có
código que valha para a classe e para as suas especializaç
especializações.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

• Exemplo:
package dominio;
dominio;

abstract public class Veiculo


{
private String combustí
combustível; ...
abstract public void parar();
parar();
abstract public void acelerar();
acelerar();
}

• Se uma classe apresenta um ou mais mémétodos abstratos, ela


deve ser declarada explicitamente como abstrata.
abstrata.
• As especializaç
especializações deverão implementar o mé
método abstrato.
abstrato.
Senão o compilador dará
dará erro (a não ser que a especializaç
especialização
també
também seja declarada como abstrata).
18

Método Abstrato
• Figura com esquema ônibus, trem, bicicleta,
carro.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007
19

Classe java.lang.Class
• Um objeto da classe Class descreve os metadados de
uma classe
– Metadados:
Metadados: dados que descrevem como os dados estão
estruturados.
estruturados.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– Podemos saber a partir de um objeto da classe Class quais


são os atributos (getFields ())) e os mé
(getFields() métodos
(getMethods()
getMethods())) de uma classe.

• Para recuperar o objeto Class vinculado a um objeto,


mandamos a mensagem getClass() (Definido na
classe Object)
• Uma outra forma de obter o objeto Class de uma
classe podemos escrever:
<nome da classe>.class
Introspecção / refletion
20

Bloco static
• O bloco static é executado sempre que uma classe for
carregada pelo Class Loader.
• Só poderá manipular com atributos e métodos estáticos:
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

package dominio;
dominio;

public class Aluno


{
private static int numTotalAlunos;
numTotalAlunos;
private static Aluno[] listaAlunos;
listaAlunos;
...
static
{
Aluno.
Aluno.numTotalAlunos = 0;
Aluno.
Aluno.listaAlunos = new Aluno[100];
Aluno[100];
}

public Aluno()
{
Aluno.
Aluno.listaAlunos[
listaAlunos[Aluno.
Aluno.numTotalAlunos++]
numTotalAlunos++] = this;
this;
...
}
...
}
21

Late Binding
• Para termos polimorfismo, é necessário que a
linguagem ofereça Late Binding.
– Verificaç
Verificação realizada em tempo de execuç
execução para se
descobrir o mé
método a ser executado.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

• Ex: Sabendo que a classe Object tem o mé


método toString()
toString() e
supondo que a classe Pessoa tenha feito uma redefiniç
redefinição do
método, considere o trecho abaixo:
Object ptr = new Pessoa();
Pessoa();
ptr.
ptr.toString();
toString();
– Qual Implementaç
Implementação do mémétodo toString()
toString() será
será executada?
A de Object ou a de Pessoa?
Pessoa?
• A de Pessoa!!! A resoluç
resolução se dá
dá em tempo de execuç
execução.
ão.
– Se a verificaç
verificação fosse em tempo de compilaç
compilação, seria Early
Binding (como ocorre em C).
22

Colisões
• Se com as várias cláusulas import tivermos duas ou
mais classes com o mesmo nome, é necessário
colocar a sua descrição (com pacote) completa.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

• Ex:
import java.
java.util.Date
util.Date;
; // Date do pacote java.
java.util
import java.sql.Date
java.sql.Date;
; // Date do pacote java.sql
java.sql
...
Date umaData;
umaData; // Erro! Qual Date queremos?
java.sql.Date
java.sql.Date novaData;
novaData; // Ok!
Ok! Escrevemos de forma
// completa pois há
há colisão
// de nomes de classe no import
23
Atribuições na
Declaração de Atributos
• Ao declararmos um atributo em uma classe, podemos
fazer a atribuição de um valor de inicialização para
ele.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– Estas atribuiç
atribuições são executadas imediatamente antes da
execuç
execução do mémétodo construtor.
private int voltagem = 110;
– A atribuiç
atribuição pode utilizar o new ou métodos está
estáticos.
ticos.
private Button btSair = new Button(
Button(“Sair”
Sair”);
private JanelaPrincipal janelaPai =
JanelaPrincipal.
JanelaPrincipal.getSingleton();
getSingleton();
– É útil quando tivermos vá
vários construtores para evitar de
reescrevermos a mesma inicializaç
inicialização nestes mé
métodos
24
Atribuições na
Declaração de Atributos
public class CelularPrePago
{
private String numTel;
numTel;
private int numMinutosDisponí
numMinutosDisponíveis = 5; //atributo com inicializaç
inicialização!
ão!
private double precoMinuto = 1.0; //atributo com inicializaç
inicialização!
ão!
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public CelularPrePago(
CelularPrePago(String numTel)
numTel)
{
this.
this.numTel = numTel;
numTel; // Antes de executar esta linha teremos:
// this.
this.numMinutosDisponí
numMinutosDisponíveis = 5 e
// this.
this.precoMinuto = 1.0;
}
public CelularPrePago(
CelularPrePago(String numTel,
numTel, double precoMinuto)
precoMinuto)
{
this(
this(numTel);
numTel); // Antes de executar esta linha també
também teremos:
// this.
this.numMinutosDisponí
numMinutosDisponíveis = 5 e
// this.
this.precoMinuto = 1.0;
this.
this.precoMinuto = precoMinuto;
precoMinuto;
}
...
}
25

Documentação Javadoc
• Para consultar a documentação das Java Platform Core Classes, temos
que descompactar o arquivo jdk-
jdk-1_5_0-
1_5_0-doc.zip e abrir a pá
página
index.html.
index.html. Lá
Lá, acesse o link “API & Language”
Language”.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007
26

Documentação Javadoc
• Este link faz com que você permaneç
permaneça na pápágina index.html,
index.html, poré
porém
irá
irá posicioná
posicioná-lo na âncora “#api”
api”. Clique no link “Java 2 Platform API
Specification”
Specification”.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007
27

Documentação Javadoc
• Na nova pá
página, temos um frame com a visão dos pacotes e a visão
de todas as classes.
classes. Acesse o pacote java.
java.lang.
lang.

Relaç
Relação de
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

Pacotes

Relaç
Relação de
Classes
28

Padrão Java Beans


• Conjunto de convenç
convenções para a codificaç
codificação de uma classe.
• Construtor
– Um JavaBean deve implementar pelo menos um construtor sem argumentos,
argumentos,
como a seguir:
public Pessoa ()
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

{
// có
código opcional de inicializaç
inicialização
}
• Propriedades
– Propriedades são definidas por atributos e métodos get/
get/set.
set. Na maioria dos
casos, declara-
declara-se os atributos como private e os mé
métodos get e set como
public;
public; por exemplo:
private String nome;
public String getNome()
getNome()
{
return this.nome;
this.nome;
}
public void setNome(String
setNome(String nome)
{
this.nome
this.nome = nome;
}
29

Padrão Java Beans


– Em casos especiais, como na criação de frameworks, pode-se declarar os
atributos como protected para que fiquem acessí
acessíveis diretamente em
subclasses.

• Propriedades Booleanas
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

Para propriedades do tipo boolean,


boolean, segue-
segue-se a convenç
convenção de substituir
o prefixo "get"
get" por "is":
"is":
private boolean inscrito;
public boolean isInscrito()
isInscrito()
{
return this.inscrito;
this.inscrito;
}
30

Visibilidade
• Para cada propriedade da classe (atributo ou método)
associamos um tipo de visibilidade. Os modificadores de
visibilidade indicam o nível de acesso ao método ou
atributo.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

– Private:
Private: a propriedade só
só pode ser utilizada dentro do escopo da
classe onde foi declarada.
– Sem modificador:
modificador: a propriedade sósó pode ser utilizada nas
classes do mesmo pacote (visibilidade package)
package).
– Protected:
Protected: a propriedade só
só pode ser utilizada nas classes do
mesmo pacote e em suas subclasses
– Public:
Public: a propriedade pode ser utilizada em qualquer classe.

• Para que possamos implementar o encapsulamento


conforme é proposto pelo modelo OO, os atributos devem
ser declarados como private ou protected e seus
métodos devem ser declarados como public.
31

Visibilidade
• Na declaração da classe podemos associar um
aspecto de visibilidade que pode ser public ou
“package” (não podemos utilizar protected nem
private, a não ser que sejam classes internas).
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public indica que a classe pode ser conhecida por


qualquer outra classe; já a visibilidade “package”
indica que a classe só é conhecida pelas classes do
mesmo pacote.
• Exemplo:
public class ClasseVisibilidadePublica class ClasseVisibilidadePackage
{ {
... ...
} }
32

Visibilidade
• Como os atributos devem ser privados, é
necessária a implementação de métodos que
permitam o acesso de leitura e escrita a estes
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

métodos.
– No padrão JavaBeans são implementados os métodos
get e set.

• Estes métodos são exemplos de Métodos


Implícitos, uma vez que não devem aparecer na
especificação de requisitos da classe. Os
construtores também são exemplos de métodos
implícitos.
33

Exemplo de Visibilidade
pacoteUm
A
private int x
protected int y
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

(package)
package) int z
public A() C
public int getX()
getX()
public void setX(int)
setX(int) public B()

B
public B()

pacoteDois

D
public D()
34

Exemplo de Visibilidade
package pacoteUm;
pacoteUm;
public class A
{
// A visibilidade de x é private,
private, o que indica que o atributo x
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

// só
só pode ser manipulado no có
código dentro do escopo da classe A.
private int x;
// A visibilidade de y é protected,
protected, o que indica que o atributo y
// pode ser manipulado no có
código dentro do escopo da classe A,
// dentro do escopo de suas especializaç
especializações e dentro do escopo das
// classes de seu pacote (pacoteUm
(pacoteUm)
)
protected int y;
// A visibilidade de z é package,
package, o que indica que o atributo z
// pode ser manipulado no có
código dentro do escopo da classe A e
// dentro do escopo das classes de seu pacote (pacoteUm
(pacoteUm)
)
int z;
(continua...)
35

Exemplo de Visibilidade
(continuação da classe A)
public A()
{
this.
this.x = 10;
this.
this.y = 20;
this.
this.z = 30;
}
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

// A visibilidade de getX é public,


public, o que indica que o mé
método getX
// pode ser disparado no escopo de toda e qualquer classe
public int getX()
getX()
{
return this.
this.x;
}
// A visibilidade de setX é public,
public, o que indica que o mé
método setX
// pode ser disparado no escopo de toda e qualquer classe
public void setX(int
setX(int x)
{
this.
this.x = x;
}
}
36

Exemplo de Visibilidade
package pacoteUm;
public class B extends A
{
public B()
{
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

// Não posso fazer pois a visibilidade de x foi declarada


// private na classe A. Assim, o atributo x só
só pode ser
// manipulado no có
código no escopo da classe A
// this.x
this.x = 40;
// Posso enviar a mensagem setX pois o mé
método setX foi declarado
// na classe A como public.
public.
this.
this.setX(40);
setX(40);
// Posso manipular com o atributo y pois este foi declarado
declarado na
// classe A como protected.
protected.
this.
this.y = 10;
// Posso manipular o atributo z pois este foi declarado na classe
// A como package e a classe B pertence ao mesmo pacote de A.
this.
this.z = 30;
}
}
37

Exemplo de Visibilidade
package pacoteUm;
public class C
{
public A criaObjetoA()
criaObjetoA()
{
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

A ptrA = new A();


// Não posso fazer pois o atributo x na classe A foi declarado
declarado
// como private
// ptrA.x
ptrA.x = 100;
// Posso fazer pois setX foi declarado na classe A como public
ptrA.
ptrA.setX(100);
setX(100);
// Posso fazer pois o atributo y foi declarado na classe A como
// protected e a classe C pertence ao mesmo pacote que a classe A.
ptrA.
ptrA.y = 200;
// Posso fazer pois o atributo z foi declarado na classe A com a
// visibilidade package e a classe C pertence ao mesmo pacote que
// a classe A.
ptrA.
ptrA.z = 300;
return ptrA;
ptrA;
}
}
38

Exemplo de Visibilidade
package pacoteDois;
import pacoteUm.*;
pacoteUm.*;
public class D extends A
{
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public D()
{
// Não posso pois x na classe A é private
// this.x
this.x = 10;
// Posso pois y na classe A é protected.
protected. Como D é especializaç
especialização
// de A esta manipulaç
manipulação é possí
possível
this.
this.y = 20;
// Não posso pois z na classe A é package e, apesar de ser
// especializaç
especialização de A, D não pertence ao mesmo pacote que A
// this.z
this.z = 30;
}
}
39

Classes Internas
• Classe que é declarada dentro do escopo de outra classe.
• Assim, dentro do escopo de uma classe podemos ter atributos, mé
métodos
e/ou classes internas.
• Geralmente utilizamos uma classe interna quando criar uma pequena
pequena
classe que (a princí
princípio) só
só precisa ser utilizada no có
código de outra.
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

public class Pessoa {


private String nome;
private Endereç
Endereço residência;

class Endereç
Endereço {
private String rua;
private String número;
private String complemento;
...
}
...
}
A classe Endereç
Endereço foi declarada dentro do escopo da classe Pessoa.
40

Classe Interna
• Apesar da classe Endereço ter sido declarada
dentro da classe Pessoa, outras classes podem
utilizá-la. Neste caso, as declarações deverão
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

utilizar a forma “Pessoa.Endereço”


Ex:
Pessoa.Endereço endereçoNovo;
41

Classe Interna Anônima


• É quando eu instancio um objeto e juntamente faço
uma redefinição de um ou mais métodos da classe.
• Funciona como sendo “uma especialização para um
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

único objeto onde é feita a redefinição de métodos”


• A vantagem é que não é necessário ter que criar
explicitamente uma classe interna
42

Classe Interna Anônima


...
this.
this.addWindowListener(
addWindowListener(
new WindowAdapter()
WindowAdapter()
{
public void windowClosing(
windowClosing(WindowEvent evt)
evt)
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

{
System.
System.exit(0);
exit(0);
}
} ) ;
...

• O que é isto????
isto????
– Indico quem é o WindowListener da janela
– Instancio um objeto de WindowAdapter.
WindowAdapter. Apesar de ser uma classe abstrata, isto é
permitido pois juntamente com a instanciaç
instanciação, estamos redefinindo o mé
método
windowClosing.
windowClosing.
– Na prá
prática, o compilador cria com esta declaraç
declaração uma classe interna “ sem nome”
nome”
(o nome é dado automaticamente). A geraç
geração do bytecode é semelhante ao caso
da classe Interna com nome.
43

Implementação de Listas Encadeadas


package util;
util;

public class ListaEncadeada


{
/**
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

* Ponteiro para o primeiro Nó


Nó da lista encadeada
*/
private No primeiro;
/**
* Ponteiro para o último Nó
Nó da lista encadeada
*/
private No ultimo;
/**
* Nú
Número de elementos presentes na lista encadeada
*/
private int tamanho = 0;
(continua...)
44

Implementação de Listas Encadeadas


/**
* Classe interna a ListaEncadeada.
ListaEncadeada. Os Objetos
* desta classe representam os nó
nós presentes
* dentro de uma lista encadeada.
*/
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

private class No
{
/** Ponteiro para o Nó
Nó anterior */
public No anterior = null;
null;
/** Ponteiro para o pró
próximo Nó
Nó */
public No proximo = null;
null;
/** Ponteiro para o elemento vinculado ao Nó
Nó */
public Object elemento = null;
null;
}
(continua...)
45

Implementação de Listas Encadeadas


/**
* Inclui um novo elemento (diferente de null)
null) na lista encadeada
* @param elemento ponteiro para o elemento a ser adicionado
* @return true se a inclusão foi feita com sucesso.
* Senão retornaremos false.
false.
*/
public boolean adicionar(Object
adicionar(Object elemento)
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

{
if(elemento == null)
if(elemento null)
return false;
false;
No novoNo = new No();
No();
novoNo.elemento = elemento;
novoNo.elemento
novoNo.anterior = this.ultimo;
novoNo.anterior this.ultimo;
if(this.ultimo != null)
if(this.ultimo null)
this.ultimo. proximo = novoNo;
this.ultimo.proximo novoNo;
else
this.primeiro = novoNo;
this.primeiro novoNo;
this.ultimo = novoNo;
this.ultimo novoNo;
this.tamanho++;
this.tamanho
return true;
true;
}
(continua...)
46

Implementa
/**
ção de Listas Encadeadas
* Remove um elemento da lista encadeada
* @param elemento ponteiro para o elemento a ser removido
* @return Se o elemento foi encontrado na lista e foi removido.
*/
public boolean remover(Object
remover(Object elemento) {
No corrente = this.primeiro;
this.primeiro;
while(corrente != null)
while(corrente null) {
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

if(corrente.elemento == elemento) {
if(corrente.elemento
if(corrente.anterior != null)
if(corrente.anterior null)
corrente.anterior.proximo
corrente.anterior.proximo = corrente.proximo
corrente.proximo;
;
else
this.primeiro = corrente.proximo
this.primeiro corrente.proximo;;
if(corrente. proximo != null)
if(corrente.proximo null)
corrente.proximo .anterior = corrente.anterior;
corrente.proximo.anterior
else
this.ultimo = corrente.anterior;
this.ultimo
this.tamanho--;
this.tamanho
return true;
true;
}
corrente = corrente.proximo
corrente.proximo;;
}
return false;
false;
} (continua...)
47

Implementação de Listas Encadeadas


/**
* Retorna o elemento da lista presente na posiç
posição especificada
* @param posicao índice da posiç
posição do elemento
* @return elemento se a posiç
posição existe. Senão retorna null.
null.
*/
public Object obter(int
obter(int posicao)
posicao)
Elementos da Linguagem Java - Alessandro Cerqueira - 20/8/2007

{
if(posicao >= tamanho)
if(
return null;
null;
No corrente = this.primeiro;
this.primeiro;
for(int i = 0; i < posicao;
for( posicao; i++)
corrente = corrente.proximo
corrente.proximo; ;
return corrente.elemento;
}
/**
* Informa o nú
número de elementos presentes na lista encadeada
* @return número de elementos
*/
public int tamanho()
{
return this.tamanho;
this.tamanho;
}
}