SlideShare uma empresa Scribd logo
Java 2 Standard Edition

Classes internas
Helder da Rocha
www.argonavis.com.br

1
Classes internas
Classes podem ser membros de classes, de objetos ou locais
a métodos. Podem até serem criadas sem nome, apenas com
corpo no momento em que instanciam um objeto
Há poucas situações onde classes internas podem ou devem
ser usadas. Devido à complexidade do código que as utiliza,
deve-se evitar usos não convencionais
Usos típicos incluem tratamento de eventos em GUIs,
criação de threads, manipulação de coleções e soquetes
Classes internas podem ser classificadas em quatro tipos
Classes dentro de instruções (classes anônimas)
Classes dentro de métodos (classes locais)
Classes dentro de objetos (membros de instância)
Classes internas estáticas (membros de classe)
2
Tipos de classes internas
São sempre classes dentro de classes. Exemplo:
class Externa {
private class Interna {
public int campo;
public void metodoInterno() {...}
}
public void metodoExterno() {...}
}

Podem ser private, protected, public ou package-private
Exceto as que aparecem dentro de métodos, que são locais

Podem ser estáticas:

E chamadas usando a notação Externa.Interna

Podem ser de instância, e depender da existência de objetos:
Externa e = new Externa();
Externa.Interna ei = e.new Externa.Interna();

Podem ser locais (dentro de métodos)
E nas suas instruções podem não ter nome (anônimas)

3
Classes estáticas (internal classes)
Declaradas como static
Idênticas às classes externas, mas não têm campos static
Classe externa age como um pacote para várias classes internas
estáticas: Externa.Coisa, Externa.InternaUm
Compilador gera arquivo Externa$InternaUm.class
class Externa {
private static class InternaUm {
public int campo;
public void metodoInterno() {...}
}
public static class InternaDois
extends InternaUm {
public int campo2;
public void metodoInterno() {...}
}
public static interface Coisa {
void existe();
}
public void metodoExterno() {...}
}

4
Classes de instância (embedded classes)
São membros do objeto, como métodos e campos de dados
Requerem que objeto exista antes que possam ser usadas.
Externamente use referencia.new para criar objetos

Variáveis de mesmo nome sempre se referem à classe externa
Use NomeDaClasse.this para acessar campos internos

class Externa {
public int campoUm;
private class Interna {
public int campoUm;
public int campoDois;
public void metodoInterno() {
this.campoUm = 10; // Externa.campoUm
Interna.this.campoUm = 15;
}
}
public static void main(String[] args){
Interna e = (new Externa()).new Interna();
}
}

5
Classes dentro de métodos (embedded)
Servem para tarefas "descartáveis" já que deixam de existir
quando o método acaba
Têm o escopo de variáveis locais. Objetos criados, porém, podem
persistir além do escopo do método, se retornados
Se usa variáveis locais do método essas variáveis devem ser
constantes (declaradas final), pois assim podem persistir após a
conclusão do método.
public Multiplicavel calcular(final int a, final int b) {
class Interna implements Multiplicavel {
public int produto() {
return a * b; // usa a e b, que são constantes
}
}
return new Interna();
}
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}

6
Classes anônimas (dentro de instruções)
Classes usadas dentro de métodos freqüentemente servem
apenas para criar um objeto uma única vez
A classe abaixo estende ou implementa SuperClasse, que pode ser
uma interface ou classe abstrata (o new, neste caso, indica a
criação da classe entre chaves, não da SuperClasse)
Object i = new SuperClasse() { implementação };
Compilador gera arquivo Externa$1.class, Externa$2.class,

...
public Multiplicavel calcular(final int a, final int b) {
return new Multiplicavel() {
Compare com parte em
public int produto() {
preto e vermelho do
return a * b;
}
slide anterior!
A classe está dentro da instrução:
};
preste atenção no ponto-e-vírgula!
}
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}

7
Para que servem classes internas?
Mais reutilização
Recurso poderoso quando combinado com interfaces e
herança - facilita implementação de delegação: tipo de
herança de implementação que combinando composição
com herança de interfaces (simula herança múltipla)
"Ponteiros seguros" apontando para métodos localizados
em classes internas
Flexibilidade para desenvolver objetos descartáveis

