Вы находитесь на странице: 1из 20

Java 2 Standard Edition

Como criar
classes e objetos

Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados

ƒ Este módulo explora detalhes da construção de


classes e objetos
ƒ Construtores
ƒ Implicações da herança
ƒ Palavras super e this, usadas como referências para o
objeto corrente e a super classe
ƒ Instruções super() e this() usadas para chamar
construtores durante a criação de objetos
ƒ Detalhes sobre a inicialização de objetos e possíveis
problemas

2
Criação e destruição de objetos
ƒ Para a criação de novos objetos, Java garante que cada classe
tenha um construtor
ƒ O construtor default recebe zero argumentos
ƒ Faz apenas inicialização da superclasse
ƒ Programador pode criar um construtor explicitamente e
determinar suas operações de inicialização
ƒ Inicialização pela superclasse continua garantida
ƒ Construtor default deixa de existir
ƒ Objetos são destruídos automaticamente pelo sistema,
porém, sistema não faz finalização
ƒ Método finalize(), herdado de Object, teoricamente permite ao
programador controlar a finalização de qualquer objeto
ƒ finalize() não funciona 95% das vezes - não use! Se precisar de
finalização, coloque seu código em um bloco try {...} finally {...}

3
Construtores e sobrecarga
ƒ Construtores default (sem argumentos) só existem quando
não há construtores definidos explicitamente no código
ƒ A criação de um construtor explícito substitui o construtor
fornecido implicitamente
ƒ Uma classe pode ter vários construtores (isto se chama
sobrecarga de nomes)
ƒ Distinção é feita pelo número e tipo de argumentos (ou seja,
pela assinatura do construtor)
ƒ A assinatura é a identidade do método. É pela assinatura que
ele se distingue dos outros métodos. Consiste de
ƒ Tipo de retorno
ƒ Nome
ƒ Tipo de argumentos
ƒ Quantidade de argumentos
4
Sobrecarga de métodos
ƒ Uma classe também pode ter vários métodos com o
mesmo nome (sobrecarga de nomes de métodos)
ƒ Distinção é feita pela assinatura: tipo e número de
argumentos, assim como construtores
ƒ Apesar de fazer parte da assinatura, o tipo de retorno não
pode ser usado para distinguir métodos sobrecarregados
ƒ Na chamada de um método, seus parâmetros são
passados da mesma forma que em uma atribuição
ƒ Valores são passados em tipos primitivos
ƒ Referências são passadas em objetos
ƒ Há promoção de tipos de acordo com as regras de
conversão de primitivos e objetos
ƒ Em casos onde a conversão direta não é permitida, é
preciso usar operadores de coerção (cast)
5
Distinção de métodos na sobrecarga

ƒ Métodos sobrecarregados devem ser diferentes o


suficiente para evitar ambigüidade na chamada
ƒ Qual dos métodos abaixo ...
int metodo (long x, int y) {...}
int metodo (int x, long y) {...}

ƒ ... será chamado pela instrução abaixo?


int z = metodo (5, 6);

ƒ O compilador detecta essas situações

6
this()

ƒ Em classes com múltiplos construtores, que realizam


tarefas semelhantes, this() pode ser usado para
chamar outro construtor local, identificado pela sua
assinatura (número e tipo de argumentos)

public class Livro { public class Livro {


private String titulo; private String titulo;
public Livro() { public Livro() {
titulo = "Sem titulo"; this("Sem titulo");
} }
public Livro(String titulo) { public Livro(String titulo) {
this.titulo = titulo; this.titulo = titulo;
} }
} }

7
super()

ƒ Todo construtor chama algum construtor de sua


superclasse
ƒ Por default, chama-se o construtor sem argumentos,
através do comando super() (implícito)
ƒ Pode-se chamar outro construtor, identificando-o através
dos seus argumentos (número e tipo) na instrução super()
ƒ super(), se presente, deve sempre ser a primeira instrução
do construtor (substitui o super() implícito)
ƒ Se a classe tiver um construtor explícito, com
argumentos, subclasses precisam chamá-lo
diretamente
ƒ Não existe mais construtor default na classe
8
this e super
ƒ A palavra this é usada para referenciar membros de um objeto
ƒ Não pode ser usada dentro de blocos estáticos (não existe
objeto atual 'this' em métodos estáticos)
ƒ É obrigatória quando há ambiguidade entre variáveis locais e
variáveis de instância
ƒ super é usada para referenciar os valores originais de variáveis
ou as implementações originais de métodos sobrepostos
class Numero { class OutroNumero extends Numero {
public int x = 10; public int x = 20;
} public int total() {
return this.x + super.x;
}
} 20 10

