Orientação a Objetos em Java LPGII - Java Orientação a Objetos em Java Roberto Vedoato [email protected] Definição de classes Criação de objetos Herança Polimorfismo Ligação Dinâmica Uso de Bibliotecas (packages) Compatibilidade entre classes (casting) Operador instance of Modificadores: final, static e abstract Interfaces Orientação a Objetos em Java Definição de classes 2 Membros de Classe Classe é o único meio de criar novos tipos de dados Formato geral de classe: Variáveis de instância class nome { // declaração de atributos (campos do objeto) //definição de métodos (funções/comportamento) } Variáveis de classe (static) 3 funções/procedimentos que implementam o comportamento dos objetos da classe; Construtor Orientação a Objetos em Java compartilhada por todos os objetos da classe são alocadas quando a classe é carregada Constantes (final) Métodos definem a estrutura dos objetos derivados da classe podem ser de tipo simples ou derivado de outra classe método especial para criar objetos; Orientação a Objetos em Java 4 Exemplo Modificadores de Acesso class Circulo { float xpos, ypos, raio; static int numCirc; // variáveis de instância // variável de classe void defOrigem (float x, float { xpos = x; ypos = y ; } y) membros de classe podem ter restrição de acesso estabelecida por atributos de visibilidade // métodos private, protected, public public - sem restrições acessível void defRaio ( float r) { raio = r ; } protected acessível } Orientação a Objetos em Java na própria classe e nas classes filhas private acessível float calcArea ( ) { return 3.1416 * raio * raio ; } em qualquer classe apenas na própria classe classes devem ser declaradas public ou protected 5 Orientação a Objetos em Java Exemplo Criação de Objetos class Circulo { private float xpos, ypos, raio; // variáveis de instância public void defOrigem (float x, float { xpos = x; ypos = y ; } y) // métodos public void defRaio ( float r) { raio = r ; } public float calcArea ( ) { return 3.1416 * raio * raio ; } 6 Objetos são instâncias de classe, alocados dinamicamente Saõ criados através do operador new que chama o construtor da classe Construtor aloca espaço de memória para objeto Variáveis do tipo classe são ponteiros para objetos da classe Exemplo class Circulo { … }; // declara classe Circulo circ ; // declara variável do tipo da classe circ = new Circulo( ); // cria objeto circ.defOrigem (1.5, 2.0); // envia mensagem } Orientação a Objetos em Java 7 Orientação a Objetos em Java 8 Construtores Exemplo Servem para criar e iniciar novos objetos Construtor aloca memória (e inicia), não retorna valor Valores para iniciar são passados como parâmetros Uma classe pode ter um ou mais construtores de objetos São declarados com o mesmo nome da classe Construtores devem ser definidos como public Caso não haja um construtor explícito Java executa o construtor pai por padrão Orientação a Objetos em Java class Circulo { // atributos de instância private float xpos,ypos,raio; // construtores public Circulo ( ) { xpos = 0; ypos = 0; radius = 0 ; } public Circulo (float x, float y, float r) {xpos = x; ypos = y; radius = r ; } // método public float calcArea ( ) { return 3.1416 * raio * raio ; } } 9 Exercício – Sobrecarga de Construtor public static void main (String args[ ]) { Exemplo04 obj1 = new Exemplo04(); System.out.println(“x = “ + obj1.x); System.out.println(“y = “ + obj1.y); public Exemplo04(int num1) { x = num1; y = num1 * 2; } } } pode adicionar novos componentes; não pode remover definições da superclasse pode redefinir métodos Object Exemplo04 obj3 = new Exemplo04(2,5); System.out.println(“x = “ + obj2.x); System.out.println(“y = “ + obj2.y); Orientação a Objetos em Java Java implementa herança simples Object é a classe raiz de todas as classes, fornece o comportamento básico de todas as classes Todas as classes do usuário são obtidas por especialização de classes do ambiente Java Subclasse herda os componentes da superclasse Exemplo04 obj2 = new Exemplo04(2); System.out.println(“x = “ + obj2.x); System.out.println(“y = “ + obj2.y); public Exemplo04(int num1, num2) { x = num1; y = num2; } 10 Herança Considere a classe abaixo, teste a criação de objetos com os três construtores, imprima na tela os valores dos atributos e explique os resultados class Exemplo04 { int x, y; Orientação a Objetos em Java classes de biblioteca 11 classes de usuário Orientação a Objetos em Java 12 Definição de Subclasses Redefinindo Métodos Superclasse deve ser indicada na declaração da classe public class Square { double lado; public double area ( ) Exemplo: class Frame extends Window { . . . } Superclasse omitida na declaração da classe significa que a classe é subclasse direta de Object Square lado { return lado*lado ; } area() } Exemplo: class Circulo {. . . } public class Rectangle extends Square { double altura; public double area ( ) Método redefinido em subclasse redeclaração esconde componente herdado super traz o componente herdado de volta ao escopo altura { return lado*altura ; } area() } Orientação a Objetos em Java 13 Chamada a Métodos Rectangle Orientação a Objetos em Java 14 Chamada a Métodos da Superclasse chamada de método (envio de mensagem) <nome_objeto> . <nome_método> ( <params> ) Quando método é prefixado com super, a procura inicia na superclasse imediata à classe que contém o método Frame class Janela extends Frame { void paint( ); { . . . super.paint( ); . . . } } Exemplo de chamada a método de instância: class Janela extends Frame {. . . } // define classe Janela tela1 = new Janela( ); // declara e cria objeto tela1.show( ); // envia mensagem paint() Janela paint() Orientação a Objetos em Java 15 Orientação a Objetos em Java 16 Chamada a Métodos da Superclasse Sobrecarga class Base { int i = 1; String teste() { return "Base"; } } Dentro de um método, this identifica o próprio objeto para o qual a mensagem foi enviada class Cilindro { float xpos, ypos, raio, altura; class Derivada extends Base { int i = 2; String teste() { return "Derivada"; } } public float calcArea ( ) { return 3.1416 * raio * raio ; } public float calcVolume ( ) { return this.calcArea() * altura ; } Orientação a Objetos em Java 17 Exercício Base int i=1; String teste() Derivada int i=2; String teste() Orientação a Objetos em Java 18 Encadeamento de Construtores Crie a aplicação TesteHerança. Quais serão os resultados? class TesteHeranca { public static void main (String arg[]) { Base base = new Base(); Derivada derivada = new Derivada(); Base baseDerivada = new Derivada(); int x = base.i; int y = derivada.i; int z = baseDerivada.i; String xfun = base.teste(); String yfun = derivada.teste(); String zfun = baseDerivada.teste(); System.out.println("Teste de Herança"); System.out.println(“Atributos = "+x+" - "+y+" - "+z); System.out.println("Metodos = "+xfun+" - "+yfun+" - "+zfun); } 19 da mesma classe por this ( ) da superclasse por super ( ) Construtor que não contém tal chamada, inclui implicitamente chamada super ( ) Teste de Herança Atributos = 1 - 2 - 1 Metodos = Base - Derivada - Derivada Orientação a Objetos em Java Um construtor pode chamar outro construtor, isto se chama “encadeamento de métodos construtores” Caso não haja um construtor explícito Java prove um construtor padrão Primeiro comando de construtor é uma chamada a outro construtor uma cadeia completa de construtores é chamada até a raiz Orientação a Objetos em Java 20 Exercício Exercício class SuperClasse { SuperClasse() { System.out.println("Construtor SuperClasse"); } Crie a aplicação TesteHerança2. Qual é o resultado? class TesteHeranca2 { public static void main (String arg[]) { System.out.println(“Teste de Heranca 2”); Subclasse sub = new Subclasse(); sub.teste(); } } void teste() { System.out.println("Metodo SuperClasse");} } class SubClasse extends SuperClasse { SubClasse() { System.out.println("Construtor SubClasse"); } void teste() { System.out.println("Metodo SubClasse"); } } Orientação a Objetos em Java 21 Curiosidades sobre Construção de Objetos 1. Inicialização default de campos de dados (0, null, false) 2. Chamada recursiva ao construtor da superclasse (até Object) Evite chamar métodos locais dentro de construtores 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) 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 23 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 3. Inicialização explícita dos campos de dados 4. Execução do conteúdo do construtor Orientação a Objetos em Java 22 Curiosidades sobre Construção de Objetos Seqüência de execução na chamada de um construtor Orientação a Objetos em Java Métodos declarados com modificador final não podem ser sobrepostos em subclasses Orientação a Objetos em Java 24 Destruição de Objetos Curiosidades sobre Destruição de Objetos Java desaloca objetos através do garbage collector Referência a objeto pode ser removida atribuindo a null memória alocada para objeto não é liberada de imediato Garbage colletor executa em baixa prioridade Desejando-se realizar outras ações associadas à destruição de objetos (exemplo: fechar arquivos): método finalize finalize chamado pelo garbage collector antes do objeto ser destruído void finalize ( ) { . . . } Orientação a Objetos em Java 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 {...} 25 O Uso de Bibliotecas Objetos são destruídos automaticamente pelo garbage colector quando perdem sua referência, porém, o sistema garbage colector não faz finalização Orientação a Objetos em Java 26 Modificadores de Acesso As classes Java são agrupadas em pacotes O pacote padrão é: java.lang Classes que pertencem a outros pacotes devem ser importadas O comando import carrega arquivos .class Exemplos de importação Acesso dentro do package onde a classe foi declarada Modificador Herança (métodos) Acessível (atributos e métodos) default sim sim public sim sim protected sim sim private não não import java.awt.Rectangle; import java.awt.*; Acesso fora do package onde a classe foi declarada Modificador Orientação a Objetos em Java 27 Herança (métodos) Acessível (atributos e métodos) default não não public sim sim protected sim sim private não não Orientação a Objetos em Java 28 Modificadores de Acesso - Exercício Crie uma classe pai, ClassePai, com atributos (a,b) e métodos (alteraA, alteraB), privados (a, alteraA) e públicos (b, alteraB). Crie uma classe filha, ClasseFilha, que possua métodos para tentar: Compatibilidade de Classes Figura f1, f2; f1 = new Figura(); f2 = f1 ; Ler o atributo a e o atributo b Alterar o atributo a e o atributo b Chamar o método alteraA e o método alteraB Verifique se é verdadeira a afirmação de que métodos e atributos privados não são herdados. Observação: não utilize super Orientação a Objetos em Java Retangulo r = new Retangulo (); f1 = r ; // é possível? r = f2; // é possível? 29 Figura Elipse fig = eli; obj = round; RoundRet ret = fig; // erro de compilação fig = new Retangulo( ); ret = (Retangulo) fig; // casting torna atribuição correta Orientação a Objetos em Java Retangulo Elipse RoundRet Orientação a Objetos em Java Object Retangulo Figura 30 Operador instanceof Compatibilidade de Classes - Exemplo Retangulo ret = new Retangulo( ); Figura fig = new Figura ( ); Object obj = new Object ( ); RoundRet round = new RoundRet ( ); Elipse eli = new Elipse ( ); um objeto pode ser atribuído a qualquer objeto da mesma classe ou de superclasse Object Operador para investigar a classe de um objeto Resulta true se o objeto é da classe ou de subclasse <objeto> instanceof <classe> Exemplo: Figura[] fig = new Figura[3]; fig[0] = new Retangulo( ); fig[1] = new Elipse( ); fig[2] = new RoundRect( ); fig[0] instanceof Figura // retorna true fig[2] instanceof Retangulo //retorna true fig[1] instanceof Retangulo //retorna false 31 Orientação a Objetos em Java 32 Exercício 1. Escreva uma classe Ponto contém x e y que podem ser definidos em construtor métodos getX() e getY() que retornam x e y métodos setX(int) e setY(int) que mudam x e y raio inteiro e origem Ponto construtor que define origem e raio método que retorna a área método que retorna a circunferência use java.lang.Math.PI (Math.PI) um raio do tipo int e coordenadas x e y Orientação a Objetos em Java 33 Modificador Final são constantes, não podem ser modificadas Exemplo: final double PI = 3.14159265; não podem ser redefinidos nas subclasses Classes final 34 Uma classe pode conter membros de classe (atributos e métodos), sendo Métodos final Orientação a Objetos em Java Modificador Static Variáveis final Final Static Abstract 3. Crie um segundo construtor para Circulo que aceite Modificadores funcionam como delimitadores de características 2. Escreva uma classe Circulo, que contenha Modificadores final float Consulta(String num) { ...} Orientação a Objetos em Java Podem ser acessados diretamente, sem necessidade da existência de um objeto. Exemplos: não podem ser especializadas todos os métodos são considerados final Exemplo: 35 compartilhados por todos os objetos daquela classe alocados quando a classe é carregada NomedaClasse.variavelestatica = 12; NomedaClasse.metodoestatico; Métodos estáticos podem referenciar apenas métodos estáticos e não podem referenciar operadores this e super Orientação a Objetos em Java 36 Modificador Static Static Initializer Exemplo: class Pessoa { static int numpessoas = 0; int id; Pessoa () { id = numpessoas; numpessoas++; } ... static double[] sin256 = new double [256]; static { for (int i=0; i <256; i ++) sin256[i] = Math.sin ( i/256*2Math.PI); } } Pessoa p1 = new(Pesssoa); p1.numpessoas++; // mesmo efeito que abaixo Pessoa.numpessoas++; Orientação a Objetos em Java Não é função, não tem argumentos Uma classe pode ter vários static initializers, sendo executados na ordem em que aparecem 37 Perguntas Para iniciar variáveis de classe, inicializers são executados automaticamente na carga da classe Exemplo: Orientação a Objetos em Java 38 Modificador Abstract Porque um método estático não pode referenciar elementos que não sejam estáticos ? Em que situação um método final pode ser útil ? Indica classe ou método abstrato, com o objetivo de Exemplos: Orientação a Objetos em Java 39 definir generalizacões especializar em subclasses classe abstrata: pelo menos um método abstrato método abstrato: sem corpo, apenas assinatura public abstract class Number (superclasse de Integer, Double, Float) public abstract int intValue() public abstract float floatValue() public abstract double doubleValue() Orientação a Objetos em Java 40 Modificador Abstract Classes abstratas Modificador Abstract definem protocolos para hierarquia, fornecendo apenas modelos de comportamento representam generalizações contém pelo menos um método abstrato Métodos abstratos abstract public class <nome_classe> { // pelo menos um método abstrato . . . } método sem corpo (sem implementação, apenas assinatura) representa comportamento comum a todas subclasses, mas com distinta implementação em cada subclasse métodos abstratos são implementados em subclasses Orientação a Objetos em Java abstract public <tipo_retorno > <nome_método > ( ) ; 41 Interfaces Orientação a Objetos em Java 42 Interfaces Classe na qual todos os métodos são abstratos Classe contendo método abstrato não pode ser instanciada Construtores e métodos private ou static não podem ser declarados como abstract Declaração de classes e métodos abstratos: Exemplo coleção de métodos abstratos public class Printer// classe concreta { . . . } Simula herança múltipla Constituem-se, estritamente, em modelos de comportamento Não podem ser instaciadas Variáveis não podem ser herdadas de uma Interface Todos os métodos de interface devem ser publicos e abstratos Uma classe implementa uma interface quando indicada pela palavra implements Uma classe pode implementar várias interfaces Hierarquia de interface não é relacionada com a hierarquia de classes Orientação a Objetos em Java public interface Copier { public void copyDoc (Doc d ) ; } public interface Fax { public void transmitDoc (Doc d ) ; } Public class MultiFunctionPrinter { public void public void extends Printer implements Copier, Fax copyDoc (Doc d) { // implemta concreta } transmitDoc (Doc d) {//implemta concreta } } 43 Orientação a Objetos em Java 44 Interfaces Perguntas Uma classe que implementa uma interface não herda, apenas promete implementar os métodos definidos na interface (implements) O modificador abstract não deve ser usado na declaração dos métodos Vantagem do uso de interfaces: definição de protocolos para classes abstratas sem se preocupar com detalhes de implementação compartilhar uma mesma interface com várias classes simular herança múltipla Orientação a Objetos em Java 45 Classes Abstratas X Interfaces Questões semânticas Quando usar uma ou outra Exemplo: Célula de uma planilha Deve manipular tipos como String, Float, Data, etc... Possíveis soluções: Interfaces podem ser especializadas? Interfaces formam hierarquias independentes? São derivadas da classe Object? Definir métodos no ancestral comum Criar um novo ancestral e redefinir tipos presentes na célula da planilha. Interfaces: Melhor solução Orientação a Objetos em Java 47 Orientação a Objetos em Java 46