Riscos
Aumenta significativamente a complexidade do código
Dificulta o trabalho de depuração (erros de compilador
são mais confusos em classes internas)

Evite fugir do convencional ao usar classes internas
8
Como delegação simula herança múltipla
ClasseConcretaUm

Efeito
Desejado

metodoUm()
metodoDois()
metodoTres()

ClasseConcretaDois
metodoCinco()
metodoQuatro()

(não permitido em Java)
ClasseDerivada
ClasseConcretaUm
metodoUm()
metodoDois()
metodoTres()

«interface»

InterfaceUm
metodoCinco()
metodoQuatro()

ClasseDerivada

ClasseConcretaDois

deleg:ClasseConcretaUm
metodoQuatro()
metodoCinco()

Efeito Possível
em Java

deleg

metodoCinco()
metodoQuatro()

deleg.metodoQuatro()

Classes existentes
Classes novas

9
Exercícios
1. Escreva uma aplicação que chame o método
imprimir() de cada uma das classes do arquivo
Internas.java (cap15)
2. Implemente a classe InMethod de Internas.java
como uma classe anônima.

10
Curso J100: Java 2 Standard Edition
Revisão 17.0

© 1996-2003, Helder da Rocha
(helder@acm.org)

argonavis.com.br
11

Mais conteúdo relacionado

PDF
Fundamentos de Objetos Remotos
PPTX
Curso Java Básico - Aula02
PPTX
Curso Java Básico - Aula 03
PPTX
Curso Java Básico - Aula 04
PDF
Programando em python classes
PPTX
Curso Java Básico - Aula 01
Fundamentos de Objetos Remotos
Curso Java Básico - Aula02
Curso Java Básico - Aula 03
Curso Java Básico - Aula 04
Programando em python classes
Curso Java Básico - Aula 01

Mais procurados (17)

PDF
Orientação a Objetos em Python
PDF
Threads 07: Sincronizadores
PDF
Curso de OO com C# - Parte 03 - Plataforma .NET
PPTX
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
PDF
Threads 02: Acesso exclusivo e comunicação entre threads
PDF
Curso de OO com C# - Parte 01 - Orientação a objetos
PDF
Threads 03: Ciclo de vida, aplicações e boas práticas
PDF
Java recursos avançados - multithreading
PDF
Atualização Java 8 (2014)
PDF
Java 06
PPTX
PDF
Threads 05: Travas de Exclusão Mútua
PDF
Python Orientação a Objeto
PDF
Programação Concorrente - Gerenciamento de Threads - Parte II
PDF
Programação Concorrente - Gerenciamento de Threads - Parte I
PPTX
Java: Manipulação de Arquivos
Orientação a Objetos em Python
Threads 07: Sincronizadores
Curso de OO com C# - Parte 03 - Plataforma .NET
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Threads 02: Acesso exclusivo e comunicação entre threads
Curso de OO com C# - Parte 01 - Orientação a objetos
Threads 03: Ciclo de vida, aplicações e boas práticas
Java recursos avançados - multithreading
Atualização Java 8 (2014)
Java 06
Threads 05: Travas de Exclusão Mútua
Python Orientação a Objeto
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte I
Java: Manipulação de Arquivos
Anúncio

Destaque (9)

PPT
Um Esforço Combinado Na Padronização
PDF
Httpunit - Teste de interface Web com HttpUnit
PDF
Fundamentos de JDBC
PDF
Entrada e Saída
PDF
Funcamentos de Programação Concorrente
PDF
Coleções Propriedade, Resources e Strings
PDF
Como construir aplicações gráficas e applets
PDF
Funmentos de Objetos Remotos
PPTX
Teste de Software
Um Esforço Combinado Na Padronização
Httpunit - Teste de interface Web com HttpUnit
Fundamentos de JDBC
Entrada e Saída
Funcamentos de Programação Concorrente
Coleções Propriedade, Resources e Strings
Como construir aplicações gráficas e applets
Funmentos de Objetos Remotos
Teste de Software
Anúncio

Semelhante a Classes internas (20)