ƒ Não confunda this e super com this() e super()


ƒ Os últimos são usados apenas em construtores!
9
Inicialização de instâncias

ƒ O que acontece quando um objeto é criado usando


new NomeDaClasse() ?
ƒ 1. Inicialização default de campos de dados (0, null, false)
ƒ 2. Chamada recursiva ao construtor da superclasse (até
Object)
2.1 Inicialização default dos campos de dados da superclasse
(recursivo, subindo a hierarquia)
2.2 Inicialização explicita dos campos de dados
2.3 Execução do conteúdo do construtor (a partir de Object,
descendo a hierarquia)
ƒ 3. Inicialização explícita dos campos de dados
ƒ 4. Execução do conteúdo do construtor

10
Exemplo (1)
class Bateria {
Máquina
public Bateria() {
System.out.println("Bateria()"); ligar()
}
}

class Tela { Computador


public Tela() { Teclado
System.out.println("Tela()");
} Tela
}

class Teclado {
public Teclado() {
Notebook
System.out.println("Teclado()");
} Bateria
} codigo: 12345
ligar()
11
Exemplo (2)

class Maquina { Máquina


public Maquina() { ligar()
System.out.println("Maquina()");
this.ligar();
}
public void ligar() { Computador
System.out.println("Maquina.ligar()");
} Teclado
} Tela

class Computador extends Maquina {


public Tela tela = new Tela();
public Teclado teclado = new Teclado();
public Computador() { Notebook
System.out.println("Computador()");
Bateria
}
} codigo: 12345
ligar()
12
Exemplo (3)

class Notebook extends Computador { Máquina


int codigo = 12345; ligar()
public Bateria bateria = new Bateria();
public Notebook() {
System.out.print("Notebook(); " +
"codigo = "+codigo);
} Computador
public void ligar() {
System.out.println("Notebook.ligar();" + Teclado
" codigo = "+ codigo); Tela
}
}

public class Run {


public static void main (String[] args) {
Notebook
new Notebook();
} Bateria
} codigo: 12345
ligar()
13
Resultado de new Notebook()
1. Construtor de Maquina chamado
Maquina() 2. Método ligar() de Notebook
(e não de Maquina) chamado!
Notebook.ligar(); codigo = 0
3. PROBLEMA!!!!!
Tela() Variável codigo, de Notebook
ainda não foi inicializada
quando ligar() foi chamado!
Teclado() 4. Variáveis tela e teclado,
membros de Computador
são inicializadas
Computador() 5. Construtor de Computador chamado
6. Variável bateria, membro
Bateria() de Notebook é inicializada
7. Construtor de Notebook
Notebook(); codigo = 12345 chamado. Variável codigo
finalmente inicializada
14
N1.
N1. new
new Notebook()
Notebook() chamado
chamado

Detalhes
N2.
N2. variável
variável código
código iniciaizada:
iniciaizada: 00
N3.
N3. variável
variável bateria
bateria iniciaizada:
iniciaizada: null
null
N4. super() chamado (Computador)
N4. super() chamado (Computador)
C1.
C1. variável
variável teclado
teclado iniciaizada:
iniciaizada: null
null O1.
O1. Campos
Campos inicializados
inicializados
C2. variável tela iniclaizada: null
C2. variável tela iniclaizada: null O2.
O2. Corpo
Corpo de
de Object()
Object() executado
executado
C3.
C3. super()
super() chamado
chamado (Maquina)
(Maquina)
M2.
M2. super()
super() chamado
chamado (Object)
(Object) Efeito de Object
new Notebook()
M2.
M2. Corpo
Corpo de de Maquina()
Maquina() executado:
executado:
println()
println() ee this.ligar()
this.ligar()

C4:
C4: Construtor
Construtor de
de Teclado
Teclado chamado
chamado Máquina
ligar()
Tk1:
Tk1: super()
super() chamado
chamado (Object)
(Object)
C5.
C5. referência
referência teclado
teclado inicializada
inicializada
C6: Computador Teclado
C6: Construtor
Construtor dede Tela
Tela chamado
chamado
teclado
Te1:
Te1: super()
super() chamado
chamado (Object)
(Object) tela
C7: Tela
C7: referência
referência tela
tela inicializada
inicializada
C8: Corpo de Computador()
C8: Corpo de Computador()
executado:
executado: println()
println()
Notebook
N5.
N5. Construtor
Construtor de
de Bateria
Bateria chamado
chamado
bateria Bateria
B1:
B1: super()
super() chamado
chamado (Object)
(Object) codigo: int

