Orientação a objetos e linguagem Java PET Computação Vantagens da orientação a objetos • Torna mais rápidas as atividades de programação e manutenção de sistemas de informação; • Tem caráter unificador: trata todas as etapas do desenvolvimento de sistemas e ambientes sob uma única abordagem; Principais Vantagens: • Reusabilidade de código • Escalabilidade de aplicações • Mantenabilidade • Apropriação Orientação a objetos e linguagem Java PET Computação O que é uma classe • Uma classe surge da identificação de características e operações similares em objetos distintos; • A classe então é a representação de um conjunto de objetos que compartilham a mesma estrutura de atributos, operações e relacionamentos; • A classe especifica a estrutura de um objeto sem informar quais serão seus valores; Orientação a objetos e linguagem Java PET Computação O que é uma classe • Num sistema, trabalha-se com instâncias das classes • Uma instância de uma classe é um objeto, onde são carregados os dados pertencentes à instância; • Uma classe pode ter qualquer número de atributos, ou mesmo atributo nenhum. Também pode ter qualquer número de operações, ou mesmo nenhuma. • Exemplos: formulários, receitas Orientação a objetos e linguagem Java PET Computação Identificação de classes • Numa descrição de um software, normalmente classes são substantivos, enquanto verbos são operações candidatas; • Objetivo é modelar somente as coisas importantes para o software; • Cada classe deve corresponder a uma abstração de dados relevante para a aplicação; • Exemplo: o elevador fecha a sua porta e depois move-se para outro andar; Orientação a objetos e linguagem Java PET Computação Alertas • Classes não devem “fazer” alguma coisa, mas sim oferecer um número de serviços ou objetos de certo tipo; • Cuidado ao projetar uma classe que na verdade deveria ser uma rotina de outra classe; • Não começar a se preocupar com herança muito no início do processo de modelagem; Orientação a objetos e linguagem Java PET Computação A classe ideal deve • Estar claramente associada a uma abstração relevante para o sistema; • Ter o nome da classe como um substantivo, que caracteriza adequadamente a abstração; • Representar um conjunto possível de objetos de tempo de execução; • Possuir diversas operações disponíveis para ler as propriedades de uma instância; • Possuir diversas operações disponíveis para mudar o estado de uma instância; Orientação a objetos e linguagem Java PET Computação Categorias de classes • Existem três categorias de classes: • Classe de análise: descreve uma abstração de dados diretamente do domínio do problema; • Classe de projeto: pertencem ao espaço da solução; • Classe de implementação: descreve uma abstração de dados introduzida para as necessidades internas dos algoritmos do software (ex.: LinkedList, Array, Vector, etc...); Orientação a objetos e linguagem Java PET Computação Objetos • Difícil separação entre classes e objetos • Classe serve de modelo para a criação dos objetos • Na classe é definida toda a estrutura e comportamento de um objeto • O tópico classes foi abordado primeiro pois é a partir das classes que objetos são gerados Orientação a objetos e linguagem Java PET Computação Identificação de Objetos • A identificação de um objeto ocorre segundo suas característica (atributos) e comportamentos (métodos); • Na modelagem de sistemas, um objeto é qualquer coisa existente no mundo real; • É possível a existência objetos concretos ou abstaratos, por exemplo: aluno, mesa, disciplina, estoque, avaliação e etc; • Representa a modelagem de conceitos existentes no cotidiano; Orientação a objetos e linguagem Java PET Computação Atributos • As características ou propriedades de um objeto são chamados seus atributos; • Os atributos identificam o estado de um objeto e representam uma abstração do tipo de dados do mesmo; • Conforme aumenta o número de atributos, mais fácil é de identificar este objeto; Orientação a objetos e linguagem Java PET Computação Comportamento • Comportamentos modificam o estado do objeto ou prestam serviços a outros objetos (operações); • Quando o estado de um objeto for alterado externamente, esta alteração DEVE ser realizada através de operações; • Método é a implementação de uma operação; Orientação a objetos e linguagem Java PET Computação Métodos • Os métodos de uma classe manipulam somente as estruturas de dados daquela própria classe, não podendo acessar diretamente dados de outra classe (encapsulamento) ; • O acesso aos dados de outra classe DEVE ser feito através da solicitação de serviços; • Mensagem é a chamada de uma operação de um objeto sobre outro; Orientação a objetos e linguagem Java PET Computação Modelagem de objetos • Realizar uma avaliação da relação entre atributos e métodos • Todo objeto possui limites nítidos com relação ao problema em estudo, portanto, a modelagem deve ser feita dentro de um determinado contexto; • Alerta: excesso de atributos e métodos pode significar divisão de classes; Orientação a objetos e linguagem Java PET Computação Identidade de um objeto • Os objetos se distinguem uns dos outros pela sua própria existência, e não pelos valores de seus atributos; • Os objetos, assim como na vida real ocupam espaço físico, no computador ocupam memória; Orientação a objetos e linguagem Java PET Computação Encapsulamento • A utilização de um sistema orientado a objetos não deve depender de sua implementação interna, e sim somente de sua interface; • O encapsulamento é a propriedade que mantém protegidos os atributos e determinadas operações; • Os atributos de um objeto só podem ser acessados e atualizados pelas operações do próprio objeto; Orientação a objetos e linguagem Java PET Computação Interface • A interface de uma classe serve como camada intermediára entre esta classe e o mundo externo; • Ela protege os usuários de uma classe de quaisquer alterações, as quais têm de ser feitas de modo transparente para o usuário; • As operações (métodos) são a interface da classe, pois é a partir dela que outros objetos se relacionam com a classe; Orientação a objetos e linguagem Java PET Computação Ocultamento • Objetos tem a propriedade de ocultamento de informações • Normalmente, não se permite que os objetos saibam como os outros objetos são implementados; • Os detalhes de implementação são ocultados no próprio objeto; • Exemplo: carro; Orientação a objetos e linguagem Java PET Computação Acesso a informações • 4 tipos de encapsulamento para acessar informações de um objeto: Privado (private) Menor Visibilidade Package/ Default Protegido (protected) Público (public) Maior visibilidade Orientação a objetos e linguagem Java PET Computação Modificando a acessibilidade • Privado: somente o objeto que possui o atributo pode alterar ou acessar este atributo para ler ou alterar o valor que está armazenado nele; • Default/Package: permite que o objeto que contém o atributo mais os outros membros do mesmo pacote* possam acessar o atributo sem restrições; * Pacote: ítem de agrupamento utilizado nas linguagens orientadas a objetos – pode ser visto simplesmente como um grupo de elementos; Orientação a objetos e linguagem Java PET Computação Modificando a acessibilidade • Protegido: o próprio objeto, objetos do mesmo pacote, e ainda seus objetos descendentes podem acessar/modificar o valor do atributo; • Público: o atributo pode ser acessado diretamente por qualquer outro objetosem que se tenha que chamar uma operação no objeto que possui este atributo; Orientação a objetos e linguagem Java PET Computação Acessibilidade dos métodos • Os mesmos tipos de encapsulamento aplicados aos atributos podem ser usados com os métodos → operações internas; • Não é necessário conhecer a implementação de uma operação para poder usá-la; • Possibilita a alteração de como a operação funciona sem que os outros objetos e as chamadas a esta operação tenham que ser alterados; Orientação a objetos e linguagem Java PET Computação Herança • Exemplo: funcionário e pessoa • Atributos possíveis de funcionário? • Nome, endereço, data de nascimento, estado civil, sexo, data de admissão, cargo, salário; • Atributos possíveis de pessoa? • Nome, endereço, data de nascimento, estado civil, sexo; Orientação a objetos e linguagem Java PET Computação Herança Generalização Pessoa Funcionário Especialização Orientação a objetos e linguagem Java PET Computação Herança • Classe mais genérica: Classe mãe ou superclasse; • Classe mais específica: Classe filha ou subclasse; • O mecanismo de herança das linguagens garante que subclasses recebam, automaticamente, atributos e operações da superclasse; Orientação a objetos e linguagem Java PET Computação Herança múltipla • Tipo especial de herança → Java NÃO suporta; • Permite que uma classe possua mais de uma superclasse e herde características de todos seus ancestrais; • Classe com mais de uma superclasse: classe dejunção; Orientação a objetos e linguagem Java PET Computação Herança múltipla • Vantagem: potencial para maior compartilhamento de código • Desvantagem: possibilidade de conflitos de nomes entre as operações herdadas • Consequência: maior complexidade dos sistemas; Orientação a objetos e linguagem Java PET Computação Exemplo herança múltipla Veiculo numPassageiros potencia ano Carro Barco rodas numPortas tamanhoPes registroMarinha Anfibio Orientação a objetos e linguagem Java PET Computação Herança • Contribuição original do paradigma de objetos, que o diferencia da programação com tipos abstratos; • Viabiliza a construção de sistemas a partir de componentes reusáveis; • Facilita diretamente a extensibilidade em um mesmo sistema; Orientação a objetos e linguagem Java PET Computação Herança • Herança não é limitada a apenas um nível; • A árvore de herança (hierarquia de classes) pode ser tão profunda quanto necessário; • Métodos e variáveis internas são herdados por todos os objetos dos níveis para baixo; • Quanto mais para baixo na hierarquia uma classe estiver, mais especializado o seu comportamento; Orientação a objetos e linguagem Java PET Computação Exemplo Herança Empregado Executivo Presidente Gerente Diretor Gerente Treinamento Colaborador Gerente Desenvolvimento Orientação a objetos e linguagem Java PET Computação Exemplo Herança • Interpretação: Se B é subclasse de A, então • Os objetos da classe B suportam todas as operações suportadas pelos objetos da classe A, exceto aquelas redefinidas; • As variáveis de instância de B incluem todas as variáveis de instância de A; Orientação a objetos e linguagem Java PET Computação Precaução • A utilização de herança em linguagens orientadas a objetos pode afetar o encapsulamento de informação; • Surge nova categoria de clientes – as subclasses; • Mudanças na implementação de uma classe poderão comprometer a implementação de suas subclasses; Orientação a objetos e linguagem Java PET Computação Composição • A composição permite que objetos sejam compostos pela agregação de outros objetos ou componentes; • Instâncias (objetos) de uma classe são compostas por instâncias de outras classes • Formação de uma nova classe como um agregado de classes preexistentes; Orientação a objetos e linguagem Java PET Computação Composição Decomposição Composição Exemplo: Carro → objeto composto por outros objetos Orientação a objetos e linguagem Java PET Computação Polimorfismo • É a capacidade de dois ou mais objetos responderem à mesma mensagem, cada um com seu próprio modo • Muitas vezes (nem sempre) o conceito de polimorfismo está ligado à herança. • Exemplo : formas geométricas Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • Supondo que obj é um objeto, podendo ser retangulo, triangulo ou esfera; • Cada objeto tem a propriedade de desenhar a si mesmo obj.desenharRetangulo(); obj.desenharTriangulo(); obj.desenharEsfera(); DESPERDÍCIO! Orientação a objetos e linguagem Java Exemplo polimorfismo • Se quiséssemos desenhar objetos for (...) { if (obj é retângulo) { obj.desenharRetangulo(); } else if (obj é triângulo) { obj.desenharTriangulo(); } else if (obj é esfera) { obj.desenharEsfera(); } } PET Computação Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • Entretanto, podemos criar uma classe chamada forma geométrica: class FormaGeometrica { desenhar(); } • Então, fazemos as classes retângulo, triângulo e esfera herdarem de forma geométrica; Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • Com o polimorfismo, não é mais necessário ter uma operação com nome diferente em cada uma das classes para desenhar; • Existe uma operação na classe pai (FormaGeometrica), e nas classes filhas (as classes Retangulo, Triangulo e Esfera) a operação é implementada de formas diferentes, de forma específica para cada situação; • O objetivo principal do polimorfismo não é a reutilização de código, e sem de simplificar a compreensão do programa; Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • Se uma grande quantidade de objetos compartilham o mesmo coportamento com implementações ligeiramente diferentes, encontrar uma maneira de diminuir o número de linhas de código para invocar este comportamento auxilia imensamente; • No exemplo, o objeto referenciado por obj será polimórfico, pois pode assumir papel de retângulo, triângulo ou esfera; • Desta forma, todos os objetos são tratados como forma geométrica; Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • O exemplo anterior implica a existência de métodos com implementação diferente com o mesmo nome em classes distintas; • Outras formas simples de polimorfismo: • Polimorfismo paramétrico; • Overloading; • Permite a existência de vários métodos com o mesmo nome, definidos na mesma classe, se diferenciando pelo tipo ou número de parâmetros suportados Orientação a objetos e linguagem Java PET Computação Exemplo polimorfismo • Exemplo: classe Empregado Empregado salario; getSalario(); getSalario(horas); Orientação a objetos e linguagem Java PET Computação Java – Simples e orientada a objetos • Projetada pela Sun Microsystems inicialmente para eletrodomésticos em 1991; • Atualmente, uma das linguagens de mais ampla difusão e de mais abrangente uso. • Concebida inicialmente como um subconjunto de C++; • Eliminou construções consideradas complexas ou desnecessárias; • Reduzido conjunto de palavras reservadas e um grande poder de expressão. Orientação a objetos e linguagem Java PET Computação Linguagem robusta • Fortemente tipada; • Ampla verificação de erros e checagem de tipos em tempo de compilação; • Não existem apontadores, e sim referências a objetos criados; • Gerência automática da memória (garbage collection). Orientação a objetos e linguagem Java PET Computação Interpretada e portável • Após a compilação, os fontes Java não são executados diretamente pelo hardware; • Geração de código intermediário que independe da plataforma e interpretação do mesmo pela máquina virtual Java (JVM); • O código intermediário, portanto, não se limita a uma determinada arquitetura; • Basta que exista uma JVM – sem ela não há como executar um programa. .java compilação .class Orientação a objetos e linguagem Java PET Computação Interpretada e portável (cont.) Programa Java abc.java Compilador abc.class Interpretador Interpretador Interpretador PC Windows Linux Sun Solaris Mac Orientação a objetos e linguagem Java PET Computação JVM – Java Virtual Machine • Camada intermediária entre o sistema operacional e as aplicações Java; • Traduz os bytecodes (arquivos .class) em instruções de máquina; • A grande maioria dos sistemas operacionais possui uma implementação da JVM (Windows, Linux, Solaris, Mac, etc.); • “Write once, run anywhere”. Orientação a objetos e linguagem Java PET Computação Aspectos de segurança • Java oferece várias camadas de controles de segurança que protegem contra código malicioso; • Programas Java não podem forjar ponteiros para a memória, nem estourar arrays, nem ler memória que esteja fora das fronteiras de um array ou string; • Impede qualquer acesso direto à memória; • Bytecodes de códigos de origem desconhecida que são carregados são verificados; • O código de origem desconhecida pode rodar, mas é mantido isolado, para não causar danos – “caixa de areia”. Orientação a objetos e linguagem Java PET Computação Just in Time (JIT) Compilers • Traduzem Bytecodes Java para instruções nativas da máquina; • Evitam a reinterpretação de blocos de código Java; • Úteis se o mesmo bloco de código é executado mais de uma vez; • Otimizam a execução de blocos de código repetitivo, como laços; • Aumentam o desempenho de programas. Orientação a objetos e linguagem Java PET Computação JDK – Java Development Kit • Compilador Java (javac); • Visualizador de applets (appletviewer); • Interpretador de bytecodes (JVM); • Gerador de documentação (javadoc); • Debugger (jdb); • Ferramenta de gerência de archives Java (jar); • Gerador de cabeçalhos e de stub para chamada de métodos nativos (javah); • Disassembler (javap). Orientação a objetos e linguagem Java PET Computação Criando a primeira aplicação • Crie um arquivo de nome Hello.java em um editor de texto contendo: public class Hello { public static void main (String[ ] args) { System.out.println ("Hello world!"); } } Orientação a objetos e linguagem Java PET Computação Criando a primeira aplicação (cont.) • Compile o arquivo fonte usando o compilador Java (javac): javac Hello.java • O arquivo Hello.class, contendo os bytecodes Java, será criado pelo compilador no mesmo diretório do arquivo fonte; • Execute a aplicação usando a JVM: java Hello.java Orientação a objetos e linguagem Java PET Computação Importando pacotes • Um pacote é um conjunto de classes relacionadas: import java.sql.*; import java.io.*; • No caso acima, importamos todas as classes de um pacote; • Pode-se importar apenas uma classe específica conforme indicado abaixo: Import javax.swing.JFrame; Orientação a objetos e linguagem Java PET Computação Comentários no código /** documentação */ • O compilador ignora esse tipo de comentário. O utilitário javadoc, no entanto, utiliza esses comentários para gerar a documentação automática do programa; /* texto /* • O compilador ignora todo o texto contido entre as marcações; // linha • O compilador ignora todo o texto contido entre a marcação e o final da linha. Orientação a objetos e linguagem Java PET Computação Definição de classes • Uma classe é uma coleção de dados e de métodos que manipulam esses dados; • Os dados referentes a uma classe são armazenados em variáveis e as operações sobre eles são implementadas através de métodos; • Métodos = construções semelhantes a funções e procedimentos. Orientação a objetos e linguagem Java Definição de classes (cont.) public class Aluno { // Declaração da classe // Variáveis da instância (do objeto) private String nome; private String matricula; private int semestre; // Construtores public Aluno (String n, String m, int s) { this.nome = n; this.matricula = m; this.semestre = s; } // Métodos de instância (do objeto) public String getNome () { return nome; } public void setNome (String n) { nome = n; } } PET Computação Orientação a objetos e linguagem Java PET Computação Definição de variáveis e constantes • Definir antes de usar; • Conselho: definir as variáveis próximo de onde elas forem utilizadas; • Variáveis definidas dentro de um bloco de código têm a existência limitada ao bloco; • Não são permitidas conversões implícitas de tipo. Orientação a objetos e linguagem Java PET Computação Tipos primitivos • O tamanho do tipo em bytes faz parte da especificação da linguagem. Tipo Tamanho Variação long 8 bytes ±9.223.372.036.854.775.808 int 4 bytes ±2.147.483.648 short 2 bytes ±32768 byte 1 byte -128 a +127 double 8 bytes ±1,79769313486231570 E+308 float 4 bytes ±4,40282347 E+38 char 2 bytes caracteres UNICODE boolean 1 bit true, false Orientação a objetos e linguagem Java PET Computação Conversão de tipos • Java permite conversão entre valores inteiros e valores reais; • Conversão de ampliação: valor é convertido para um tipo mais amplo Ex: int float • Conversão de redução: valor é convertido para outro com menos bits Ex: double int • Cuidado: informação pode ser perdida! Ex: converter o int 13000 para um byte (compilador reclama) • Conversão explícita (cast): é feita colocando-se o nome do tipo pretendido entre parênteses antes da variável a ser convertida. Orientação a objetos e linguagem Java PET Computação Conversão de tipos - cast int i = 13; byte b = (byte) i; // casting de int para byte i = (int) 13.456 // casting de double para int • Em conversões de números reais para inteiros, a parte fracionária do número real é truncada; • O tipo char funciona como um tipo inteiro a maior parte das vezes, podendo, portanto, ser usado em qualquer lugar em que se espere um int ou long. Orientação a objetos e linguagem Java PET Computação Tipos de referência • Classes: Cada classe define um novo tipo de dado a ser manipulado. • Vetores: Um vetor representa uma lista de valores de um determinado tipo. Ex: int[ ] vetor de inteiros; aluno[ ] vetor de objetos da classe aluno; aluno[ ][ ] vetor de vetores de aluno. Orientação a objetos e linguagem Java PET Computação Tipos de referência (cont.) • Tipos definidos pelo programador são chamados tipos de referência; • Classes e vetores são tipos de dados diferentes dos tipos primitivos – são conhecidos como tipos compostos. int [ ] vet = {1, 2, 3}; // define vetor de inteiros String str = new String (“Java”); // define a classe String // como objeto Orientação a objetos e linguagem Java PET Computação Sumário de operadores Operadores Tipo de operando Operação executada . objeto, membro acesso a membro do objeto [ ] vetor, inteiro acesso a elemento do vetor ( args ) método, lista de args invocação do método ++ -- variável incremento, decremento + número mais, menos ~ inteiro complemento (NOT bit a bit) ! booleano NOT booleano new classe criação de objetos - Orientação a objetos e linguagem Java PET Computação Sumário de operadores (cont.) Operadores Tipo de operando Operação executada ( type ) tipo, qualquer coisa cast (conversão explícita) *, /, % número, número multiplicação, divisão e resto + string, qualquer coisa concatenação < <= > >= número, número menor/maior == primitivo, primitivo igual (o mesmo valor) != primitivo, primitivo não igual (valores diferentes) = variável, valor atribuição *=, /=, %=, +=. -=, ... variável, valor Atribuição geminada com oper. Orientação a objetos e linguagem Java PET Computação Exercícios • Crie uma classe Teste para exercitar tipos básicos e operadores conforme a seguir: public class Teste { public static void main (String[] args) { } } • 1) Declare três variáveis inteiras (int): valor1, res1, res2. Inicialize-as com os seguintes valores: 1000, pós-incremento de valor 1 e pré decremento de valor 1. Mostrar os valores das variáveis utilizando o comando System.out.println ( ); • 2) Declare uma variável do tipo float chamada valor2. Inicialize-a com a variável valor1. Acumule o valor de valor1 novamente em valor2. Mostre o valor da variável valor2; Orientação a objetos e linguagem Java PET Computação Exercícios (cont.) • 3) Declare uma variável do tipo double chamada valor3 e inicialize-a com a variável valor2 multiplicada por 3. Mostre o valor de valor3; • 4) Declare uma variável double chamada res3 que recebe a soma das variáveis valor1, valor2 e valor3. A seguir mostre o valor de resultado3; • Após a realização de todos os passos, compile e execute. Orientação a objetos e linguagem Java PET Computação Comando if/else • if (expressão) { comandos } else { comandos } if (user == null) { user = “administrador”; } else user = nome; • Os parênteses que envolvem a expressão são exigidos pela sintaxe; • A palavra else é opcional: Neste caso, a expressão condicional é avaliada e, se for verdadeira, o comando que segue o if é executado e o comando após o else é pulado; caso contrário, o comando após o else é executado. Orientação a objetos e linguagem Java PET Computação Comando switch • Provoca um desvio no fluxo de execução; • Alternativa ao uso de vários comandos if; switch (n) { case 1: { comandos } break; // pára aqui case 2: { comandos } break; // pára aqui default: { comandos} break; // pára aqui } • A expressão associada com o comando deve ser byte, char, short ou int. Valores booleanos ou reais não são suportaos, nem o tipo long, apesar de ser um tipo inteiro; • O comando só pode ter uma cláusula default. Orientação a objetos e linguagem Java PET Computação Comando while • Permite executar um bloco de código repetidas vezes: while (expressão) { comandos } • O comando começa por avaliar a expressão. Se falso, o fluxo de execução vai para o próximo comando. Se verdadeiro, o corpo do laço é executado e a expressão é reavaliada. • Pode-se criar um laço infinito usando while (true). Orientação a objetos e linguagem Java PET Computação Comando do • Similar ao while, porém o teste da expressão é feito no final do laço; • O corpo do laço é executado pelo menos uma vez: do { comandos } while (expressão); • O laço requer tanto a palavra do para marcar seu início, quanto a palavra while para marcar o seu término e introduzir a expressão condicional; • Na prática, o do é menos usado. Orientação a objetos e linguagem Java PET Computação Comando for • Elimina a necessidade de um contador; • Os passos de inicialização, teste e atualização constituem as principais manipulações feitas sobre as variáveis do laço e integram a sintaxe do for: for (declaração e inicialização ; teste ; atualização) comando • A expressão de inicialização é tipicamente uma expressão de atribuição, enquanto a expressão de atualização é usualmente um incremento/decremento; Orientação a objetos e linguagem Java PET Computação Comando for (cont.) for (int i = 0; i < 10; i++) { System.out.println (i); } • O exemplo acima imprime os números de 0 a 9, sem necessidade de atualizar a variável dentro do laço; • Todas as informações são colocadas em uma única linha, facilitando a compreensão; • Tanto a expressão de inicialização quanto a de atualização podem conter mais de uma variável, separadas por vírgulas: for (int i = 0, j = 10; i < 10; i++, j--) { soma += i * j; } Orientação a objetos e linguagem Java PET Computação Comando for (cont.) • As expressões de inicialização, teste e atualização do comando são todas opcionais, porém o caractere de ponto e vírgula que as separa é obrigatório. Se a expressão do teste é omitida, presume-se que ela é sempre verdadeira: for ( ; ; ) // for infinito Orientação a objetos e linguagem Java PET Computação Comando break • Utilizado para transferir o controle para fora do corpo do comando de laço ou switch mais próximo; • Portanto, é usado para sair de qualquer tipo de laço; • Muito útil para abortar um laço quando algum evento ocorre durante a execução de seu corpo; Orientação a objetos e linguagem Java Comando break (cont.) • O seguinte trecho utiliza o break junto ao while: int i = 0; int total = 0; while (i < 100) { total +=i; // total = total + i; if (total >= 200) { break; } System.out.println (i); i++; } } PET Computação Orientação a objetos e linguagem Java PET Computação Comando break (cont.) • O break é também utilizado junto ao switch, para sair do corpo do comando: switch (resposta) { case 's': case 'S': System.out.println ("A resposta é sim."); break; case 'n': case 'N': System.out.println ("A resposta é não."); break; default: System.out.println ("Resposta inválida.") } Orientação a objetos e linguagem Java PET Computação Comando continue • Usado para transferir o controle para o fim do corpo do laço, antes da reavaliação da expressão de teste; • Causa a interrupção da iteração do laço corrente e o pulo para a próxima iteração do laço; • No trecho abaixo, o continue é usado para interromper a execução do resto do corpo do comando forem todos os números pares: int total = 0; for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; } total += i; } System.out.println (total); Orientação a objetos e linguagem Java PET Computação Comando return • Mecanismo pelo qual os métodos retornam os valores requeridos; • Um return aceita um valor simples ou uma expressão que deve ser compatível com o tipo de retorno do método em que está inserido: public class Aluno { . . . public String getNome (Aluno x) { return x.nome; } public void setNome (Aluno x, String n) { x.nome = n; return; // sintaxe para retorno void não é necessária } } Orientação a objetos e linguagem Java PET Computação Comando return (cont.) • Quando um return é encontrado, o fluxo de execução abandona o método imediatamente, ignorando quaisquer comandos que existam entre o comando de retorno e o final do método; • Se um método for void, o return não aceitará nenhum valor de retorno ou expressão. Orientação a objetos e linguagem Java PET Computação Classes • Uma classe encapsula todos os dados e comportamentos que definem um objeto; • Contém atributos que são atribuídos a todos os novos objetos desta classe; • Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos; • Pode conter também métodos que especificam as ações que um objeto pode realizar; • Java utiliza pacotes para agrupar classes que estão logicamente relacionadas; • Pacotes consistem de classes localizadas num mesmo diretório. Orientação a objetos e linguagem Java PET Computação Pacotes • É um recipiente para classes que estão logicamente relacionadas, por pertencerem a uma mesma aplicação ou por terem funções afins; • Ajudam a segmentar partes de uma aplicação complexa em pedaços gerenciáveis; • A JVM usa uma construção conhecida como espaço de nomes para gerenciar nomes de identificadores dentro de um programa. É uma porção de memória especialmente alocada para tal: Ex: se o JDK ou outra classe usa um identificador chamado count, um programa não poderá definir uma variável com esse nome. Orientação a objetos e linguagem Java PET Computação Modificadores de acesso • Java provê controle de acesso às classes através de modificadores de acesso: - public – o menos restritivo de todos os modificadores de acesso. Uma classe declarada como public pode ser vista e usada por todas as demais classes; - protected – o próximo nível de controle. Uma classe definida como protected pode ser vista por qualquer uma de suas subclasses ou por qualquer outra classe definida no mesmo pacote; - private – o mais restritivo modificador. Uma classe private não pode ser acessada por nenhuma outra classe; • Se um modificador de acesso não é especificado, a classe pode ser vista e usada por qualquer classe dentro do mesmo pacote. Orientação a objetos e linguagem Java PET Computação Classes e objetos • Uma classe é um gabarito para a construção de objetos dessa classe. Um objeto é uma instância de uma classe; • Cada objeto de uma classe tem a mesma estrutura de dados e operações. Porém, os valores mantidos nesta estrutura de dados são únicos para cada objeto, e são chamados variáveis de instância. Orientação a objetos e linguagem Java PET Computação Criação de um objeto • Objetos são criados usando o operador new; • new cria uma instância de uma classe e retorna uma referência para o novo objeto criado: Aluno a1 = new Aluno (“José”); Aluno a2; a2 = new Aluno (“José”); • O operador new retorna uma referência ao novo objeto e não o próprio objeto. Orientação a objetos e linguagem Java PET Computação Criação de um objeto (cont.) • O operador new faz três coisas: • Aloca memória para o novo objeto. O operador sabe quanta memória é necessária olhando a definição da classe; • Utiliza o construtor da classe para inicializar as variáveis de instância do novo objeto; • Retorna uma referência para o objeto criado. Para a referência ao objeto no futuro, ela deve ser guardada em uma variável. Orientação a objetos e linguagem Java PET Computação Criação de um objeto (cont.) Aluno a1 = null; • Foi declarada uma variável com uma referência chamada null. Isto indica que a variável de referência a1 não se refere a nenhum objeto ainda; • null pode ser usado com o operador de igualdade para verificar se uma variável de referência já tem uma referência a um objeto: if (a1 == null) { . . . } • Pode-se atribuir null a um objeto quando seu uso não for mais necessário. Se nenhuma referência for feita a ele após isso, esse será recolhido pelo garbage collector. Orientação a objetos e linguagem Java PET Computação Atribuindo referências • Quando uma variável de referência um objeto é declarada ela recebe o valor null. Para usá-la é necessário inicializá-la: Aluno a1 = new Aluno (“José”); Aluno a2 = a1; • Apenas um objeto foi criado. Atribuindo uma referência para um objeto a outra referência, tem-se duas referências para o mesmo objeto, e não uma cópia do objeto. Orientação a objetos e linguagem Java Variáveis de instância • Devem ser declaradas dentro da definição da classe; • Para acessar variáveis de instância: public class Aluno { public String nome; private String matricula; . . . } PET Computação Orientação a objetos e linguagem Java PET Computação Variáveis de instância (cont.) Aluno a1 = new Aluno (); a1.nome = "José"; if (a1.nome.equals("José")) { a1.matricula = "123456"; // erro de compilação } • Essa sintaxe somente é permitida se a variável de instância tiver sido declarada como public. Orientação a objetos e linguagem Java PET Computação Métodos • Na definição de uma classe em um programa orientado por objetos, o comportamento da mesma é implementado nos seus métodos; • Um método em Java é equivalente a uma função ou procedimento em outras linguagens; • Os elementos integrantes de um método são: • Modificador: - Um método declarado como public poderá ser chamado a partir de qualquer classe do programa; - Se o método é declarado como private, ele somente poderá ser invocado por outros métodos da mesma classe; • Tipo de retorno: - Primitivo, referência para um objeto e pode não haver retorno (void). Orientação a objetos e linguagem Java Métodos (cont.) • Lista de parâmetros, podendo não haver nenhum. public class Aluno { . . . // mod ret nome (argumentos) public void SetNota (float n) { nota = n; } } PET Computação Orientação a objetos e linguagem Java PET Computação Métodos get/set • No exemplo, são definidos dois métodos de instância para a classe Aluno: setNome e getNome. Cria-se um objeto Aluno e atribui-se a referência para este objeto à variável a1. Através de a1, o método getNome é usado para comparar o produto com o literal “José”. • Caso se fizesse necessário alterar o nome do aluno, bastaria utilizar o método setNome passando como parâmetro o novo nome desejado. • COMPLETAR Orientação a objetos e linguagem Java PET Computação Encapsulamento • Uma classe bem definida deve separar a sua interface pública da implementação interna. Logo, as variáveis de instância da classe devem ser declaradas como private; • Usuários da classe devem invocar os métodos da classe para acessar ou alterar o estado de um objeto; • Encapsular corretamente traz como benefício não ser necessário alterar nenhuma linha de código além daquelas referentes à própria implementação da classe. Implementando Classes PET Computação Implementando Classes Implementando Classes PET Computação Sobrecarga de Métodos • Utilizamos esta ténica para que dois ou mais métodos tenham o mesmo nome, desde que possuam assinaturas diferentes. • Assinatura é composta por seu nome, juntamente com o número e tipo dos parâmetros. • O tipo de retorno não fará parte da assinatura, portanto não poderá diferenciar métodos sobrecarregados. • Ao chamar um método sobrecarregado, o compilador escolherá o método correto a ser chamado, analisando os parâmetros passados na chamada e comparando esses parâmetros com os esperados por cada um dos métodos com aquele nome na definição da classe. Implementando Classes PET Computação Sobrecarga de Métodos (cont) • Exemplo de Método sobrecarregado: public class Curso{ private String nomeCurso ; public void setNome(){ nomeCurso = “Sem nome”; } public void setNome(String nome){ nomeCurso= nome; } } Implementando Classes PET Computação Construtores • São métodos especiais chamados quando um objeto é criado; • Sempre tem o mesmo nome da classe; • Não possui nenhum tipo de retorno; • Pode esperar nenhum, um ou vários parâmetros; • Pode existir mais de um contrutor por classe, cada um com uma assinatura diferente. Implementando Classes PET Computação Construtores (cont) • Exemplo de construção de um construtor: public class Curso{ public String nomeCurso; public int codigoCurso; public Curso(){ } public Curso(String nome,int codigo){ nomeCurso=nome; codigoCurso=codigo; } } Implementando Classes PET Computação Construtores (cont) • Exemplo de invocação de construtor: // Chama o construtor sem parâmetros Curso() Curso c1 = new Curso(); // Chama o construtor Curso(String nome,int codigo) Curso c2 = new Curso( “ Word ”,12 ); Curso c2 = new Curso( “ Excel ”,15 ); Implementando Classes PET Computação Referência this • O parâmetro this é uma referência implícita para objeto chamado, não sendo necessário na maioria dos casos. • Usado dentro do método de instância para se referir ao objeto corrente. • Exemplo: public class Curso{ public String nomeCurso; public Curso(String nome){ this.nome=nome; } } Implementando Classes PET Computação Referência super • Usamos em classe que possui um ancestral. • Permite que seja acessado métodos da superclasse sobrescritos pela subclasse. • Exemplo: public class Bola{ public float dimensao; public Bola(float dimensao){ this.dimensao=dimensao; } } public class BolaColorida{ public String cor; public BolaColorida(float dimensao,String cor ){ this.cor=cor; super(dimensao); } } Implementando Classes PET Computação Variáveis de Classe • As variáveis de classe também chamadas de variável estática(variável static), são aquelas variáveis que pertence a todas instâncias de uma classe. • A alteração desta variável por qualquer uma das instâncias fará com que todas elas sejam afetadas pela alteração. • Exemplo: public class Curso{ private static int quantidadeCurso; // var. de classe public String nomeCurso; // var. de instância //.. } Implementando Classes PET Computação Variáveis de Classe(cont) • Como as variáveis de instância, as variáveis de classe também pode ser inicializada com valores diferentes do valor default. • NÃO pode utilizar construtores para inicializar variáveis de classe, tendo em vista que construtores são utilizados para construir instâncias. • Para inicializar também podemor utilizar o inicializador estático como mostra o exemplo abaixo: public class Curso{ private static int quantidadeCurso; // var. de classe static{ Date dataAtual = new Date ( ); quantidadeCurso = getQuantidade(dataAtual) } } Implementando Classes PET Computação Métodos de Classe • Também conhecido como estático (método static), é um método que pertence a classe e é compartilhado por todas as instâncias desta classe. • Um método de classe só pode acessar variáveis de classe e invocar métodos de classe. • Exemplos: public class Curso{ private static int quantidadeCurso; // var. de classe public static void setQuantidadeCurso(int quant){ Curso.quantidadeCurso=quant; } } //.. Curso.setQuantidadeCurso(20); // ou Curso c1 = new Curso ( ); c1.setQuantidadeCurso(20); Implementando Classes PET Computação Variáveis final • Uma variável final é uma constante, não pode ser modificada, deve ser inicializada e é geralmente pública (public), permitindo o acesso externo. • É uma técnica útil para evitar que programadores inadvertidamente ou maliciosamente redefinam métodos essenciais que devem funcionar de uma maneira esperada. • Exemplo: public class Curso{ private final static int maxDeCurso = 20; //.. } Implementando Classes PET Computação Método finalize • Java não suporta destrutores, já que destrutores são normalmente empregado para liberar recursos mantidos pelo objeto, tais como memória secundária alocada, arquivos abertos e etc. A fim de permitir que um objeto libere outro recurso que não seja memória (pois esta é automaticamente gerenciada pelo Java), utilizamos o método finalize(). • O método finalize() é chamado automaticamente quando uma objeto é coletado pelo sistema coletor de lixo. • Exemplo: public class Curso{ public void finalize ( ) { // Libera todos os recursos alocados pela classe } } Strings e Vetores PET Computação Strings e Vetores Strings e Vetores PET Computação Strings • Assim como na maioria das liguagens de programação, strings são bastante usadas em Java. Java possui em sua API uma classe String para facilitar a manipulação de caracteres. • Alguns construtores da classe String: • String ( ) – cria uma string vazia com o valor ““. • String(String str) – cria uma cópia do objeto String referenciado por str. • String(char [ ] array)-cria uma string a partir dos caracteres presentes no vetor array; Strings e Vetores PET Computação Criando Strings • A maneira mais fácil de criar strings é a partir de uma constante colocada entre aspas. Ex.: String nome = “Joana”; • Pode ser utilizado o operador (+) para concatenar duas strings. Ex.: String nome = “Joana”+” “+”Freitas”; Strings e Vetores PET Computação Concatenando Strings • Para realizar a concatenação de duas string Java usa o operador (+) e o método concat (). Ex.: String nome = “Joana”+”Freitas” ; nome = “Joana”.concat(“Freitas”) ; • O tipo primitivo é implicitamente convertido para String na concatenação. Ex.: int posicao = 1; String colocacao = posicao+“ º lugar”; Strings e Vetores PET Computação Executando Operações em Objetos Strings • Método length () – retorna o número de caractees de uma string. • Método charAt () – retorna o caracter da posição especificado como argumento do método. • Método substring () – retorna uma substring especificada pelos dois argumentos fornecidos. • Método toUpperCase () – retorna uma nova string com todos caracteres em maiúsculo. • Método toLowerCase () – retorna uma nova string com todos caracteres em minúsculo. • Método trim () – retorna uma nova string contendo a cópia do original com os espaços em branco removidos tanto do início quanto do fim. Strings e Vetores PET Computação Executando Operações em Objetos Strings (cont) • Exemplo dos métodos : //--- método length( ) String nome = “Fernanda” int tam = s.length( ); // tam = 8; //--- método charAt( ) char c = nome.charAt ( 0 ); // c = F //--- método substring( ) // 01234567 String nome = “Fernanda”; String sub = s.substring (3,6) ; // sub = “nan” String sub = s.substring (3) ; // sub = “nanda” Strings e Vetores PET Computação Executando Operações em Objetos Strings (cont) • Exemplo dos métodos : //--- métodos toLowerCase ( ) String N = nome.toUpperCase ( ); // N=“FERNANDA” //--- métodos toUpperCase ( ) String n = nome.toLowerCase ( ); // n=“fernanda” //--- método trim ( ) String curso = “ Curso de Java “ ; String tr = curso.trim( ); // tr = “Curso de Java” Strings e Vetores PET Computação Comparando duas Strings • O método equals() pode ser utilizado para comparar duas strings. Quando as duas strings especificadas contêm o mesmo conteúdo, o método retorna o valor true. Caso uma string seja null será retornado false. • Importante: • Não utilize o operador == para comparar objetos Strings ! • O método equals diferencia maiúsculas de minúsculas, para isso utilizamos o método equalsIgnoreCase()! Ex.: String fruta = “maça”; boolean flag = fruta.equals (“Maça”); // flag = false; flag = fruta.equalsIgnoreCase (“Maça”); // flag = true; Strings e Vetores PET Computação Produzindo Strings a partir de Tipos Primitivos • A classe String fornece um método estático valueOf() que retorna uma string representando o tipo primitivo. Existe uma versão de valueOf() para cada tipo primitivo. • Exemplos: String nove = String.valueof( 9 ); // chama valueOf ( int ) “9” String doispontodois = String.valueof(2.2) // chama valueOf ( int ) “2.2” Strings e Vetores PET Computação Produzindo Tipos Primitivos a partir de Strings • Para converte um valor String para int e float é necessário utilizarmos um método de conversão. •Exemplos: String valor_int = “12” ; String valor_float =“1.4” ; int v1 = Integer.parseInt (valor_int); float v2 = Float.parseInt (valor_float); Strings e Vetores PET Computação Concatenando Strings utilizando StringBuffer • Um jeito eficiente de concatenar Strings é utilizando um objeto StringBuffer e seu método append( ); // Utilizando o operador + String texto = “Esta é a primeira linha do texto\n”; texto = texto + “Ganhando outra linha\n”; // Utilizando StringBuffer e append ( ); StringBuffer texto = new StringBuffer (“Esta é a primeira linha do texto\n”); Texto.append( “Ganhando outra linha\n” ); Strings e Vetores PET Computação Vetores • Podemos considerar um vetor como uma coleção de variáveis do mesmo tipo. • Cada elemento pode armazenar um único tipo e tem que ter um comprimento fixo quando criado. •Exemplo de declaração de vetores de tipos primitivos: // Sintaxe – tipo [ ] nome int [ ] numeros; // Sintaxe – tipo nome [ ] int numeros [ ]; Strings e Vetores PET Computação Vetores (cont.) • Importante: • Todos os elementos de um novo vetor tipo recebem automaticamente o valor default para o tipo: • Elementos char recebem ‘\u0000’; byte,short,int recebem 0; float e double recebem 0.0; boolean recebem false; • Exemplo de declaração de vetores: // Declarando um array do tipo int com comprimento = 5 int [ ] numeros = new int [ 4 ]; Strings e Vetores PET Computação Vetores (cont.) • Exemplos de construções válidas: // Declarando um array do tipo int com comprimento = 5 int [ ] numeros = new int [ 4 ]; // Declarando um array em tempo de execução int [ ] valores [ ]; int numeros = 10 ; // Números de alunos Valores = new int [numeros]; •Exemplos de construções inválidas: // O tamanho não faz parte da inicialização int [6] numeros; // variável não foi devidamente inicializada int n; int [ ] valores = new int [n] ; Strings e Vetores PET Computação Inicializando Objetos de Vetores e propriedade length • Existe duas maneiras de inicializar um vetor: Criar um inicializador ao criá-lo ou atribuir um valor para cada elemento do vetor. // Inicializa elemento por elemento int [ ] numeros = new int [5]; for ( int i =0; i < numeros.length; i++ ) numeros[ i ] = 0; // Inicializadores String [ ] nomes = {“Raquel”,”Josiane”}; • Propriedade length é um atributo que contém o número de elementos do vetor, eliminando a necessidade de armazenar o tamanho do vetor em outra variável. Strings e Vetores PET Computação Vetores multidimensionais • Java suporta vetores multidimensionais, ou seja, um vetor de vetores. •Exemplos de declaração: // matriz [indiceLinha] [indiceColuna]; int [ ] [ ] numeros = new int [ 4 ] [ 4 ] ; // Exemplo de matriz com 5 linha e número de colunas diferentes // A primeira linha terá apenas 1 elemento, a segunda 2 elementos... int [ ] [ ] matriz = new int [ 5 ] [ ] ; for ( int i = 0 ; i <= matriz.length ; i++ ) matriz [ i ] = new int [ i+1 ]; Tratamento de Exceções PET Computação Tratamento de Exceções Tratamento de Exceções PET Computação Introdução • Um evento que ocorre durante a execução de um programa que interrompe o fluxo normal das instruções é chamado de exceção. Muitos erros podem causar excessões. • Uma exceção que ocorre dentro de um método Java, o método cria um objeto Exception, no qual contém informações sobre a exceção, tais como seu tipo e o estado do programa quando ocorreu o erro. • O ambiente de execução é responsável por encontrar um código que manipule o erro, após o método levantar uma exceção. • Vantagens na utilização de exceções: Separação de código, Propagação de Erros, Agrupar Tipos de Erros e Exceções não são ignoradas. Tratamento de Exceções PET Computação Separação de Código • No modo de programação tradicional para detectar os potenciais erros para esta função, cada erro deve ser testado e atribuído para um código de erro, acrescentando uma grande quantidade de código adicional. • Exemplo de código para tratamento de abertura de arquivos com retorno de valor, na programação tradicional. int leituraArquivo { int codErro = 0 ; abre arquivo; if ( erroAberturaArquivo ) codErro = -1; else { le arquivo; if ( erroLeituraArquivo ) codErro = -2; fecha arquivo; if ( erroFechamentoArquivo ) codErro= -3; } return codErro; } Tratamento de Exceções Separação de Código (cont.) • A mesma função exemplo anterior ficaria deste jeito. leituraArquivo { try { abre arquivo; le arquivo; fecha arquivo; } catch (erroAberturaArquivo) { Manipula erro; } catch (erroLeituraArquivo) { Manipula erro; } catch (erroFechamentoArquivo) { Manipula erro; } } PET Computação Tratamento de Exceções PET Computação Propagação de Erros • Esta vantagem na utilização de exceções é a habilidade de propagar a informação do erro através dos métodos da pilha de chamadas. • A exceção Java é enviada para o manipulador apropriado, sem a necessidade de comando if em cada nível para transmitir o erro acima na pilha de chamadas. Tratamento de Exceções PET Computação Agrupar tipos de Erros • As exceções geralmente podem se enquadrar em categorias ou grupos. Por exemplo erros manipulando vetores e E/S, podem ser facilmente imaginados como um grupo de exceções, cada exceção representando um dos tipos de erros. • Importante: Manipuladores de exceções que são muito genéricos podem tornar o código mais propenso a erros por capturar e tratar exceções que não foram previstas, não sendo corretamente tratada dentro do manipulador. Tratamento de Exceções PET Computação Exceções não são ignoradas • Quando um método gera uma exceção, ela não pode ser ignorada, ela precisa ser capturada e manipulada em algum local. Tratamento de Exceções PET Computação Manipulando Exceções • A classe Throwable é uma superclasse de todos erros que possui duas subclasses: Error e Exception. • Subclasse Error : Erros são extensões da classe Error. Os erros não devem ser capturados e geralmente causarão o término do programa. Exemplo : Falta de memória durante a execução. • Exceções Não Verificadas : São extensões da classe RunTimeException, e são as que ocorrem dentro do ambiente de execução java (JVM). Exemplo : Tentar acessar um objeto utilizando uma referência nula. Tratamento de Exceções PET Computação Tratando Exceções • Quando um método levantar uma exceção, o programador pode capturar a exceção e tratá-la, capturar a exceção e levantar uma exceção diferente (que será manipulada em outro local) ou deixar a exceção passar através do método (algum manipulador deve então capturá-la em outro local). • Podemos identificar se um método pode levantar alguma exceção na documentação JDK. Tratamento de Exceções PET Computação Manipulando Exceções • Para manipularmos exceções em Java utilizamos os comando try/catch/ finally. • Comando try : Delimita o bloco aonde a chamada de métodos pode levantar exceções. • Comando catch : É colocado após o bloco try e serve para tratar os vários tipos de exceções. Pode ser definido zero ou mais blocos catch. • Comando finally : O bloco delimitado pelo comando finally serve para finalização do método antes que o controle seja transferido para outra parte do programa. Exemplo : Fechamento dos arquivos. Tratamento de Exceções PET Computação Blocos para tratamento de exceções try { … } catch ( ExceptionType object ) { … } finally { … } Tratamento de Exceções PET Computação Exemplo Prático • O exemplo a seguir apresentará um exemplo de uma classe convertNumero, que tenta converter a string “palavra” para número. public class convertNumero { public static void main ( String argv [ ] ) { int num; try { // String contida no argv [ 0 ] é “ palavra ” num = Integer.parseInt (argv [ 0] ); } catch ( NumberFormatException e ) { System.out.println ( “Não foi possível converter a string para inteiro. Verifique a string fornecida ” ); } catch ( NumberArrayOutBoundsException e ) { System.out.println (“ Nâo foi fornecido argumento ”); } finally { } } Reutilização e Abstração PET Computação Reutilização e Abstração Reutilização e Abstração PET Computação Especificando Herança em Java • Usamos a palavra reservada extends para especificar herança. • Abaixo segue o exemplo da classe Bar e sua subclasse BarNoturno. public class Bar { // Definição da classe Bar } public class BarNoturno extends Produto { // Métodos e atributos adicionais para distinguir // dos outros tipos de Bar } Reutilização e Abstração PET Computação Objetos de Subclasses • Uma superclasse define as variáveis que são relevantes para todos tipos de Bar, e as subclasses herdam estas variáveis. Exemplo : public class Bar { private String nome; // Nome do Bar private float entrada; // Valor da entrada } public class BarNoturno extends Produto { private int idade; // Idade mínima para entrar no bar } • Deste jeito a classe Bar possui as variáveis nome e entrada, e a classe BarNoturno possui as variáveis nome e entrada herdada da superclasse e a variável idade. Reutilização e Abstração PET Computação Utilizando contrutores da Superclasse • Como a subclasse não herda nenhum construtor de sua superclasse, caso não seja definido nenhum contrutor, a subclasse terá apenas o contrutor default ( que não recebe parâmetro algum ). • Podemos também utilizar os contrutores da superclasse na subclasse, como mostra o exemplo abaixo: public Bar ( String n, float e ) { nome = n; entrada = e; } public BarNoturno ( String n, float e, int i ){ idade = i; super ( n , e ); // Referencia o construtor da // superclasse } Reutilização e Abstração PET Computação Especificando Métodos Adicionais • A superclasse deve definir todos os métodos que são relevantes para todas as subclasses. • A subclasse herda todos os métodos da superclasse e pode definir métodos específicos. Exemplo : // Métodos da superclasse Bar public class Bar { public float getEntrada( ); public String getNome( ); } //Métodos da Subclasse BarNoturno public classBarNoturno { public int getIdade( ); // BarNoturno possui os métodos herdado pela //superclasse e um novo método getIdade( ); } Reutilização e Abstração PET Computação Sobrescrevendo Métodos da Superclasse • A subclasse herda todos os métodos da superclasse e pode modificar o comportamento de um método de sua superclasse sobrescrevendo-o, • Exemplo : public class Produto { public float getPreco ( ) { return preco; } } public class CD extends Produto { public float getPreco ( ) { float x = getCustoCD( ) + getRoyalle ( ); return x; } } Reutilização e Abstração PET Computação Sobrescrevendo Métodos da Superclasse (cont.) • Para sobrescrever um método de uma superclasse, a subclasse deve definir o método exatamente com a mesma assinatura e tipo de retorno do método da superclasse. • Sobrecarga de métodos : É quando você define vários métdos com o mesmo nome e diferente assinaturas. • Sobrescrita de métodos : É quando você fornece um método com exatamente o mesmo nome e a mesma assinatura que este métodos possui na superclasse. Reutilização e Abstração PET Computação Invocando Métodos da Superclasse • Como foi visto anteriormente quando sobrescrevemos um método da superclasse, estamos escondendo este método. Apesar disto, durante a definição do método da subclasse, podemos chamar o método sobrescrito. Ex.: public class Produto { public float getPreco ( ) { return preco; } } public class CD extends Produto { public float getPreco ( ) { float x = super.getPreco( ) + getRoyalle ( ); return x; } } Reutilização e Abstração PET Computação Operador instanceof • Utilizamos o operador instanceof para determinar o tipo de um objeto em tempo de execução. • Sintaxe do operador instanceof : refObjeto instanceof nomeClasse • Exemplo : public void metodo (Produto i){ // … if ( i instanceof CD) { ((CD) i).play( ); } • Neste exemplo se o Produto i é instância de CD, chama o método play(); Reutilização e Abstração PET Computação Métodos e Classes Final • Declaramos métodos e classe final por suas principais razões: Segurança e Otimização. • Se um método executa alguma operação vital, ela deve ser declarada como final, para evitar que seja sobrescrito por um método malintencionado que procura passar pelas verificações de segurança. • Quando declaramos uma classe como final, ela não poderá nunca mais ser estendida por nenhuma outra classe. Ex.: public final class Criptografia { private String senha; public final void getSenha (String senha) { getCriptografia (senha,256); } } Reutilização e Abstração PET Computação Abstração • Classes Abstratas : Esta classe é simplesmente uma classe que não pode ser instanciada, somente suas subclasses podem. • Métodos Abstratos : Um método definido dentro de uma classe abstrata deve ser implementado pela subclasses destas. Esta técnica permite que o projetista decida quais comportamento as subclasses devem ter. • Interfaces : É a especificação de um conjunto de método, similare a uma classe abstrata, oferecendo também herança múltipla. Uma classe pode implementar um número ilimitado de interfaces, mas pode estender somente uma única superclasse. Reutilização e Abstração PET Computação Definindo Classes Abstratas • Utilizamos a palavra reservada abstract para indicar uma classe abstrata. No exemplo mostrado abaixo declaramos a classe Produto como abstrata. public abstract class Produto { private float preco; public boolean isImportant( ); } • Produto é declarada como uma classe abstrata porque não possui informação ou comportamento suficientes para representar um objeto autônomo. • Caso você tente instanciar uma classe abstrata, será gerado um erro na hora da compilação. • O modificador abstract pode ser aplicado apenas a classes e métodos. Classes abstratas provem um modo de adiar a implementação de métodos para as subclasses. Reutilização e Abstração PET Computação Métodos Abstratos • Devemos declarar métodos abstratos quando existe uma operação que todas as classes deverão ter, cada um de sua maneira. • Ex.: public abstract class Produto { public abstract boolean getValor( ); } • Ao declarar um método abstrato, você deve fornecer somente a assinatura do método que compreende: o nome do método, a lista de parâmetros e o tipo de retorno. Não fornece um corpo para o método. • Como este método é abstrato, todas as subclasses devem fornecer uma implementação para ele. Reutilização e Abstração PET Computação Interfaces • Uma interface é similar a uma classe abstrata, exceto que ela não possui nenhum método concreto ou variáveis de instâncias. Será apenas uma coleção de declarações de métodos abstratos e contantes. • Podemos relacionar interface como um contrato que a subclasse deve obedecer. • Implementar uma interface significa : Herdar as suas constantes e comprometer-se a definir todos os seus métodos. • Exemplo de interface: public interface MyInterface { int var = 0; void method ( ); } Reutilização e Abstração PET Computação Definindo Interfaces • Deve-se definir interface utilizando a palavra reservada interface. Todos os métodos especificados em uma interface são implicitamente públicos e abstratos. Qualquer variáveis definidas em uma interface são implicitamente públicas, estáticas e constantes. • Interface Connection do pacote java.sql. public interface Connection { void commit ( ); // equilvalete a public abstract void commit ( ); void rollback ( ); void close ( ); // … } Reutilização e Abstração PET Computação Implementando Interfaces • No exemplo abaixo será mostrado a implementação da interface Connection, mostrado no exemplo anterior. public class Aplicacao implements Connection { public void commit ( ){ //… codigo do método } void rollback ( ) { //… codigo do método } void close ({ //… codigo do método } // … } • Utilizamos a cláusula implements seguida do nome da interface para definir que estamos implementando uma interface.