JAVA Marcio de Carvalho Victorino 1 Orientação a Objetos 2 Introdução a Orientação Objetos a 3 Orientação a Objetos • Propósitos da Programação Orientada a Objetos Prover mecanismos para visualizar a complexidade do desenvolvimento de software da mesma forma que visualizamos a complexidade do mundo real; Acelerar o desenvolvimento de softwares com base na modularidade e acoplamento; Melhorar a qualidade do software desenvolvido. 4 Classes - conceitos • definem a estrutura e o comportamento de um tipo de objeto; • atuam como templates; • permitem a instanciação de um ou mais objetos de um mesmo tipo. Nome Atributos Métodos 5 Classes Visão do mundo real: • moldes para criação de objetos; • especificam propriedades e ações em comum a todos seus objetos. Classe Automóvel 6 Objetos - conceitos • Objeto é uma representação abstrata de uma entidade do mundo real, que tem um identificador único, propriedades embutidas e a habilidade de interagir com outros objetos e consigo mesmo. • Estado do objeto é um conjunto de valores que os atributos do objeto podem ter em um determinado instante do tempo. 7 Objetos Visão em POO: Um conjunto distinto de atributos e métodos que representam entidades do mundo real, implementados por software e gerados (instanciados) através de classes. Métodos Métodos Atributos Métodos Métodos 8 Objetos Visão em POO: • Objeto: pacote de software contendo dados e código (procedimentos) relacionados. • Os procedimentos são chamados métodos. Os dados dos objetos são chamados variáveis ou componentes do estado. Variá Variáveis (estado) Métodos (interface) Representaç Representação Simplificada Doughnuts (donuts) donuts) 9 Criando Objetos em Java • Objetos são criados através da declaração new, seguida de um método construtor. Exemplo: Automovel gol = new Automovel(); • Uma classe pode ter construtores especializados ou somente o construtor default (gerado pelo compilador); • Um construtor recebe sempre o mesmo nome da sua classe; • O método construtor gera uma instância do objeto em memória e o seu código é executado imediatamente após a criação do objeto provendo-lhe um estado inicial; 10 Criando Objetos em Java • Valores de parâmetros são passados no momento da criação; • Quando declaramos variáveis de qualquer tipo primitivo (boolean, byte, short, char, int, long, float, ou double) o espaço em memória (na área de dados) é alocado como parte da operação; • A declaração de uma variável referência a um objeto não aloca espaço em memória; • A alocação de memória (no heap) é feita somente quando o objeto é criado. 11 Criando Objetos em Java • Considere o exemplo abaixo: Automovel gol; gol = new Automovel(); • O primeiro comando, a declaração, aloca apenas o espaço suficiente para a referência. O segundo, aloca o espaço para os atributos do objeto gol. • Somente após a criação do objeto é que seus membros (atributos e métodos) podem ser referenciados. 12 Criando Objetos em Java • Alocação e layout No corpo do método, a declaração Automovel gol aloca espaço somente para a referência: gol ???????? O comando new Automovel() aloca e inicializa o espaço: String modelo String cor int ano ? ? 0 13 Criando Objetos em Java • Alocação e layout Finalmente, atribuindo a variável referência o endereço do objeto alocado. gol = new Automovel(); gol 0x01abdfe String modelo String cor int ano ? ? 0 14 Atributos • propriedades associadas a uma classe e seus objetos; • atributos armazenam resultados do processamento feito pelos métodos da classe. instância atributos do objeto atributos da classe (estáticos) • Nome • Cor do pêlo • Idade • Número de patas 15 Métodos • Operações que manipulam o estado do objeto. • Podem fazer parte da interface do objeto ou realizar uma função interna. Classe: Lâmpada Objeto: philips60w Métodos • acender • apagar • indicarVoltagem 16 Referência a Membros de Objetos e Classes Variável < referência.variável> fusca.ano = 69; Método < resultado = referência.método( parâmetros )> fusca.ligaMotor(); • Resgatar o resultado é opcional • Os parâmetros, quando existentes, são posicionais e são tipados • Número de parâmetros é verificado em tempo de compilação 17 Retornando valor em métodos • Na definição do nome do método deve ser indicado se haverá ou não o retorno de valores. – Com retorno de valores: public int quadrado (int y) { return y * y; } – sem retorno de valores: public void setValor (int y) { valor = y; } 18 Membros Estáticos • Acessíveis através de uma instância ou diretamente através da classe • Campos estáticos – Uma única variável cujo o valor é compartilhado por todos os objetos da classe – Comparáveis à variáveis globais • Métodos estáticos – Tarefas que envolvem um conjunto dos objetos – Podem fazer acesso somente a membros estáticos 19 Dados Estáticos • Os dados estáticos relativos a classe são únicos para todos os objetos da classe. Funciona de forma análogo a uma variável global. 20 Métodos Estáticos = métodos da classe • Da mesma forma como há dados que pertencem a uma classe como um todo, também existem métodos estáticos, que, em vez de serem aplicados a um objeto individual, executam operações que afetam a classe inteira • Métodos estáticos não podem acessar os dados de instâncias • Métodos estáticos só podem acessar diretamente campos estáticos 21 Orientação a Objetos em Java 22 Orientação a Objetos Conceitos a serem abordados: • Características: Abstração Herança Mensagem Encapsulamento Polimorfismo Interfaces 23 Abstração • “Extrair tudo o que for essencial e nada mais” (Aaron Walsh) • “A abstração é o processo de filtragem de detalhes sem importância do objeto, para que apenas as características apropriadas que o descrevem permanecam.” (Peter Van Der Linden) • conceito aplicado a criação de software baseado em objetos, partindo do princípio que devemos considerar a essência de cada objeto e não pensar em todos os detalhes de implementação; • semelhante ao que normalmente fazemos na nossa vida em relação aos objetos que nos rodeiam. 24 Abstração Visão do mundo real: • Estamos acostumados a sempre abstrair de objetos aquilo que nos interessa. placa cor númeroChassi aplicarMulta() cor cilindrada velocidadeMax acelerar() 25 Encapsulamento • mecanismo utilizado visando obter segurança, modularidade e autonomia para objetos; • conseguido através da definição de visibilidade privada dos atributos, ganhando-se assim autonomia para definir o que o mundo externo ao objeto poderá visualizar e acessar, normalmente através de métodos públicos. dica: sempre defina os atributos de uma classe como privados, a não ser que tenha uma boa justificativa para não serem. 26 Modificadores de visibilidade public Estes atributos e métodos são sempre acessíveis em todos os métodos de todas as classes. Este é o nível menos rígido de encapsulamento, que equivale a não encapsular. private Estes atributos e métodos são acessíveis somente nos métodos (todos) da própria classe. Este é o nível mais rígido de encapsulamento. protected Estes atributos e métodos são acessíveis no pacote, nos métodos da própria classe e suas subclasses, o que será visto em Herança. <default> Visível no pacote e na classe. 27 Herança • Herança significa ser capaz incorporar os dados e métodos de uma classe previamente definida. Assim como a herança de todas as operações e dados, você pode especializar métodos da classe ancestral e especificar novos operações e dados, para refinar, especializar, substituir ou estender a funcionalidade da classe progenitora. 28 Herança • Você pode fazer sempre com que um objeto mais geral armazene um objeto mais especializado, mas o contrário não é verdadeiro sem uma conversão explícita de tipos. • Todos os cítricos são frutas, mas nem todas as frutas são cítricos! 29 Herança - terminologia • estender = criar uma nova classe que herda todo o conteúdo da classe existente. • superclasse = uma classe progenitora ou “base”. • subclasse = uma classe filha que herda, ou estende, uma superclasse. 30 Hierarquia de Classes Em Java, a classe “Object” é raiz de todas as classes: Object Sobremesa Bolo Torta LuisFilipe 31 Declaração de Atributos Forma [<controleAcesso>] [static] [final] <tipo> <nomeCampo>; • • • • • controle de acesso – define o escopo de visibilidade de um atributo. static – define se o atributo diz respeito à classe (gerado uma única vez) ou ao objeto. final – especifica que o valor do campo é constante. tipo – define a espécie do atributo, que pode ser um tipo primitivo (int, long, double, boolean) ou um objeto (String, etc.). nome do campo – especifica um nome para a propriedade. 32 Atributos - controle de acesso Visibilidade dos membros de uma classe Especificador private protected public <branco> Classe Subclasse Package Mundo 33 this • this é uma palavra-chave usada num método como referência para o objeto corrente. • ela tem o significado de: “o objeto para o qual este trecho de código está sendo executado”. 34 this Refere-se ao objeto corrente quando usado no código de um método não estático Usado com freqüência para passar uma referência do objeto corrente num envio de mensagem para um outro objeto A this B A = this 35 super • super é uma palavra chave usada numa subclasse como referência para membros da superclasse. • ela tem o significado de: “a superclasse da classe corrente”. Observação: normalmente utilizado com métodos. 36 Declarações de Métodos accessLevel static abstract final synchronized returnType public, protected, private, package (default). Declara que o método é da classe, ao invés de ser do objeto. O método não tem implementação e deve ser membro de uma classe abstrata. O método não pode ser sobreposto por uma subclasse. Usado na declaração de threads. Tipo de retorno do método. Se não tem retorno, especificar: void. 37 Mensagem - chamada de método Forma < resultado = referência.método( parâmetros );> resultado = terra.nomeOrbita(); • A captura do retorno é opcional. • Parâmetros possuem tipo. • O número de parâmetros é verificado em tempo de compilação. 38 Polimorfismo • ocorre quando uma classe possui um método com o mesmo nome e assinatura (número, tipo e ordem de parâmetros) de um método na sua superclasse; • toda vez que isto ocorrer, a máquina virtual irá executar o método da classe mais especializada (a subclasse) e não o método da superclasse (sobreposição). Note que esta decisão ocorre em tempo de execução; • polimorfismo ocorre também quando existem dois métodos com mesmo nome, na mesma classe com e assinaturas diferentes. O método será escolhido de acordo com o número de parâmetros, tipo ou valor de retorno esperado. Note que esta decisão ocorre em tempo de compilação. 39 Polimorfismo • Membros com mesmos identificadores substituem membros herdados. • Os membros definidos na superclasse podem ser acessados na subclasse através do qualificador super. • Métodos declarados como final não podem ser redefinidos. • Métodos abstratos devem ser redefinidos ou declarados como abstratos. 40 Polimorfismo -Sobreposição Substituir a implementação de um método herdado por uma implementação própria da subclasse public class Super { ... public void metodo1() { a = b * c; } } public class Sub extends Super { ... public void metodo1() { x = y + z; } } 41 Polimorfismo - Sobreposição class Fruta { int gramas; int calorias_por_grama; Fruta() { gramas=55; calorias_por_grama=0; } Fruta(int g, int c) { sobreposição gramas =g; calorias_por_grama =c; } void descascar () { System.out.println(“Aqui eu descasco frutas”); } } 42 Polimorfismo - Sobreposição class Citros extends Fruta { private int acidoCitrico; public Citros() { super(); this.acidoCitrico=1000; } public Citros(int g, int c, int a) { super(g,c); this.setAcidoCitrico(a); } 43 Polimorfismo - Sobreposição int getAcidoCitrico() { return acidoCitrico; } void setAcidoCitrico(int acido) { this.acidoCitrico=acido; sobreposição } void descascar () { System.out.println( “Aqui eu descasco so citricos”); } } 44 Polimorfismo - Sobrecarga public class Fruta { int gramas; int calorias_por_grama; public Fruta() sobrecarga { gramas=55; calorias_por_grama=0; } public Fruta(int g, int c) { this.gramas =g; this.calorias_por_grama =c; } } 45 Polimorfismo - Sobrecarga public class Feira { public static void main(String args[]) { Fruta melancia = new Fruta(4000, 5); Fruta manga = new Fruta (); manga.gramas=100; manga.calorias_por_grama=100; System.out.println(“manga “+ manga.gramas + “ gs “ + manga.calorias_por_grama); } } 46 Classes Abstratas Modelagem de um conceito abstrato Classe abstrata não pode conter instâncias Conta PessoaFisica PessoaJuridica Poupança 47 Classes Abstratas • Quando a palavra-chave “abstract” aparece no início de uma declaração de classe, significa que a mesma nunca gerará instâncias. • Um método abstrato não tem corpo; o seu propósito é forçar uma subclasse a sobrepô-lo e fornecer uma implementação concreta do método. 48 Classes Abstratas: Exemplo public abstract class VeiculoAquatico { abstract void definirRumo (int n); abstract void definirVelocidade (int n); } class Canoa extends VeiculoAquatico { void definirRumo (int n) { .... } void definirVelocidade (int n) { ... } } 49 Interface • interface pode ser considerada como a forma com que um objeto se apresenta para outros, no que diz respeito aos seus métodos (sua funcionalidade); • é a representação externa de um objeto. 50 Interface Visão do mundo real: • Na nossa vida, estamos acostumados a lidar com objetos através de sua interface, ignorando sua complexidade. 51 Interfaces em Java • Criadas com a palavra reservada interface. • implementadas pelas classes com a palavra reservada implements. • Seus métodos sempre são públicos. • Seus atributos sempre static final. 52 Interface - exemplo public interface ControleRemoto { public void ligaTV(); public void desligaTV(); public void mudaCanalTV(int canalNovo); } public class TV implements ControleRemoto { public void ligaTV() {...} public void desligaTV() {...} public void mudaCanalTV(int canalNovo) {...} } 53 Modificadores de Classes em Java public A classe pode ser usada por qualquer outra classe de qualquer pacote (package). A classe não pode ser instanciada (contém métodos abstratos). final A classe não pode ter subclasse (folha da árvore de classes). extends A classe é uma subclasse da superclasse especificada. abstract implements A classe implementa a(s) interface(s) especificadas. strictfp IEEE754 standard para pontos flutuantes. Padrão: não publica, não abstrata, não final, subclasse de Object e sem 54 implementar nenhuma interface. Pacotes • O java provê um mecanismo de pacotes como uma forma de agrupar classes relacionadas. • Pode-se indicar que as classes de um programa irão compor um determinado pacote, através do comando package. // Classe empregado do departamento financeiro // da companhia ABC package abc.FinanceDept; public class Empregado { ... } 55 Utilização de pacotes • Quando se deseja utilizar as facilidades de um pacote, deve-se usar o comando import para informar ao compilador onde encontrar as classes que serão utilizadas. import abc.FinanceDept.*; public class Gerente extends Empregado { String departamento; Empregado[] subordinados; } 56 Exceções 1 57 O que são Exceções • Exceções são situações excepcionais que impedem o método atual de prosseguir executando normalmente. Se esse método for incapaz de lidar com a exceção, ele delegará o tratamento a outro objeto. • Quando ocorre uma dessas situações excepcionais, um objeto de exceção é criado na pilha de ativação. • O mecanismo de exceção assume o controle e começa a procurar, na pilha de ativação, por um local apropriado para continuar a execução do programa. • Este local é um método com um exception handler apropriado para o tipo de exceção, cuja responsabilidade é a de recuperar a situação. Caso não seja codificado nenhum manipulador de exceções, o manipulador padrão do runtime é executado. 58 Hierarquia das Exceções • Error indica a ocorrência de problemas sérios que a maioria das aplicações não devem tentar capturar. Grande parte de tais erros acontece em condições bastante irregulares. • RuntimeExceptions são exceções tais como divisão por zero ou índice fora do limite. O compilador não exige que essas exceções sejam verificadas, embora se possa fazê-lo. Acontecem em qualquer ponto do programa e tendem a ser numerosas. O custo excede o benefício. • Exceções controladas (checked exceptions) são os demais tipos, desde que não envolvam Error e nem RuntimeException. São verificadas pelo compilador, ou seja, devem obrigatoriamente ser tratadas (requisito “capture ou declare”). 59 Hierarquia das Exceções - Exception Construtores: Exception() Constrói um novo objeto do tipo Excepetion com mensagem de detalhe nula. Exception(String s) Constrói um novo objeto do tipo Exception com a mensagem de detalhe s. Métodos: Todos os métodos são herdados da superclasse Throwable. 60 Hierarquia das Exceções - Exception 61 Capturando Exceções - try • Inclui-se em um bloco try o código que pode gerar uma exceção. • O bloco try é encerrado quando ocorre a exceção. Com isso, seu conteúdo expira e a execução é desviada para o bloco catch correspondente ao tipo de exceção disparada. • Uma vez expirado o bloco que lançou a exceção, o programa não mais poderá retornar a esse ponto de disparo. Java utiliza o modelo de terminação ao invés do modelo de retomada. 62 Capturando Exceções - try • O primeiro passo na construção de um exception handler é colocar os comandos que podem gerar as exceções dentro de um bloco try, da seguinte forma: try { comandos Java } • Um bloco try deve ser seguido por, pelo menos, um bloco catch ou um bloco finally (um ou outro, ou os dois). 63 Capturando Exceções - catch • O objetivo da cláusula catch (tratador de exceção) é o de resolver a condição de exceção e retomar o processamento de forma adequada. • Um tratador não pode acessar variáveis no escopo do bloco try porque esse já expirou. As informações necessárias são passadas no objeto disparado. • Podem existir zero ou “n” blocos do tipo catch. • Cada bloco catch indica, através de um único parâmetro, o tipo de exceção a ser capturado: try { . . . } catch (ThrowableClasse1 e) {. . .} catch (ThrowableClasse2 e) {. . 64.} O bloco finally • O bloco finally é opcional. Se existente, ele deve ser colocado após o último bloco catch. • finally é utilizado quando se quer liberar recurso e deixar o estado dos objetos coerente, independentemente de ter ou não ocorrido uma exceção, evitando a perda de recurso. try { comandos que adquirem recursos do sistema; } catch (UmTipoDeException e) { comandos que manipulam exceções; } finally { comandos que liberam recursos; } 65 O bloco finally • Java garante que o bloco finally (se existir) será executado independentemente de uma exceção ser ou não lançada no bloco try. • Também é garantida a execução do bloco finally caso o bloco try seja terminado via os comandos return, break ou continue. 66 Lançamento de exceção public class MinhaException extends Exception { public MinhaException() { super(“Valores não compatíveis."); } } public int divide(int i, int j) throws MinhaException{ if(i > j) throw new MinhaException(); return (j – i); } 67 FIM 68