N6: ligar()
N6: variável
variável código
código inicializada:
inicializada: 12345
12345
N7:
N7: referência
referência bateria
bateria inicializada
inicializada
N8.
N8. Corpo
Corpo dede Notebook()
Notebook() executado:
executado: println()
println() 15
N1. new Notebook() chamado
N2. variável código iniciaizada: 0
N3. variável bateria iniciaizada: null
Problemas com
N4. super() chamado (Computador)
C1. variável teclado iniciaizada: null
inicialização
C2. variável tela iniclaizada: null
C3. super() chamado (Maquina)
M2. super() chamado (Object) ƒ método ligar() é chamado no
M2. Corpo de Maquina() executado: construtor de Maquina, mas ...
println() e this.ligar()
ƒ ... a versão usada é a
C4: Construtor de Teclado chamado
implementação em Notebook,
Tk1: super() chamado (Object)
que imprime o valor de código
C5. referência teclado inicializada
C6: Construtor de Tela chamado (e não a versão de Maquina
Te1: super() chamado (Object) como aparenta)
C7: referência tela inicializada ƒ Como código ainda não foi
C8: Corpo de Computador()
executado: println()
inicializado, valor impresso é 0!
N5. Construtor de Bateria chamado

B1: super() chamado (Object)

N6: variável código inicializada: 12345


N7: referência bateria inicializada
N8. Corpo de Notebook() executado: println() 16
Preste atenção nos pontos críticos!
Como evitar o problema?

ƒ Evite chamar métodos locais dentro de construtores


ƒ Construtor (qualquer um da hierarquia) sempre usa
versão sobreposta do método
ƒ Isto pode trazer resultados inesperados se alguém
estender a sua classe com uma nova implementação
do método que
ƒ Dependa de variáveis da classe estendida
ƒ Chame métodos em objetos que ainda serão criados
(provoca NullPointerException)
ƒ Dependa de outros métodos sobrepostos
ƒ Use apenas métodos finais em construtores
ƒ Métodos declarados com modificador final não podem ser
sobrepostos em subclasses
17
Inicialização estática

ƒ Para inicializar valores estáticos, é preciso atuar logo


após a carga da classe
ƒ O bloco 'static' tem essa finalidade
ƒ Pode estar em qualquer lugar da classe, mas será
chamado antes de qualquer outro método ou variável
class UmaClasse {
private static Point[] p = new Point[10];
static {
for (int i = 0; i < 10; i++) {
p[i] = new Point(i, i);
}
}
}
ƒ Não é possível prever em que ordem os blocos static
serão executados, portanto: só tenha um!
18
Exercício

ƒ 1. Preparação
ƒ a) Crie um novo projeto para este módulo
ƒ b) Copie os arquivos Ponto e Circulo dos exercícios feitos
no Capítulo 2 (se você não os fez, use os da solução)
ƒ 2. Crie mais um construtor em Círculo
ƒ a) Crie um construtor default, que represente um círculo
na origem (0,0) com raio unitário
ƒ b) Use this() em dois dos três construtores de Circulo
ƒ 3. Crie uma classe Ponto3D que estenda Ponto.
ƒ Use, se necessário, a chamada correta de super() para
permitir que a classe seja compilada
ƒ 4. Altere TestaCirculo para testar as novas classes
19
Curso J100: Java 2 Standard Edition
Revisão 17.0

© 1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
20