PDF
Classes Internas
PPT
Classes Internas
PPTX
AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx
PDF
Interfaces de programação em java2.0.pdf
PPTX
Linguagem de programação implementação de classes
PPT
http://www.dm.ufscar.br/~waldeck/curso/java/
PPT
Java aula 2
PDF
Classes internas
PDF
Reuso com Herança e Composição
PDF
Reuso com Herança e Composição
PPSX
Java & orientação a objetos
PDF
Java orientação a objetos (introdução)
PPT
Classes e Objectos JAVA
PPTX
Introdução à Metaprogramação com Java Reflection API
PDF
POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)
PPT
Aula4
ODT
Guia Rápido Java
PDF
Revisão Sobre Programação Orientada a Objetos com Java
PPT
Curso Java Basico
Classes Internas
Classes Internas
AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx
Interfaces de programação em java2.0.pdf
Linguagem de programação implementação de classes
http://www.dm.ufscar.br/~waldeck/curso/java/
Java aula 2
Classes internas
Reuso com Herança e Composição
Reuso com Herança e Composição
Java & orientação a objetos
Java orientação a objetos (introdução)
Classes e Objectos JAVA
Introdução à Metaprogramação com Java Reflection API
POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)
Aula4
Guia Rápido Java
Revisão Sobre Programação Orientada a Objetos com Java
Curso Java Basico

Mais de Denis L Presciliano (20)

PDF
Testes de Unidade com JUnit
PDF
Erros, exceções e asserções
PDF
Interfaces e Porlimosfismo
PDF
Gerenciamento de projetos com o Apache Ant
PDF
Pacotes e Encapsulamento
PDF
Como criar classes e objetos
PDF
Tipos, literais, operadoes e controle de fluxo
PDF
Como usar a documentação da API Java 2
PDF
Configuração do ambiente JEdit + Ant
PDF
Programação Orientada a objetos em Java
PDF
Introdução a tecnologia Java
PDF
Fundamentos de Sockets
PDF
J530 15 workshop
PDF
J530 14 xdoclet
PDF
Autenticação e Controle de Acesso
PDF
J530 12 transactions
PDF
J530 11 relationships
PDF
J530 10 mdb
PDF
PDF
Testes de Unidade com JUnit
Erros, exceções e asserções
Interfaces e Porlimosfismo
Gerenciamento de projetos com o Apache Ant
Pacotes e Encapsulamento
Como criar classes e objetos
Tipos, literais, operadoes e controle de fluxo
Como usar a documentação da API Java 2
Configuração do ambiente JEdit + Ant
Programação Orientada a objetos em Java
Introdução a tecnologia Java
Fundamentos de Sockets
J530 15 workshop
J530 14 xdoclet
Autenticação e Controle de Acesso
J530 12 transactions
J530 11 relationships
J530 10 mdb

Último (20)

PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Aula sobre banco de dados com firebase db
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PPTX
Aula sobre desenvolvimento de aplicativos
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
COBITxITIL-Entenda as diferença em uso governança TI
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Curso de Java 9 - (Threads) Multitarefas.pptx
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Aula sobre banco de dados com firebase db
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Apple Pippin Uma breve introdução. - David Glotz
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Aula sobre desenvolvimento de aplicativos
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx

