Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido - PDF
Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido
Download "15-09-2009. Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido"
Ricardo César Carmona
1 PARTE III: Java e OO - detalhes Membros de classe e instâncias Pacotes Visibilidade Classes aninhadas Membros de classe e de instância De classe Static Método não necessita de objeto para ser chamado. Atributo existe um só cópia para todos os objetos da classe. De instância não static necessita de objeto para ser chamado. há uma cópia para cada objeto instanciado. 1 2 Exercício public class A { public static int x = 7; public int y = 3; public static int somar(int v) { return x + v; public int multiplicar() { return x * y; a. Quais são os atributos e métodos de classe? b. Quais são os atributos e métodos de instância? Exemplo 1: método 3. public void imprimir() { public static void main(string[] args) { 9. imprimir(); ERRO! non-static method imprimir() cannot be referenced from static context Fonte Exemplo 1 corrigido 3. public static void imprimir() { public static void main(string[] args) { 9. imprimir(); Exemplo 1 corrigido versão 2 3. public void imprimir() { public static void main(string[] args) { 9. ImprimirStrings is = new ImprimirStrings(); 10. is.imprimir()
2 Exemplo 2: atributo 3. public static void imprimir() { 7. System.out.println(str); public static void main(string[] args) { 10. imprimir(); Exemplo 2 corrigido 3. public void imprimir() { 7. System.out.println(str); public static void main(string[] args) { 10. ImprimirStrings obj = new ImprimirStrings(); 11. obj.imprimir(); ERRO! non-static variable str cannot be referenced from static context 7 8 Exemplo 3: métodos e atributos de utilidade 1.public class Circle { 2. public static double calculaarea(double raio) { 3. return Math.PI * ( raio * raio ); // Dentro de um método qualquer... 7.// utilizamos o nome da classe na chamada 8. double circlearea = Circle.calculaArea(5); 9. Exercícios Da apostila: 09 (num autos feitos) 10 (num instâncias de sinaleiros) JAVARepositorio/JRevisaoOO/JExercSinaleiroInstanciasSol Não abusar do uso de métodos static se não criamos programas sem objetos 9 10 PARTE III: Java e OO - detalhes Membros de classe e instâncias Pacotes Visibilidade Classes aninhadas Pacotes em Java Declaração em Java: Deve ser a 1ª declaração do arq. Sintaxe: package <nome>; Exemplos: package poligono; package primitiva; 11 Importar pacotes import primitiva.*; Somente as classes utilizadas no programa são carregadas pela JVM import primitiva.ponto; 12 2
3 Pacotes: packages Pacotes: representação UML É uma coleção de classes Melhorar organização do código Reduzir conflito de nomes Convenção Sun edu.utfpr.<nome do pacote> edu.utfpr.dainf.<nome do pacote> com.uol.<nome do pacote> Nome do pacote Relação Pacotes em Java: conflito de nomes Pacotes: organização do código Dois pacotes com classes ponto package primitiva class Ponto... package base class Ponto... Para distingui-las: primitiva.ponto base.ponto 15 Diretório dos fontes <proj>/src/ poligono Regular.java Hexagono.java Pentagono.java primitiva Linha.java Ponto.java > cd <proj>/src Diretório.class <proj>/build/classes/ poligono Regular.class Hexagono.class Pentagono.class primitiva Linha.class Ponto.class > javac poligono/*.java primitiva/*.java -d../build/classes opção d: compilador cria diretórios com base na declaração package; o 16 diretório../build/classes deve existir!!! PARTE III: Java e OO - detalhes Visibilidade classes, métodos e atributos Membros de classe e instâncias Pacotes Visibilidade Classes aninhadas Níveis de controle de acesso - Privado # Protegido + Público ~ De Pacote (default)
4 Visibilidade privada Elemento Classe top-level Classe aninhada Método Atributo Aplica-se NÃO - Membros privados somente podem ser acessados na mesma classe. Assim, classes derivadas não podem acessar membros privados da classe base Membros private de uma classe base não são herdados pelas classes derivadas Membros = métodos/atributos 19 Visibilidade atributos privados Pessoa -nome: String josé:pessoa Nome= José class Pessoa { private String nome; public Pessoa(String nome) { this.nome = nome; void copiarnome(pessoa outra) { nome = outra.nome; joão:pessoa Nome= João O objeto José pode acessar o atributo privado de João? 20 Visibilidade método privado Aluno Pessoa -nome: String -anonasc: int -calcidade: int -curso: String :Aluno curso= informatica Nome has private access in Pessoa O objeto aluno pode ver os atributos nome e anonasc, e o método calcidade de Pessoa? class Main { public static void main(string args[]) { Aluno a = new Aluno(); a.curso = informatica ; a.nome = Jairo ; a.anonasc = 1975; int i = a.calcidade(); Cannot find method Visibilidade protegida Elemento Classe top-level Classe aninhada Método Atributo Aplica-se NÃO # Membros protegidos podem ser acessados por classes do mesmo pacote Membros protegidos são herdados; assim classes derivadas podem acessá-los (mesmo se estiverem em pacotes diferentes) Visibilidade protegida (exemplo) Aluno Pessoa #nome: String #anonasc: int #calcidade: int #curso: String :Aluno curso= informatica OK O objeto aluno pode ver os atributos nome e anonasc, e o método calcidade de Pessoa? class Main { public static void main(string args[]) { Aluno a = new Aluno(); a.curso = informatica ; a.nome = Jairo ; a.anonasc = 1975; int i = a.calcidade(); OK 23 Visibilidade default Elemento Classe top-level Classe aninhada Método Atributo Aplica-se ~ É o valor assumido, quando nada é especificado Membros sem modificadores podem ser acessados por classes do mesmo pacote Membros default são herdados; assim classes derivadas podem acessá-los (somente se estiverem no mesmo pacote diferente do protegido). 24 4
5 Visibilidade pública Elemento Classe Classe aninhada Método Atributo Aplica-se + Todas as classes podem visualizar atributos, métodos e classes públicas, independente do pacote onde estejam. Obs: somente uma classe pública é permitida por arquivo fonte.java VISIBILIDADE: quadro resumo Privado private Protegido protected Pacote default Público public Classe* NÃO NÃO Aninhada Método Atributo * classes não aninhadas Exercícios Apostila 11 JRevisaoOO\JExercSinaleiroConstrutoraPrivate 12 JRevisaoOO\JExercPacotes 13 JRevisaoOO\JCadastroUsuario PARTE III: Java e OO - detalhes Membros de classe e instâncias Pacotes Visibilidade Classes aninhadas Classes aninhadas Uma classe é definida como membro de outra classe CLASSE EXTERNA CLASSE ANINHADA Exemplo public class JLinha { private static int totlinha=0; private int idlinha; protected Ponto pt1; protected Ponto pt2; public JLinha(int x1, int y1, int x2, int y2) { idlinha = ++totlinha; pt1 = new Ponto(x1, y1); pt2 = new Ponto(x2, y2); public JLinha() { idlinha = ++totlinha; public class Ponto { protected int x; protected int y; protected Ponto(int x, int y) { this.x = x; this.y = y; protected String pontostr() { return "(" + x + ", " + y + ")"; 29 protected String pontostrcomid(){ return "Linha " + idlinha + " " + pontostr(); Tem acesso aos membros da classe JLinha 30 5
6 Instanciação de classes aninhadas Há duas formas como mostram os slides a seguir: 1. a construtora de Jlinha instancia os pontos 2. instancia-se Jlinha para depois instanciar os pontos Instanciação: forma 1 public class JMain { public static void main(string args[]) { // Forma 1: a construtora de linha instancia // os dois pontos JLinha l1 = new JLinha(5, 15, 7, 17); System.out.println(l1.pt1.pontoStr() + " " + l1.pt2.pontostr()); Observar que o acesso aos pontos se faz pela linha JRevisaoOO\JLinhaClasseAninhada Instanciação: forma 2 Objetos de classes internas public class JMain { public static void main(string args[]) { // Forma 2: instancia-se linha e depois os pontos JLinha l2 = new JLinha(); JLinha.Ponto p1 = l2.new Ponto(10, 10); JLinha.Ponto p2 = l2.new Ponto(20, 20); l2.pt1 = p1; l2.pt2 = p2; System.out.println(l2.pt1.pontoStrComId() + " " + l2.pt2.pontostrcomid()); Observar que a classe Ponto só existe no contexto da JLinha!!! Importante!!! Pontos só podem existir se houver uma linha Ponto 1 obj. interno Linha = objeto externo Ponto 2 obj. interno JRevisaoOO\JLinhaClasseAninhada Exercícios Baixe o código das classes aninhadas disponível em Observe a existência do JLinha$Ponto.class Desaninhe a classe Ponto de JLinha preservando os mesmos comportamentos Representanção em UML JLinha -totlinha:int=0 +JLinha(x:int, y:int, x2:int, y2:int) +linhatostring():string Agregação por composição 1 Os dois exemplos Ponto aninhado e não aninhado são representados de forma similar em UML. 2 Ponto #x: int #y: int #Ponto(x:int, y:int) #pontotostring():string
7 Exercícios: interface e aninhamento Fazer exercício 14 da apostila (transcrito abaixo) Utilize uma classe interna que implemente a interface Iteratore permita navegar num vetor de 10 inteiros aleatórios armazenados em um atributo de instância da classe externa. O método next() do Iteratordeve retornar somente os valores ímpares armazenados no vetor. Por exemplo, se no vetor existirem os seguintes números: [100, 39, 88, 13, 4, 4, 2, 5, 94, 32], a sequência de invocações de next() produz: next() -> 39 next() -> 13 next() -> 5 next() -> throw NoSuchElementExecption O métod hasnext() verifica se há um ímpar em alguma posição além das já pesquisadas. A implementação do método remove() é opcional e, caso não seja feita, deve retornar uma instância de UnsupportedOperationException(com throw) Solução em \JRevisaoOO\JAninhadaIteratorSol 37 Classe Aninhada Estática 1.public class JRadar { 2. private int velocidademaxima; public JRadar(int v) { 5. velocidademaxima = v; public Boolean multar(int v) { 8. // multar return true qdo a velocidade detectada pelo 9. // radar excede em 10% a velocidade maxima; 10. if (v > (velocidademaxima * 1.1)) 11. return true; 12. else 13. return false; public static class TesteJRadar{ 16. public static void main(string args[]) { 17. JRadar r[] = {new JRadar(40), new JRadar(60), new JRadar(110); 18. int v[] = {44, 67, 110; 19. Boolean res[]={false, true, false; 20. for (int i=0; i < r.length; i++) { 21. if (r[i].multar(v[i]) == res[i]) 22. System.out.println("OK"); 23. else 24. System.out.println("ERRO: radar " + i); RepositorioJAVA\JRevisaoOO\JExemClasseAninhadaEstaticaRadar Classe aninhada estática Observe os.class gerados por javac JRadar.class JRadar$TesteJRadar.class Para executar na linha de comando java JRadar$TesteJRadar Exercícios Fazer exercício 15 da apostila (transcrito abaixo) Utilize uma classe aninhada estática para testar uma classe externa que calcula o dígito verificador de um código composto por três dígitos da seguinte forma: 829 => 8*4+ 2*3+ 9*2= 56=> 56 %10= 6 (dígito verificador). O teste deve ser feito para dois códigos cujos dígitos verificadores são conhecidos. Solução JRevisaoOO\JExerClasseAninhadaEstaticaDVSol Por que utilizar classes aninhadas? Quando a classe interna for utilizada somente pela externa Aumenta encapsulamento Se as classes aninhadas forem pequenas Aumenta legibilidade código mais próximo da onde é utilizado Tipos de classe aninhada 1. class Externa { class Interna { class static AninhadaEstatica {
8 Interna x Aninhada static Classes internas anônimas Necessário instanciar objeto da classe externa? Classe interna tem acesso a atributos de instância e métodos da classe externa? Um objeto da classe interna tem implicitamente uma referência ao objeto da sua classe externa? Interna (não static) Aninhada Static NÃO NÃO NÃO (não há objeto) 1.Button b = new Button("Ok"); 2.b.addActionListener( 3. new ActionListener() { 4. public void actionperformed(actionevent e) { 5. tratarok(); ); As linhas [3, 7] instanciam um objeto da classe ActionListener e sobrescrevem o método actionperformed. Este objeto é passado como argumento do método addactionlistener na linha 2. ActionListener é uma classe interface Classes internas anônimas (e.g. 2) 1. public static void main(string args[]) { 2. java.awt.eventqueue.invokelater( 3. new Runnable() { 4. public void run() { 5. new IUEditor().setVisible(true); ); 9. Somente podemos instanciar classes anônimas que estendemoutra classe ou que implementemoutra classe (não as duas coisas ao mesmo tempo e nem mais de uma classe de interface). Por exemplo, a classe Runnable é de interface e, neste exemplo, é instanciada. 45 8
AUTOR: CESAR AUGUSTO TACLA CRIAÇÃO: 5/3/2009 11:16 ÚLT. ALTERAÇÃO: 22/9/2009 09:09 PR UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ REVISÃO PROGRAMAÇÃO ORIENTADA A OBJETOS UTILIZANDO JAVA Prof. Cesar Augusto