Вам также может понравиться

  • HTML
    HTML
    Документ33 страницы
    HTML
    Paulger
    Оценок пока нет
  • HTML
    HTML
    Документ104 страницы
    HTML
    drescher
    100% (1)
  • Apostila de Webdesign Idepac PDF
    Apostila de Webdesign Idepac PDF
    Документ122 страницы
    Apostila de Webdesign Idepac PDF
    Fernando Henrique
    100% (1)
  • Apostila HTML 01
    Apostila HTML 01
    Документ35 страниц
    Apostila HTML 01
    Igor
    100% (16)
  • Programação Orientada A Objetos
    Programação Orientada A Objetos
    Документ22 страницы
    Programação Orientada A Objetos
    Juliano Oliveira
    93% (15)
  • Dicas HTML
    Dicas HTML
    Документ63 страницы
    Dicas HTML
    nilsonnf
    100% (3)
  • Apostila Java de Orientação A Objetos
    Apostila Java de Orientação A Objetos
    Документ118 страниц
    Apostila Java de Orientação A Objetos
    marcioqm
    100% (7)
  • Apostila de Ruby
    Apostila de Ruby
    Документ161 страница
    Apostila de Ruby
    Matheus Caldas
    Оценок пока нет
  • Java 13
    Java 13
    Документ24 страницы
    Java 13
    drescher
    Оценок пока нет
  • Java 18
    Java 18
    Документ24 страницы
    Java 18
    drescher
    Оценок пока нет
  • Guia Prático de HTML
    Guia Prático de HTML
    Документ62 страницы
    Guia Prático de HTML
    Juliano dos Santos da Silva
    100% (1)
  • Java 15
    Java 15
    Документ32 страницы
    Java 15
    drescher
    100% (1)
  • Java 19
    Java 19
    Документ13 страниц
    Java 19
    drescher
    Оценок пока нет
  • Java 14
    Java 14
    Документ53 страницы
    Java 14
    drescher
    100% (1)
  • Java 17
    Java 17
    Документ57 страниц
    Java 17
    drescher
    100% (1)
  • Java 08
    Java 08
    Документ32 страницы
    Java 08
    drescher
    Оценок пока нет
  • Java 16
    Java 16
    Документ11 страниц
    Java 16
    drescher
    Оценок пока нет
  • Java 12
    Java 12
    Документ38 страниц
    Java 12
    drescher
    100% (1)
  • Apostila Senac PDF
    Apostila Senac PDF
    Документ63 страницы
    Apostila Senac PDF
    Valter Neto
    Оценок пока нет
  • Java 11
    Java 11
    Документ29 страниц
    Java 11
    drescher
    Оценок пока нет
  • Java 10
    Java 10
    Документ33 страницы
    Java 10
    drescher
    Оценок пока нет
  • Java 20
    Java 20
    Документ21 страница
    Java 20
    drescher
    Оценок пока нет
  • Java 04
    Java 04
    Документ11 страниц
    Java 04
    drescher
    Оценок пока нет
  • Java 09
    Java 09
    Документ27 страниц
    Java 09
    Marcelo Guimarães
    Оценок пока нет
  • Java 07
    Java 07
    Документ40 страниц
    Java 07
    drescher
    Оценок пока нет
  • Java 05
    Java 05
    Документ34 страницы
    Java 05
    drescher
    Оценок пока нет
  • Java 03
    Java 03
    Документ17 страниц
    Java 03
    drescher
    Оценок пока нет
  • Apostila de Delphi 7
    Apostila de Delphi 7
    Документ94 страницы
    Apostila de Delphi 7
    Andre Callman
    100% (14)
  • Java 01
    Java 01
    Документ44 страницы
    Java 01
    drescher
    100% (1)
  • 1 Javabasico
    1 Javabasico
    Документ66 страниц
    1 Javabasico
    Carlos Roberto Sierakowski Jr
    Оценок пока нет
  • Trabalho Calculo Numerico
    Trabalho Calculo Numerico
    Документ2 страницы
    Trabalho Calculo Numerico
    Felipe Jesus dos Santos
    Оценок пока нет
  • Padrões de design orientados a objetos
    Padrões de design orientados a objetos
    Документ14 страниц
    Padrões de design orientados a objetos
    Yuri Rodrigues
    Оценок пока нет
  • Debug: Definindo pontos de parada e navegação
    Debug: Definindo pontos de parada e navegação
    Документ12 страниц
    Debug: Definindo pontos de parada e navegação
    Diego Pazin
    Оценок пока нет
  • Apostila JAVA - Games (Completa)
    Apostila JAVA - Games (Completa)
    Документ42 страницы
    Apostila JAVA - Games (Completa)
    ggdio
    100% (2)
  • Basic VBScript For Elipse E3
    Basic VBScript For Elipse E3
    Документ28 страниц
    Basic VBScript For Elipse E3
    Alexsandro De Aquino Santiago
    Оценок пока нет
  • Tpicos Especiais de Poo Und 2
    Tpicos Especiais de Poo Und 2
    Документ7 страниц
    Tpicos Especiais de Poo Und 2
    Jack Vasconcelos
    Оценок пока нет
  • UML e as visões de projeto
    UML e as visões de projeto
    Документ36 страниц
    UML e as visões de projeto
    Nando
    Оценок пока нет
  • Manual de Integração Android Moderninha Smart
    Manual de Integração Android Moderninha Smart
    Документ122 страницы
    Manual de Integração Android Moderninha Smart
    Denis Cesar
    Оценок пока нет
  • Lista de exercícios de programação orientada a objetos
    Lista de exercícios de programação orientada a objetos
    Документ3 страницы
    Lista de exercícios de programação orientada a objetos
    diogorezend
    Оценок пока нет
  • Java OO conceitos
    Java OO conceitos
    Документ2 страницы
    Java OO conceitos
    FELIPE MARTINS LUCIO
    Оценок пока нет
  • Aleatorio
    Aleatorio
    Документ12 страниц
    Aleatorio
    Ana Santos
    Оценок пока нет
  • LINGUAGEM DE PROGRAMAÇÃO Simulado 1
    LINGUAGEM DE PROGRAMAÇÃO Simulado 1
    Документ5 страниц
    LINGUAGEM DE PROGRAMAÇÃO Simulado 1
    edufelix21
    Оценок пока нет
  • Java OO e Herança com Questões Cespe
    Java OO e Herança com Questões Cespe
    Документ16 страниц
    Java OO e Herança com Questões Cespe
    Luis Messias
    Оценок пока нет
  • OO Java Web
    OO Java Web
    Документ18 страниц
    OO Java Web
    NatashaSophie
    Оценок пока нет
  • G120 Comissionamento Startdrive
    G120 Comissionamento Startdrive
    Документ25 страниц
    G120 Comissionamento Startdrive
    Juliano Strassburg
    100% (1)
  • Objetos Distribuídos - GoncalvesJunior Celso M
    Objetos Distribuídos - GoncalvesJunior Celso M
    Документ177 страниц
    Objetos Distribuídos - GoncalvesJunior Celso M
    Celso Goncalves Junior
    Оценок пока нет
  • IA T1 Busca No Pacman
    IA T1 Busca No Pacman
    Документ10 страниц
    IA T1 Busca No Pacman
    Igor Feital
    Оценок пока нет
  • ADVPL II - Advanced
    ADVPL II - Advanced
    Документ66 страниц
    ADVPL II - Advanced
    Alessandro Ludgero
    Оценок пока нет
  • Android Studio Apostila
    Android Studio Apostila
    Документ132 страницы
    Android Studio Apostila
    SI Gestao Principal
    100% (1)
  • Python Programming For Arduino - 2 - Portugues
    Python Programming For Arduino - 2 - Portugues
    Документ144 страницы
    Python Programming For Arduino - 2 - Portugues
    Amanda Barreto
    Оценок пока нет
  • Algoritmos Unimar Compactado
    Algoritmos Unimar Compactado
    Документ143 страницы
    Algoritmos Unimar Compactado
    Rafael Eduardo Souza
    Оценок пока нет
  • C# - Linguagem de Scripts e Fundamentos Da Programação
    C# - Linguagem de Scripts e Fundamentos Da Programação
    Документ104 страницы
    C# - Linguagem de Scripts e Fundamentos Da Programação
    Janayna Autran
    Оценок пока нет
  • Edital PS 22 Java Arquitetura
    Edital PS 22 Java Arquitetura
    Документ10 страниц
    Edital PS 22 Java Arquitetura
    Carlos Carniel
    Оценок пока нет
  • Introdução à POO com Python
    Introdução à POO com Python
    Документ63 страницы
    Introdução à POO com Python
    Rebeca Brandão
    Оценок пока нет
  • Poo Exercicio 05
    Poo Exercicio 05
    Документ2 страницы
    Poo Exercicio 05
    Pierry Ângelo Pereira
    Оценок пока нет
  • Curso Java Programmer Introdução
    Curso Java Programmer Introdução
    Документ4 страницы
    Curso Java Programmer Introdução
    Nelly
    Оценок пока нет
  • Programacao Orientada A Objetos
    Programacao Orientada A Objetos
    Документ80 страниц
    Programacao Orientada A Objetos
    Bruna Fernandes
    Оценок пока нет
  • Manipulação de arquivos Java API classes
    Manipulação de arquivos Java API classes
    Документ20 страниц
    Manipulação de arquivos Java API classes
    dionisio
    Оценок пока нет
  • Aula 03
    Aula 03
    Документ49 страниц
    Aula 03
    Alex Felipe
    Оценок пока нет