Classes internas

  • 1. Java 2 Standard Edition Classes internas Helder da Rocha www.argonavis.com.br 1
  • 2. Classes internas Classes podem ser membros de classes, de objetos ou locais a métodos. Podem até serem criadas sem nome, apenas com corpo no momento em que instanciam um objeto Há poucas situações onde classes internas podem ou devem ser usadas. Devido à complexidade do código que as utiliza, deve-se evitar usos não convencionais Usos típicos incluem tratamento de eventos em GUIs, criação de threads, manipulação de coleções e soquetes Classes internas podem ser classificadas em quatro tipos Classes dentro de instruções (classes anônimas) Classes dentro de métodos (classes locais) Classes dentro de objetos (membros de instância) Classes internas estáticas (membros de classe) 2
  • 3. Tipos de classes internas São sempre classes dentro de classes. Exemplo: class Externa { private class Interna { public int campo; public void metodoInterno() {...} } public void metodoExterno() {...} } Podem ser private, protected, public ou package-private Exceto as que aparecem dentro de métodos, que são locais Podem ser estáticas: E chamadas usando a notação Externa.Interna Podem ser de instância, e depender da existência de objetos: Externa e = new Externa(); Externa.Interna ei = e.new Externa.Interna(); Podem ser locais (dentro de métodos) E nas suas instruções podem não ter nome (anônimas) 3
  • 4. Classes estáticas (internal classes) Declaradas como static Idênticas às classes externas, mas não têm campos static Classe externa age como um pacote para várias classes internas estáticas: Externa.Coisa, Externa.InternaUm Compilador gera arquivo Externa$InternaUm.class class Externa { private static class InternaUm { public int campo; public void metodoInterno() {...} } public static class InternaDois extends InternaUm { public int campo2; public void metodoInterno() {...} } public static interface Coisa { void existe(); } public void metodoExterno() {...} } 4
  • 5. Classes de instância (embedded classes) São membros do objeto, como métodos e campos de dados Requerem que objeto exista antes que possam ser usadas. Externamente use referencia.new para criar objetos Variáveis de mesmo nome sempre se referem à classe externa Use NomeDaClasse.this para acessar campos internos class Externa { public int campoUm; private class Interna { public int campoUm; public int campoDois; public void metodoInterno() { this.campoUm = 10; // Externa.campoUm Interna.this.campoUm = 15; } } public static void main(String[] args){ Interna e = (new Externa()).new Interna(); } } 5
  • 6. Classes dentro de métodos (embedded) Servem para tarefas "descartáveis" já que deixam de existir quando o método acaba Têm o escopo de variáveis locais. Objetos criados, porém, podem persistir além do escopo do método, se retornados Se usa variáveis locais do método essas variáveis devem ser constantes (declaradas final), pois assim podem persistir após a conclusão do método. public Multiplicavel calcular(final int a, final int b) { class Interna implements Multiplicavel { public int produto() { return a * b; // usa a e b, que são constantes } } return new Interna(); } public static void main(String[] args){ Multiplicavel mul = (new Externa()).calcular(3,4); int prod = mul.produto(); } 6
  • 7. Classes anônimas (dentro de instruções) Classes usadas dentro de métodos freqüentemente servem apenas para criar um objeto uma única vez A classe abaixo estende ou implementa SuperClasse, que pode ser uma interface ou classe abstrata (o new, neste caso, indica a criação da classe entre chaves, não da SuperClasse) Object i = new SuperClasse() { implementação }; Compilador gera arquivo Externa$1.class, Externa$2.class, ... public Multiplicavel calcular(final int a, final int b) { return new Multiplicavel() { Compare com parte em public int produto() { preto e vermelho do return a * b; } slide anterior! A classe está dentro da instrução: }; preste atenção no ponto-e-vírgula! } public static void main(String[] args){ Multiplicavel mul = (new Externa()).calcular(3,4); int prod = mul.produto(); } 7
  • 8. Para que servem classes internas? Mais reutilização Recurso poderoso quando combinado com interfaces e herança - facilita implementação de delegação: tipo de herança de implementação que combinando composição com herança de interfaces (simula herança múltipla) "Ponteiros seguros" apontando para métodos localizados em classes internas Flexibilidade para desenvolver objetos descartáveis Riscos Aumenta significativamente a complexidade do código Dificulta o trabalho de depuração (erros de compilador são mais confusos em classes internas) Evite fugir do convencional ao usar classes internas 8
  • 9. Como delegação simula herança múltipla ClasseConcretaUm Efeito Desejado metodoUm() metodoDois() metodoTres() ClasseConcretaDois metodoCinco() metodoQuatro() (não permitido em Java) ClasseDerivada ClasseConcretaUm metodoUm() metodoDois() metodoTres() «interface» InterfaceUm metodoCinco() metodoQuatro() ClasseDerivada ClasseConcretaDois deleg:ClasseConcretaUm metodoQuatro() metodoCinco() Efeito Possível em Java deleg metodoCinco() metodoQuatro() deleg.metodoQuatro() Classes existentes Classes novas 9
  • 10. Exercícios 1. Escreva uma aplicação que chame o método imprimir() de cada uma das classes do arquivo Internas.java (cap15) 2. Implemente a classe InMethod de Internas.java como uma classe anônima. 10
  • 11. Curso J100: Java 2 Standard Edition Revisão 17.0 © 1996-2003, Helder da Rocha (helder@acm.org) argonavis.com.br 11