Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objetos Java Prof. Dr. Bruno Ferreira Sumário • O que é Java • Softwares utilizados (instalação) • O ambiente de desenvolvimento • Processo de compilação • Características da linguagem • Primeiros exemplos • A sintaxe da linguagem O que é java? Java é uma linguagem de programação introduzida em 1995 pela Sun Microsystems A história começa em 1991, em San Hill Road empresa filiada a Sun (da qual hoje pertence a empresa Oracle), formado pelo time de engenheiros lliderados por Patrick Naugthon, Sun Fellow e James Gosling. O que é java? O grupo criou o projeto denominado Projeto Green, que consistia na criação de tecnologias modernas de software para empresas eletrônicas de consumo. A ideia principal do Java era que os aparelhos eletrônicos se comunicassem entre si. Com o tempo perceberam que não poderiam ficar presos aos sistemas operacionais, até porque os clientes não estavam interessados no tipo de processador que estavam utilizando O que é java? A linguagem de programação chamada de Oak (carvalho) foi criada pelo chefe do projeto James Gosling. A explicação da origem do nome foi que enquanto pensava numa estrutura de diretórios para a linguagem, observava pela janela um carvalho. Mas esse nome já estava registrado, então o nome acabou surgindo na cafeteria local da cidade onde tomavam café. “Java”, pois era o nome da terra de origem do café O que é java? Em 1995 a Sun viu uma oportunidade na Web, nessa época nas páginas não existia muita interatividade, apenas conteúdos estáticos eram exibidos. Então nesse ano a Sun anunciou o ambiente Java, sendo um absoluto sucesso, gerando uma aceitação aos browsers populares como o Netscape Navigator e padrões tridimensionais como o VRML Características da linguagem • Orientada a objetos – da suporte a todos os conceitos do paradigma OO. • Independente de plataforma – JVM. • Sem ponteiros – A JVM tem um mecanismo automático de gerência de memória não permitindo a manipulação direta, e liberando espaço quando necessário. • Performance – a linguagem é compilada e interpretada (neste processo utiliza a tecnologia JIT) • Segurança – a JVM controla as ações da aplicação bloqueando possíveis ações destrutivas ou proliferações • Multi-threading • Free • Case-Sentitive Edições Java • Standard Edition (SE) é a plataforma destinada às aplicações em geral (desktops, computadores pessoais); • Micro Edition (ME) é uma plataforma destinada aos dispositivos móveis e sistemas embarcados (PDAs, controles remotos); • Enterprise Edition (EE) é a plataforma que engloba aplicações corporativas, ela possui bibliotecas (APIs) para implementar software distribuído, tolerante a falhas e multicamada. Softwares utilizados (instalação) • O que você vai instalar? • JVM = apenas a virtual machine, esse download não existe, ele é apenas uma especificação. • JRE = Java Runtime Environment, ambiente de execução Java, formado pela JVM implementada e bibliotecas, tudo que você precisa para executar uma aplicação Java. • JDK = Nós, desenvolvedores, faremos o download do JDK que contém o Java SE (Standard Edition), EE(Enterprise Edition ), ME(Micro Edition). Processo de compilação Processo de compilação (cont.) Processo de compilação (cont.) • JVM é um “mini Sistema Operacional” Processo de compilação (cont.) • Compilando um arquivo via command line no Windows: C:\> javac <NomeDaClasse>.java • Interpretando o arquivo via command line no Windows: C:\> java <NomeDaClasse> Atenção: O caminho de instalação do Java deve estar no path do sistema O ambiente de desenvolvimento • Bloco de notas • Eclipse, NetBeans, JCreator, etc.. Primeiros Exemplos • Erros comuns de programação - Nome do arquivo deve começar com maiúsculo - O Nome da classe deve ter o mesmo nome do arquivo - Lembre-se, o Java é case-sensitive Primeiros Exemplos cap. 2 public class BemVindo1 { // método main de onde a aplicação começará a ser executada public static void main( String args[] ) { System.out.println( "Bem vindo ao java!" ); } //fim do metodo } // fim da classe Primeiros Exemplos cap. 2 public class BemVindo2 { public static void main( String args[] ) { System.out.print( " Bem vindo ao " ); System.out.println( "Java!" ); } } Primeiros Exemplos cap. 2 public class BemVindo3 { public static void main( String args[] ) { System.out.println( "Bem Vindo\nao\nJava!" ); } } Primeiros Exemplos cap. 2 Seqüência de escape Descrição \n Nova linha. Posiciona o cursor de tela no início da nova linha. \t Tabulação horizontal. Move o cursor de tela para a próxima parada de tabulação. \r Retorno de carro. Posiciona o cursor da tela no início da linha atual – não avança para a próxima linha. \\ Barras invertidas. Utilizadas para imprimir um caractere de barra invertida \” Aspas duplas. Utilizado para imprimir um caractere de aspas duplas. Por exemplo: System.out.println(“ \”em aspas\” ”) “em aspas” Primeiros Exemplos cap. 2 public class BemVindo4 { public static void main( String args[] ) { System.out.printf( "%s\n%s\n", "Bem vindo ao", "Java!" ); } } Primeiros Exemplos cap. 2 • Printf – exibe dados formatados (o “ f ” significa formatado) Ex. %s, %d, %.2f • Já o Print e o Println não aceitam parâmetros de formatação Primeiros Exemplos cap. 2 import java.util.Scanner; // importar a biblioteca para ler o teclado public class Adicao { // metodo main por onde a aplicação começa a ser executada public static void main( String args[] ) { // cria uma variavel chamada entrada do tipo scanner que captura as teclas Scanner entrada = new Scanner( System.in ); int num1; // primeiro numero da adição int num2; // segundo numero da adição int soma; // guarda a soma dos dois numeros System.out.print( "Entre com o primeiro numero: " ); // mostra o prompt num1 = entrada.nextInt(); // le o primeiro numero informado pelo usuario System.out.print( "Entre com o segundo numero: " ); // prompt num2 = entrada.nextInt(); // le o segundo numero informado pelo usuario soma = num1 + num2; // soma os dois numeros System.out.printf( "A soma é %d\n", soma ); // mostra soma } // sim do metodo main } // fim da classe Primeiros Exemplos cap. 2 Operação Java Operador Aritmético Expressão Java Adição + F + 7 Subtração - P – C Multiplicação * K * 3 Divisão / X / Y Resto % 7 % 2 Primeiros Exemplos cap. 2 import java.util.Scanner; public class Comparacao { public static void main( String args[] ) { Scanner entrada = new Scanner( System.in ); int num1, num2; System.out.print( "Entre com o primeiro numero: " ); num1 = entrada.nextInt(); System.out.print( "Entre com o segundo numero: " ); num2 = entrada.nextInt(); if ( num1 == num2 ) System.out.printf( "%d == %d\n", num1, num2 ); if ( num1 != num2 ) System.out.printf( "%d != %d\n", num1, num2 ); if ( num1 < num2 ) System.out.printf( "%d < %d\n", num1, num2 ); if ( num1 > num2 ) System.out.printf( "%d > %d\n", num1, num2 ); if ( num1 <= num2 ) System.out.printf( "%d <= %d\n", num1, num2 ); if ( num1 >= num2 ) System.out.printf( "%d >= %d\n", num1, num2 ); } }//fim do main e depois fim da classe Primeiros Exemplos cap. 2 Padrão Algébrico operador de igualdade ou relacional Operador de Igualdade ou relacional em Java Exemplo de Condição em Java Significado da Condição em Java Operadores de Igualdade = == X == Y X é igual a Y ≠ != X != Y X é diferente de Y Operadores Relacionais > > X > Y X é maior que Y < < X < Y X é menor que Y ≥ >= X >= Y X é maior ou igual que Y ≤ <= X <= Y X é maior ou igual que Y Instruções de controle – parte I cap. 4 //---------------------------------------------------------------------------------- if (nota >= 90) System.out.println(“A”); else if (nota >= 80) System.out.println(“B”); else if (nota >= 70) System.out.println(“C”); else if (nota >= 60) System.out.println(“D”); else System.out.println(“F”);//---------------------------------------------------------------------------------- If (x>5) if (y>5) System.out.println(“x e y é maior que 5”); else (“quando vai executar esta instrução?”) //---------------------------------------------------------------------------------- if (nota >= 60) System.out.println(“Aprovado”); else { System.out.println(“Reprovado”); System.out.println(“Vai ter que repetir a disciplina”); } //---------------------------------------------------------------------------------- Instruções de controle – parte I cap. 4 //---------------------------------------------------------------------------------- int contador = 0; while (contador < 10){ System.out.printf(“O valor é: %d”,contador); contador = contador + 1; // ++contador; ou contador += 1; } //---------------------------------------------------------------------------------- booblean chave = true; while (chave) calcular_Soma(); //chama uma função; //---------------------------------------------------------------------------------- int estudantes, aprovado, reprovavdo; estudantes = 0; while (estudantes < 10){ Scanner entrada = new Scanner(System.in); nota = entrada.nextInt(); if (nota >= 60) aprovado = aprovado + 1; //ou aprovado += 1; ou ++aprovado else reprovado = reprovado + 1; // ou reprovado += 1; ou ++reprovado ++estudantes; } //---------------------------------------------------------------------------------- Instruções de controle – parte I cap. 4 Operador de atribuição Expressão de exemplo Explicação Atribuições Suponha: int c = 3, d = 5, e = 4, f = 6, g = 12; += c += 7 c = c + 7 10 à variável c -= d -= 4 d = d – 4 1 à variável d *= e *= 5 e = e * 5 20 à variável e /= f /= 3 f = f / 3 2 à variável f %= g %= 9 g = g % 9 3 à variável g Instruções de controle – parte I cap. 4 public class Incremento{ public static void (String[] args){ int c; c = 5; System.out.println(c); System.out.println(c++); System.out.println(c); System.out.println(); c = 5; System.out.println(c); System.out.println(++c); System.out.println(c); } } Instruções de controle – parte I cap. 4 Operador Chamado Expressão de exemplo Explicação ++ pré-incremento ++a Incrementa “a” em 1 e então utiliza o novo valor de “a” na expressão em que “a” reside ++ pós-incremento a++ Utiliza o valor atual de “a” na expressão em que “a” reside, então incrementa “a” por 1 -- pré-incremento --a Decrementa “a” em 1 e então utiliza o novo valor de “a” na expressão em que “a” reside -- pós-incremento a-- Utiliza o valor atual de “a” na expressão em que “a” reside, então decrementa “a” por 1 Instruções de controle – parte II cap. 5 //repetição controlada por contador com a instrução de repetição while public class WhileContador { public static void main( String args[] ) { int contador = 1; // declara e inicializa a variável while ( contador <= 10 ) // condição de continuação do loop { System.out.printf( "%d ", counter ); ++contador; // incrementa a variável de contole por 1 } // fim do while System.out.println(); // linha em branco } // fim do main } // fim da classe Instruções de controle – parte II cap. 5 //repetição controlada por contador com a instrução de repetição for public class ForContador { public static void main( String args[] ) { // cabeçalho da intrção for inclui inicialização // condição de continuação do loop e incremento for ( int contador = 1; contador <= 10; contador++ ) System.out.printf( "%d ", contador ); System.out.println(); } } Instruções de controle – parte II cap. 5 Instruções de controle – parte II cap. 5 Exemplos: X = 2; y= 10; for (int j = x; j <= 4 * x * y; j += y / x ) equivale a for (int j = 2; j <= 80; j += 5) for (int i = 7; i <= 77; i +=7) Varia a variável de 7 a 77 em incrementos de 7 for (int i = 100; i >= 1; i- -) Varia a variável de controle de 100 a 1 em incrementos de 1 for (int i = 20; i>=2; i -= 2) Varia a variável de controle de 20 a 2 em decrementos de 2 for (int i = 99; i >= 0; i -= 11) Varia a variável de controle sobre na seqüência 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 Instruções de controle – parte II cap. 5 //Instrução de repetição do.....while public class DoWhile { public static void main( String args[] ) { int contador = 1; // inicializa o contador do { System.out.printf( "%d ", contador ); ++contador; } while ( contador <= 10 ); // fim do commando do...while System.out.println(); // imprime uma linha em branco } // fim do metodo main } // fim da classe Instruções de controle – parte II cap. 5 switch ( curso ) { case 1: //o que acontece se não tiver o break??? ++aCont; break; case 2: ++bCont; break; case 3: case 4: case 5: ++cCont; break; default: System.out.println("Opção Inválida"); break; } // fim do switch Instruções de controle – parte II cap. 5 public class UsandoBreak { public static void main( String args[] ) { int cont; for ( cont = 1; cont <= 10; cont++ ) // rodas 10 vezes { if ( cont == 5 ) break; // termina o loop System.out.printf( "%d ", cont ); } System.out.printf( "%d\n", cont ); } } Instruções de controle – parte II cap. 5 public class UsandoContinue { public static void main( String args[] ) { for ( int cont = 1; cont <= 10; cont++ ) // roda 10 vezes { if ( cont == 5 ) continue; System.out.printf( "%d ", cont ); } System.out.println( "\nNão imprime o 5" ); } } Instruções de controle – parte II cap. 5 Operações lógicas • OU (OR) || • E (AND) && • NÃO (NOT) ! • OU-EXCLUSIVO (XOR) ^ Exercitando... Crie um algoritmo para simular um “login” de banco. O usuário deve entrar com 3 letras (na seqüência correta) e caso estas letras estejam corretas, ele deve informar uma senha com 4 letras. Exemplo: letras: A – C – E numero: 5674 Exercício 01 1. Leia um número e exiba seu sucessor. 2. Calcular a média final, dadas as notas das 3 provas e produzir uma saída com a média e a situação do aluno de acordo com o seguinte critério: média >= 7, aprovado; 5 < média < 7, recuperação; média < 5, reprovado. 3. Ler dois números inteiros, x e y, e imprimir o quociente e o resto da divisão inteira entre eles. 4. Ler dois valores reais do teclado, calcular e imprimir na tela: a) A soma destes valores b) O produto deles c) O quociente entre eles 5. Para ler 3 números reais do teclado e verificar se o primeiro é maior que a soma dos outros dois. 6. Ler um nome do teclado e ver se é igual ao seu nome. Imprimir conforme o caso: “NOME CORRETO” ou “NOME INCORRETO”. 7. Leia a velocidade máxima permitida em uma avenida e a velocidade com que o motorista estava dirigindo nela e calcule a multa que uma pessoa vai receber, sabendo que são pagos: a) 50 reais se o motorista estiver ultrapassar em até 10km/h a velocidade permitida (ex.: velocidade máxima: 50km/h; motorista a 60km/h ou a 56km/h); b) 100 reais, se o motorista ultrapassar de 11 a 30 km/h a velocidade permitida. c) 200 reais, se estiver acima de 31km/h da velocidade permitida. Exercício 02 1. Faça um algoritmo que escreva na tela os números de 0 a 50. usando um for; de 51 a 100 usando um while e, de 101 até 150 usando um repeat. 2. Faça um algoritmo que escreva na tela os números pares de 0 a 30. 3. Faça um programa que lê “X” números e conta quantos são negativos . Criação de Métodos cap. 5 O que é? Métodos são trechos de código que permitem modularizar um sistemas, isto é, são pequenos blocos que, juntos, compõem um sistema maior. Os métodos recebem um determinado nome e podem ser chamados várias vezes durante a execução de uma classe, ou seja, é uma sub-rotina que pode ser invocada sempre que necessário. Motivos? Redução do tamanho total de código de um sistema, melhoria da modularização do sistema ( cada trecho de código realiza uma tarefa) e a facilitação e agilização do processo de manutenção. Obs.: Um bom método deve ser auto-suficiente, ou seja possui internamentetodas as definições (variáveis) necessárias para seu funcionamento. Exemplo: 1) O programador precisa de validar a data informada pelo usuário em diversas partes do programa. 2) O programador precisa de validar o CPF informado pelo usuário em diversas partes do programa. Hipótese: o dono da empresa pediu para mudar a mensagem de validação de data ou, caso o governo mude a forma de validar um CPF, qual o trabalho para o desenvolvedor alterar o sistema com e sem métodos? Criação de Métodos (cont.) cap. 5 Estrutura de um método em Java: qualificador tipo-do-retorno nome-do-metodo ([Lista de argumentos]) { códigos do corpo } qualificador – define a visibilidade do método (maiores detalhes nas próximas aulas.) tipo-de-retorno – refere-se ao tipo de dado retornado pelo método. Métodos que não retornam valores devem possuir nesse parâmetro a palavra void. Sempre que void for usada em uma declaração de método, nenhum valor será retornado após sua execução, isto é, o método atuará como uma ‘procedure’ de outras linguagens de programação. Um método pode ter como retorno qualquer tipo primitivo (int, float, etc.), um vetor ou ainda um objeto qualquer. nome-do-metodo – pode ser qualquer palavra ou frase, desde que ininciada por uma letra. Se o nome for uma frase, não podem existir espaços em branco entre as palavras. É importante dar aos métodos nomes sugestivos, ou seja, nomes que indicam a tarefa executada pelo método. Criação de Métodos (cont.) cap. 5 lista-de-argumento – trata-se de uma lista de variáveis opcionais, que podem ser recebidas pelo método para tratamento interno. Quando um método é invocado, ele pode receber valores de quem o chamou. Esses valores podem ser manipulados internamente e devolvidos ao emissor da solicitação. Um mesmo método pode receber diferentes tipos de variáveis, desde tipos primitivos até objetos complexos. código do corpo – trata-se dos códigos em Java que realizam os processos internos e retornam os valores desejados, isto é, constituem o programa do método. O tipo de retorno, o nome do método e a lista de argumentos formam a assinatura do método, algo que o identifica de maneira única. Toda vez que um método for invocado a assinatura deverá ser obedecida. Exemplo de métodos: System.out.Println(“valor do parâmetro”); // método chamado Println que tem como argumento um valor do tipo String. Criação de Métodos (cont.) cap. 5 Exemplo de métodos sem retorno: public void imprimeUmaLinha () { System.out.Println(“====================”); } public void imprimeVariasLinha (int qtdeLinhas) { int i = 1; while (i <= qtdeLinhas) { System.out.Println(“====================”); i += 1; } } Criação de Métodos (cont.) cap. 5 Exemplo de métodos com retorno: public String nomeDoAluno () { return “Tião José Silva” } public int areaDoQuadrado(int base, int altura) { float area = 0; area = base * altura; return area } Exercício 03 1. Refaça os exercícios da listagem 01 (Exercício 01) seguindo as regras abaixo: a) Os exercícios deverão ser refeitos em uma única classe (arquivo) utilizando métodos. Faça uso de um menu com uma estrutura CASE para que o usuário escolha qual exercício ele deseja executar. b) Todo o processamento deverá ser feito dentro dos métodos. c) Os métodos não devem conter objetos Scanner e/ou System. Ou seja, a entrada e a exibição de dados (mensagens) deverão ser feitas fora dos métodos. Documentando os métodos/classes • Documentar pontos estratégicos de nossos códigos fontes, é uma necessidade universal; • Em Java existe um recurso do próprio JDK, que facilita todo o trabalho de criação e manipulação dos comentários, essa ferramenta não poderia ter um nome mais sugestivo, estamos falando do JavaDoc; • Seu funcionamento baseia-se na inserção de textos explicativos em forma de um comentário especial, que antecedem um escopo de uma classe ou método, tendo assim, a responsabilidade de apresentar o mesmo; • O documento é gerando em formato html. Documentando os métodos/classes Primeiro passo: crie os comentários no código seguindo exatamente a sintaxe abaixo: Insira os comentários antes dos métodos ou classes Documentando os métodos/classes Segundo passo: use tags especiais a fim de qualificar melhor a informação contida nos comentários Documentando os métodos/classes Tag Significado @author Especifica o autor da classe ou do método em questão. @deprecated Identifica classes ou métodos obsoletos @link Possibilita a definição de um link para um outro documento local ou remoto através de um URL. @param Mostra um parâmetro que será passado a um método. @return Mostra qual o tipo de retorno de um método. @see Possibilita a definição referências de classes ou métodos, que podem ser consultadas para melhor compreender idéia daquilo que está sendo comentada. @since Indica desde quando uma classe ou métodos foi adicionado na aplicação. @throws Indica os tipos de exceções que podem ser lançadas por um método. @version Informa a versão da classe. Documentando os métodos/classes Terceiro passo: automatizando a geração do documento no Eclipse acessando o menu: “Project > Generate Javadoc...” a) Informa o caminho do arquivo javadoc.exe b) Escolha o projeto a ser documentado c) Escolha a pasta destino da documenta e clique em “Next” Documentando os métodos/classes Quarto passo: clique no botão “Finish” e acesse os documentos em um browser d) Escolha o que deve ser documentado Introdução a Classes e Objetos cap. 3 Desde criança representamos nosso conhecimento através de classificações e abstrações. Ex: Carro, Pessoas. Sendo que cada objeto pertence a um determinado grupo possuindo as mesmas características e comportamentos. Quando falamos de carro, todos conseguem abstrair o que é um carro. Existem vários tipos de carros com características diferentes, mas quando pegamos um carro especifico estamos instanciando um objeto da mesma classe. Introdução a Classes e Objetos cap. 3 Quando estamos instanciando um objeto de uma classe, estamos criando um novo item do conjunto representado por esta classe. Apesar de um objeto possuir as mesmas propriedades que os objetos da classe, este objeto possui valores diferentes para um objeto. Ex: cor de um carro, número de portas do carro, número da placa. Introdução a Classes e Objetos cap. 3 Instanciando um objeto Introdução a Classes e Objetos cap. 3 • Para cada necessidade importante teremos objetos que interagem entre si e que são compostos por estado (atributos) e comportamento (métodos), ao contrário do paradigma procedural. Quer um exemplo? Observe como estamos representando o preço dos livros: O valor 59.90 está fazendo isso. Ele representa o valor do livro; mas, e quanto ao seu nome, descrição e demais informações? Todas essas informações representam o que um livro tem e são extremamente importantes para nosso sistema. O grande problema do paradigma procedural é que não existe uma forma simples de conectar todos esses elementos Introdução a Classes e Objetos cap. 3 • A conexão dos dados fica mais intuitiva/natural se cada objeto guardar seus próprios dados. Introdução a Classes e Objetos cap. 3 Vantagens e objetivos da OO: • Natural • Confiável • Reutilizável • Manutenível • Extensível • Oportuna Introdução a Classes e Objetos cap. 3 Natural A POO produz software natural. Os programas naturais são mais inteligíveis. Em vez de programar em termos de regiões de memória, você pode programar usando a terminologia de seu problema em particular. Você não precisa se aprofundar nos detalhes do computador enquanto projeta seu programa. Em vez de ajustar seus programas para a linguagem do mundo dos computadores, a OO o libera para que expresse seu programa nos termos de seu problema. A programação orientada a objetos permite que você modele um problema em um nível funcional e não em nível de implementação. Você não precisa sabercomo um software funciona, para usá-lo: você simplesmente se concentra no que ele faz. Introdução a Classes e Objetos cap. 3 Confiável Para criar software útil, você precisa criar software que seja tão confiável quanto outros produtos, como geladeiras e televisões. Quanto foi a última vez que seu microondas quebrou? Programas orientados a objetos, bem projetados e cuidadosamente escritos são confiáveis. A natureza modular dos objetos permite que você faça alterações em uma parte de seu programa, sem afetar outras partes. Os objetos isolam o conhecimento e a responsabilidade de onde pertencem. Uma maneira de aumentar a confiabilidade é através de testes completos. A OO aprimora os testes, permitindo que você isole conhecimento e responsabilidades em um único lugar. Tal isolamento permite que você teste e valide cada componente independentemente. Uma vez que tenha validado um componente, você pode reutilizá-lo com confiança. Introdução a Classes e Objetos cap. 3 Reutilizável Um construtor inventa um novo tipo de tijolo cada vez que constrói uma casa? Então, por que os programadores continuam “reinventando a roda”? Uma vez que o problema esteja resolvido, você deve reutilizar a solução. Você pode reutilizar prontamente classes orientadas a objetos bem feitas. Assim como os módulos, você pode reutilizar objetos em muitos programas diferentes. Ao contrário dos módulos, a POO introduz a herança para permitir que você estenda objetos existentes e o polimorfismo, para que você possa escrever código genérico. A OO não garante código genérico. Criar classes bem feitas é uma tarefa difícil que exige concentração e atenção à abstração. Os programadores nem sempre acham isso fácil. Através da POO, você pode modelar idéias gerais e usar essas idéias gerais para resolver problemas específicos. Embora você vá construir objetos para resolver um problema específico, freqüentemente construirá esses objetos específicos usando partes genéricas. Introdução a Classes e Objetos cap. 3 Manutenível O ciclo de vida de um programa não termina quando você o distribui. Em vez disso, você deve manter sua base de código. Na verdade, entre 60% e 80% do tempo gasto trabalhando em um programa é para manutenção. O desenvolvimento representa 20% da equação! Um código orientando a objetos bem projetado é manutenível. Para corrigir um erro, você simplesmente corrige o problema em um lugar. Como uma mudança na implementação é transparente, todos os outros objetos se beneficiarão automaticamente do aprimoramento. A linguagem natural do código deve permitir que outros desenvolvedores também o entendam. Introdução a Classes e Objetos cap. 3 Extensível Assim como você deve manter um sistema. Seus usuários exigem o acréscimo de nova funcionalidade em seu sistema. Quando você construir uma biblioteca de objetos, também desejará estender a funcionalidade de seus próprios objetos. A POO trata dessas realidades. O Software não é estático. Ele deve crescer e mudar com o passar do tempo, para permanecer útil. A POO apresenta ao programador vários recursos para estender código. Esses recursos incluem herança, polimorfismo, sobreposição, delegação e uma variedade de padrões de projeto. Introdução a Classes e Objetos cap. 3 Oportuna O ciclo de vida do projeto de software moderno é freqüentemente medido em semanas. A POO ajuda nesses rápidos ciclos de desenvolvimento. A POO diminui o tempo do ciclo de desenvolvimento, fornecendo software confiável, reutilizável e facilmente extensível O software natural simplifica o projeto de sistemas complexos. Embora você não possa ignorar o projeto cuidadoso, o software natural pode otimizar os ciclos de projeto, pois você pode se concentrar no problema que está tentando resolver. Quando você divide um programa em vários objetos, o desenvolvimento de cada parte pode ocorrer em paralelo. Vários desenvolvedores podem trabalhar nas classes independentemente. Tal desenvolvimento em paralelo leva a tempos de desenvolvimento menores. Introdução a Classes e Objetos cap. 3 Geralmente uma determinada classe possui não apenas suas propriedades (características). Ela possui obrigações (afazeres), que são conhecidos como métodos ou mensagens. REPRESENTAMOS UMA CLASSE PELO SÍMBOLO: Carro Nome da classe cor: String Propriedades nº Portas : int andar(); Métodos freiar(); Introdução a Classes e Objetos cap. 3 Classe – é um tipo de dados definido pelo usuário, que tem um estado(propriedades) e algumas operações(procedimentos e função) Objeto – é uma instância de uma classe, os objetos são entidades reais, que ocupam espaça de memória. Exemplo 01 public class CadernoNotas01 { // mostra uma mensagem de boas vindas com o nome do curso public void mostraMenssagem(String nomeCurso) { System.out.printf( "Bem vindo ao caderno de notas!\n%s!\n", nomeCurso ); } // fim do método } // fim da classe Exemplo 01 cont. import java.util.Scanner; //objetivo: passar valores para os metodos por parametro public class CadernoNotasPrincipal01 { public static void main(String[] args) { // Cria um scanner para entrada dos dados Scanner entrada = new Scanner( System.in ); // cria um novo objeto da classe Caderno de Notas CadernoNotas01 meuCaderno = new CadernoNotas01(); System.out.println( "Entre com o nome do curso:" ); String cursoNome = entrada.next(); System.out.println(); // linha em branco // chama o metodo passando o nome do curso meuCaderno.mostraMenssagem( cursoNome ); } } Documentando as classes através de diagramas Você pode instalar um plugin dentro do próprio Eclipse Exercitando... 1. Criar uma nova classe Java chamada Livro com os seguintes atributos: nome, descrição e isbn do tipo string, valor do tipo double. 2. Criar uma instância dessa classe para receber os dados de um livro. 3. Imprima na tela os dados do livro. 4. Criar outra instância dessa classe para receber os dados de outro livro. 5. Imprima na tela os dados desse segundo livro. 6. Crie um método para Imprimir os dados dos livros dentro da classe. 7. Responda a pergunta: Qual a melhor opção para a impressão dos dados? 8. Agora crie campos para receber os dados dos autores: nome, email e CPF. 9. Insira os dados do mesmo autor para os dois livros. 10. Responda a pergunta: Você consegue imaginar alguma solução melhor para informar esses dados? Como? Concluindo... Mais uma pergunta: dois objetos da mesma classe podem ser comparados da seguinte forma: if (livro1 == livro2) ??? Os três pilares da POO • Para edificar seu entendimento e domínio de OO, você deve primeiro ter uma base sólida a partir da qual possa expandir sua compreensão. Primeiro, você precisará identificar, definir e explorar os conceitos básicos de OO. Tal discussão o leva naturalmente aos três conceitos que devem estar presentes para que uma linguagem seja considerada realmente orientada a objetos. • Os três pilares são: 1. Encapsulamento 2. Herança 3. Polimorfismo Encapsulamento cap. 3 • Encapsulamento é a característica da OO de ocultar partes independentes da implementação. O encapsulamento permite que você construa partes ocultas da implementação do software, que atinjam uma funcionalidade e ocultam os detalhes de implementação do mundo exterior. • Uma vez encapsulado, você pode ver uma entidade de software como uma caixa preta. Você sabe o que a caixa preta faz, pois conhece sua interface externa. Você não se preocupa com o que está acontecendo dentro da caixa; você só se preocupa com o fato de que isso aconteça. Encapsulamento cap. 3 Uma interface lista os serviços fornecidos por um componente (classe). A interface é um contrato com o mundo exterior, que define exatamente o que uma entidade externa pode fazer com o objeto. Uma interface é o painel de controle do objeto. Mensagem Mensagem? Interface Interface In te rf ac e In te rf ac e Encapsulamento – Exemplode interface e implementação cap. 3 A interface pública é: public void debug( String mensagem) public void info( String mensagem) public void aviso( String mensagem) public void erro( String mensagem) public void erroGrave( String mensagem) Atenção: A interface diz o que deve ser feito, mas não diz como. O responsável por isso é a implementação (Ex.: O log poderia ser salvo em um arquivo texto ou enviado por email). Você notou que a interface pública não inclui o método private void print(String tipo, String mensagem) ??? Encapsulamento cap. 3 • O que aparece e o que não aparece na interface pública é governado por diversas palavras-chave existentes nas linguagens de programação OO, mas fundamentalmente essas palavras acabam tendo efeitos semelhantes: • Público (public) – garante o acesso a todos os objetos. • Protegido (protected) – garante o acesso à instância, ou seja, para aquele objeto, e para todas as subclasses (mais detalhes nas próximas aulas). • Privado (private) – garante o acesso apenas para a instância, ou seja para aquele objeto. Encapsulamento – Por que usar? cap. 3 Quando usado cuidadosamente, o encapsulamento transforma seus objetos em componentes plugáveis. Para que outro objeto use seu componente, ele só precisa saber como usar a interface pública do componente. Tal estratégia tem três vantagens: 1. Independência: significa que você pode reutilizar o objeto em qualquer parte. Quando você encapsular corretamente seus objetos, eles não estarão vinculados a nenhum programa em particular. Em vez disso, você pode usá-los sempre que seu uso fizer sentido. Para usar o objeto em qualquer lugar, você simplesmente exerce sua interface Encapsulamento – Por que usar? cap. 3 2. O encapsulamento permite que você torne transparente as alterações em seu objeto. Desde que você não altere sua interface, todas as alterações permanecerão transparentes para aqueles que estiverem usando o objeto. O encapsulamento permite que você atualize seu componente, forneça uma implementação mais eficiente ou corrija erros. Os usuários de seu objeto se beneficiarão automaticamente de todas as alterações. 3. Usar um objeto encapsulado não causará efeitos colaterais inesperados entre o objeto e o restante do programa. Como o objeto tem implementação independente, ele não terá nenhuma outra interação com o restante do programa, além da interface. Encapsulamento – Abstração cap. 3 Abstração é o processo de simplificar um problema difícil. Quando começa a resolver um problema, você não se preocupa com cada detalhe. Em vez disso, você simplifica , tratando apenas dos detalhes pertinentes a uma solução (ex. simulador de tráfego). A Abstração tem duas vantagens: 1. Ela permite que você resolva um problema facilmente. 2. Mais importante, a abstração o ajuda a obter reutilização. Quando possível, você deve se esforçar para criar objetos que possam resolver um domínio inteiro de problema. Ex. Um software para um fila de banco e um software de fabricação de sanduíches. Entrada Saída Encapsulamento – Ocultação da Implementação cap. 3 Duas vantagens: 1. Protege seu objeto de seus usuários. O que aconteceria se o usuário atribuísse um valor negativo para o campo preço unitário? Encapsulamento – Ocultação da Implementação cap. 3 Duas vantagens: 2. Protege os usuários de seu próprio projeto A ocultação da implementação leva a um projeto mais flexível, pois ela impede que os usuários de seus objetos se tornem fortemente acoplados à implementação subjacente dos objetos. Então, não apenas a ocultação da implementação projete seus objetos, como também protege aqueles que usam seus objetos, estimulando um código fracamente acoplado • O código fracamente acoplado é independente da implementação de outros componentes • O código fortemente acoplado é fortemente vinculado à implementação de outros componentes. Encap. -Responsabilidade cap. 3 Divisão da responsabilidade correta significa que cada objeto deve executar uma função – sua responsabilidade – e executá-la bem. Ter de chamar várias variáveis para calcular o total ajustado, retira a responsabilidade da classe “NaoEncapsulado” e a coloca nas mãos do programador. O código pode ter responsabilidade duplicada. Exemplo 02 //Objetivo:entendimento de private e public, o uso de métodos set e get public class CadernoNotas02 { private String cursoNome; // variável de instancia // metodo para setar o valor de nomeCurso public void setCursoNome( String nome ) {// armazena o valor passando cursoNome = nome; } // recupera o valor armazenado public String getCursoNome() { return cursoNome; } // mostra a mensagem para o usuario public void mostraMenssagem() { // mostra a mensagem e usa o metodo getNomeCurso para buscar o valor System.out.printf( "Bem vindo ao caderno de notas\n%s!\n", getCursoNome() ); } } Exemplo 02 cont. import java.util.Scanner; public class CadernoNotasPrincipal02 { public static void main(String[] args) { // Cria um scanner para entrada dos dados Scanner entrada = new Scanner( System.in ); // cria um novo objeto da classe Caderno de Notas CadernoNotas02 meuCaderno = new CadernoNotas02(); System.out.println( "Valor inicial do curso:" ); System.out.println( meuCaderno.getCursoNome() ); System.out.println( "Entre com o nome do curso:" ); String cursoNome = entrada.next(); //chama o método para setar o valor da variavel cursoNome da classe meuCaderno.setCursoNome(cursoNome); meuCaderno.mostraMenssagem(); // chama o metodo passando o nome do curso } } Exercitando... Vamos continuar nosso exemplo de livro 1. O usuário pode receber descontos nos livros, mas esses descontos não podem ultrapassar os 30%. Implemente uma solução para essa regra de negócio. 2. O nome dos livros não podem ser menor que dois caracteres. Assim, implemente a regra de negócio para isso também. 3. Responda a pergunta: Você usou algum conceito de OO na sua solução? Qual? Existem vantagens? Construtores cap. 3 • Um construtor é um método que serve para inicializar variáveis, instanciar objetos ou dar uma ação inicial ao objeto. • Toda classe tem seu construtor, pois o compilador fornece este construtor sem parâmetros. • O construtor mais a palavra reservada “new” aloca espaço de memória para o novo objeto. Exemplo 03 //Objetivo: uso de construtores public class CadernoNotas3 { private String cursoNome; // variavel de instância // construtor, para inicializar variável e alocar espaço de memoria public CadernoNotas3( String nome ) { cursoNome = nome; } public void setCursoNome( String nome ) {//metodo para setar a varavel de instancia cursoNome = nome; } public String getCursoNome() {// metodo para buscar o valor da variavel de instancia return cursoNome; } public void mostraMenssagem() { System.out.printf( "Bem vindo ao caderno de notas\n%s!\n", getCursoNome()); } } Exemplo 03 cont. public class CadernoNotas3Principal { public static void main(String[] args) { // cria dois objetos CadernoNotas3 CadernoNotas3 caderno1 = new CadernoNotas3( "Introduçaõ a java" ); CadernoNotas3 caderno2 = new CadernoNotas3( "Matematica" ); // mostra o nomes dos dois curso (2 obejtos) System.out.printf( "O nome do primeiro curso: %s\n", caderno1.getCursoNome()); System.out.printf( "O nome do segundo curso: %s\n", caderno2.getCursoNome()); } } Exercício Crie a estrutura abaixo. Logo em seguida, em uma classe com o método “main”, crie 2 objetos do tipo Piloto e 2 objetos do tipo CoPiloto. Preencha todas as informações para estes objetos e chame o método imprimir de cada objeto mostrando os dados no console. Atenção: Na criação dos dois objetos, crie o primeiro com o construtor sem parâmetro e o segundo com o construtor com parâmetros. Uso de caixas de diálogo cap. 3 • A linguagem java tem uma grande capacidade para desenvolvimento de aplicativos com interface gráfica (GUIs – graphical user interfaces).• Nosso primeiro contato com os GUIs serão feitos pelas caixas de diálogo para exiber a saída e recuperar informações de entrada dos usuários. • A classe JOptionPane fornece caixas de diálogos pré-empacotadas que permitem aos programas exibir janelas para os usuários. Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Exemplo 01 //Objetivo: CAIXAS DE DIÁLOGO // importa a classe JOptionPane import javax.swing.JOptionPane; public class Dialogo01 { public static void main( String args[] ) { String str; str = "Bem vindo\n ao\n programa"; JOptionPane.showMessageDialog(null, str ); //termina o aplicativo de forma correta //passando como parâmetro 0, se outro //valor for passado indica erro. //OBS: todo software em java com GUI deve //ser terminado com esta linha. System.exit( 0 ); } } Uso de caixas de diálogo cap. 3 Exemplo 02 import javax.swing.JOptionPane; public class Dialogo02 { public static void main( String args[] ) { String sNum1,sNum2; int num1,num2,soma; // pede ao usuario o primeiro numero sNum1 = JOptionPane.showInputDialog( "Primeiro Número" ); // pede ao usuario o primeiro numero sNum2 = JOptionPane.showInputDialog( "Segundo Número" ); // converte de string para inteiro num1 = Integer.parseInt( sNum1 ); num2 = Integer.parseInt( sNum2 ); // soma as variáveis inteiras soma = num1 + num2; // mostra o resultado JOptionPane.showMessageDialog(null, "A soma é " + soma); System.exit( 0 ); } } Exemplo 03 import javax.swing.JOptionPane; public class Dialogo03 { public static void main( String args[] ) { String sNum1,sNum2; int num1,num2,subtracao; // pede ao usuario o primeiro e segundo múmero sNum1 = JOptionPane.showInputDialog( "Primeiro Número" ); sNum2 = JOptionPane.showInputDialog( "Segundo Número" ); // converte de string para inteiro num1 = Integer.parseInt( sNum1 ); num2 = Integer.parseInt( sNum2 ); // soma as variáveis inteiras subtracao = num1 - num2; // mostra o resultado JOptionPane.showMessageDialog(null, "A diferença é " + subtracao, "Subtração",JOptionPane.WARNING_MESSAGE); System.exit( 0 ); } } Uso de caixas de diálogo cap. 3 Tipos de mensagens Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Uso de caixas de diálogo cap. 3 Métodos um exame mais profundo cap. 6 Sobrecarga de método – Overload Os métodos com o mesmo nome podem ser declarados na mesma classe, contanto que tenham diferentes conjuntos de parâmetros (determinados pelo numero, tipos e ordem dos parâmetros). Quando um método sobrecarregado é chamado, o compilador Java seleciona o método adequado examinando o número, os tipos e a ordem dos argumentos na chamada. A sobrecarga de métodos é comumente utilizada para criar vários métodos com o mesmo nome que realizam as mesmas tarefas. Ex: println(int ou double ou boolean) Exemplo 01 public class QuadradoComSobrecarga { public void testaSobrecarga(){ //chama o metodo sobrecarregado com inteiro e com double System.out.println("O quadrado de 7 é " +numeroAoQuadrado(7)); System.out.println("O quadrado de 7.5 é " +numeroAoQuadrado(7.5)); } public int numeroAoQuadrado(int numero){ return numero*numero; } public double numeroAoQuadrado(double numero){ return numero*numero; } } Exemplo 01 continuação //a classe principal chama(executa) a classe QuadradoComOverload public class QuadradoComOverloadPrincipal { public static void main(String[] args) { QuadradoComSobrecarga q = new QuadradoComSobrecarga(); q.testaSobrecarga(); } } Arrays(vetor) cap. 7 Array é um grupo de variáveis que contém valores que são todos do mesmo tipo Para referenciarmos um elemento particular em um array, especificamos o nome da referência para o array e o número da posição do elemento no array. O array começa da posição zero e vai até N-1 com N sendo o tamanho do array Arrays(vetor) cap. 7 Declarando e criando array Os arrays são objetos que ocupam espaço de memória, logo devem ser criados(new) Array de inteiros Array de string int c[] = new int[12]; String c[] = new String[12]; ou ou int c[]; String c[]; c = new int[12]; c = new String [12]; Mais de um array pode ser declarado em uma linha da seguinte forma: Ex. double[] array1, array2; que é igual a: double array1[]; double array2[]; Arrays(vetor) cap. 7 Declarando e criando array (cont.) Um programa pode criar um array e inicializar seus elementos com um inicializador de array int n[] = {10, 20, 65, 5, 99} Neste caso o array foi criado com tamanho 5 e seus valores podem ser acessados pelos seus indices. Por exempo: o valor 10 pode ser acessado com: n[0] o valor 20 pode ser acessado com: n[1] o valor 65 pode ser acessado com: n[2] o valor 5 pode ser acessado com: n[3] o valor 99 pode ser acessado com: n[4] Exemplo 01 public class Array { public static void main(String[] args) { int vetorA[]; //declara um vetor de inteiros String vetorB[] = new String[5]; //declara e cria um vetor de string double[] vetorC, vetorD; //decaração de 2 vetores em uma linha int vetorE[] = {11, 28, 9, 55, 6};//lista de iniciadores especificando os valores e tamanho; //------------------------------------------------ //cria o vetor declarado com 3 posições de 0 a 2. vetorA = new int[3]; for (int i = 0; i<=2; i++){ vetorA[i] = i+5; System.out.printf("vetorA[%d] é igual a %d\n",i,vetorA[i]); } System.out.println(); //------------------------------------------------ //usa o vetor que ja estava criado vetorB[0] = "B"; vetorB[1] = "R"; vetorB[2] = "U"; vetorB[3] = "N"; vetorB[4] = "O FERREIRA"; Exemplo 01continuação System.out.print("vetorB: "); for (int i = 0; i<=4; i++) System.out.print(vetorB[i]); System.out.println(); System.out.println(); //------------------------------------------------ //cria os dois vetores declarados em uma linha vetorC = new double[3]; vetorD = new double[3]; double soma=0; for (int i=0; i<=2; i++){ vetorC[i] = i*0.25; vetorD[i] = i*0.5; soma += vetorC[i]+vetorD[i]; } System.out.println("A soma dos elementos de vetorC + vetorD é: "+soma); System.out.println(); //------------------------------------------------ //usa o vetor ja inicializado com os indices de zero a length for (int i=0; i < vetorE.length; i++) System.out.printf("vetorE %5d%8d\n",i,vetorE[i]); } } Exercitando...... Crie em uma classe chamada “ExercitandoArray”, esta classe terá o método main() e deverá ter um array de tamanho 20 que suporte dados do tipo inteiro. O usuário deverá entrar com os 20 números inteiros e o programa informará: 1) A soma dos 20 elementos. 2) O maior elemento informado. 3) O menor elemento informado. 4) A média dos números informados. (Somar os números e dividir por 20) 5) Imprimir os 20 elementos. 6) Imprima os 20 elementos em ordem numérica. Arrays(matriz) cap. 7 A linguagem Java não fornece vetores multidimensionais, mas como um vetor pode ser declarado e ter qualquer tipo de base, é possível criar vetores de vetores (de vetores etc.), alcançando assim o mesmo efeito. A declaração de um vetor bidimensional para inteiros, de nome "m" em Java: int m[][] = new int[2][4]; // matriz com 2 linhas X 4 colunas Arrays(matriz) cap. 7 Declarando vetores bidimensionais: 1) Com expressões de criação de vetores: int m[][] = new int[3][3]; // matriz quadrada: 3 linhas X 3 colunas 2) Com expressões de criação de vetores: int m[][] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 3) Com linhas de diferentes tamanhos: int m[][] = new int[2][]; // cria 2 linhas m[0] = new int[5]; // cria 5 colunas para a linha 0 m[1] = new int[3]; // cria 3 colunas para a linha 1 4) Declarando e inicializando linhas de diferentes tamanhos: int m[][] = { {1, 2}, {4, 5, 6, 7, 8}, {9, 10, 11} }; Arrays(matriz) cap. 7 Percorrendo vetores bidimensionais com linhas de diferentes tamanhos: Leia mais em: int m1[][] = { {1, 2, 3, 4}, {5, 6} }; int m2[][] = { {1, 2}, {3}, {4, 5, 6} }; m.length >>>>determina o número de linhas m[i].length >>>> determina o número de colunas da i-ésima linha Leia mais em: int i, j; for (i=0; i<m.length; i++) { System.out.printf("%da. linha: ", (i+1)); for (j=0; j<m[i].length; j++) { System.out.printf("%d ", m[i][j]); } System.out.printf("\n"); } Arrays(matriz) cap. 7 Exemplos de aplicações Java utilizando vetores bidimensionais/matrizes: .... Scanner ler = new Scanner(System.in); int i, j, m[][] = new int[2][4]; for (i=0; i<2; i++) { System.out.printf("Informe os elementos %da. linha:\n", (i+1)); for (j=0; j<4; j++) { System.out.printf("m[%d][%d] = ", i, j); m[i][j] = ler.nextInt(); } System.out.printf("\n"); } System.out.printf("\n"); for (i=0; i<2; i++) { System.out.printf("%da. linha: ", (i+1)); for (j=0; j<4; j++) { System.out.printf("%d ", m[i][j]); } System.out.printf("\n"); } .... Classe e Objetos um exame mais profundo cap. 8 Depois de introduzirmos muitos conceitos básicos e terminologias relacionadas a POO, vamos nos concentrar em mais alguns conceitos como: Composição, Membros de classe static, variáveis de instâncias final e criação de pacotes. Referenciando membros do objeto atual com a referência this (exitem três usos) Cada objeto pode acessar uma referência a si próprio com a palavra- chave this. Usos: 1) Você pode usar this para diferenciar parâmetro e variáveis com o mesmo nome em um método; 2) Chamar explicitamente uma variável ou método da classe, mas isto é feito implicitamente; 3) e por ultimo, usar this para chamar um construtor quando existe sobrercarga. Veja o exemplo.... Classe e Objetos um exame mais profundo cap. 8 A classe Date A manipulação de data e hora é interessante, pois como a linguagem Java é voltada à Internet e dispositivos móveis, os recursos de data e hora devem ser suficientemente flexíveis para permitir sua manipulação em qualquer tipo de cultura nas mais diversas regiões do globo. Por este fato a manipulação de datas exige muitos detalhes e para cobrir todos eles, existem onze classes destinadas à manipulação de data e hora. A classe Date (do pacote util) representa um instante no tempo, sem levar em consideração sua representação ou localização geográfica, com precisão de milissegundos. A classe DateFormat representa uma data com formato String de acordo com um determinado fuso horário e calendário. A classe SimpleDateFormat permite a especificação de diferentes formatos para a data A classe Calendar representa um instante no tempo de acordo com um sistema particular de calendário e fuso horário. Pacote Classes java.util Date, Calendar, GregorianCalendar, TimeZone, SimpleTimeZone java.text DateFormat, SimpleDateFormat, FormatSymbols. java.sql Date, Time, Timestamp A classe Date A execução do código acima vai gerar o resultado O objeto “data” é criado com a data do sistema operacional. Date representa um instante de tempo. Para marcar o tempo, Java considera o número de milissegundos decorridos desde 1º de janeiro de 1970. Cada segundo possui 1.000 milissegundos, cada minuto possui 60 segundos, cada hora possui 60 minutos e cada dia possui 24 horas, ou seja, cada dia corresponde a 86.400.000 milissegundos. 1.000 x 60 x 60 x 24 = 86.400.000 Quando um Date é criado, o número de milissegundos desde 1970 é armazenado no objeto e pode ser retornado pelo método getTime(). A classe Date System.out.println:•Milissegundos na criação de data1. •Milissegundos na criação de data2. •Número de dias, meses e anos decorridos de 1970, até a data da criação do objeto. •Somou-se 10 dias depois da criação do objeto. A classe Date Método Função Retorno after(Date d) Verifica se a data é posterior à data presente em d. boolean before(Date d) Verifica se a data é anterior à data presente em d. boolean equals(Date d) Verifica se a data é igual à data presente em d. boolean getTime() Fornece o número de milissegundos decorridos desde 1º de janeiro de 1970, 00:00:00. long setTime() Define no objeto Date o número de milissegundos armazenados em t. void toString() Converte o objeto Date em tipo String String A classe Date, não fornece um mecanismo de controle sobre a formatação de uma data e não permite converter uma string contendo informações sobre uma data em um objeto Date. Essas funções são executadas pela classe DateFormat A classe DateFormat Diferentes países e usuários preferem visualizar a data com formatos diferentes. Ao criar um objeto a partir da classe DateFormat, ele conterá informação a respeito de um formato particular no qual será apresentada Console: A classe DateFormat Outro exemplo: A classe DateFormat Método Função Retorno format(Date d) Formata a data em uma string de acordo com o estilo utilizado. String getInstance() Retorna uma data e hora de acordo com o estilo SHORT. DateFormat getDateInstance() Retorna uma data de acordo com o estilo de formatação local. DateFormat getTimeInstance() Retorna um horário de acordo com o estilo de formatação local. Date parse(String s) Converte a string em tipo Date. Date A classe SimpleDateFormat, permite criar formatos alternativos para a formatação de datas e horas, dependendo das necessidades do desenvolvedor, ou seja, esta classe expande a capacidade da classe DateFormat. A classe SimpleDateFormat As principais letras usadas para a criação de patterns estão listadas ao lado: Caractere Descrição Formato Ex. G designador de era Texto AD y ano Ano 1996; 06 M mês do ano Mês Jul; 07 d dia do mês Número 10 h hora em am/pm (1-12) Número 12 H hora do dia (0-23) Número 0 m minutos da hora Número 30 s segundos do minuto Número 55 S milissegundos Número 978 E dias da semana Texto Terça-feira D dia do ano Número 189 F dia da semana no mês Número 2 (2ª Qua em Julho) w semana do ano Número 27 W Semana do mês Número 2 a marcadores am/pm Texto PM k hora do dia (1-24) Número 24 K hora em am/pm (0-11) Número 0 A classe SimpleDateFormat A classe SimpleDateFormat Método Função Retorno applyPattern(String p) Aplica um pattern à data conforme definido na String p. void getPattern() Fornece o pattern que está sendo usado no formato da data. String A classe SimpleDateFormat, herda os métodos da classe DateFormat e adiciona os métodos abaixo: A classe Calendar Campo Descrição DAY_OF_MONTH Dia do mês (1 a 31) DAY_OF_WEEK Dia da semana(0=domingo, 6=sábado) DAY_OF_WEEK_IN_MONTH Semana do mês (1 a 5) corrente. Diferente em relação a WEEK_OF_MONTH porque considera apenas a semana cheia. DAY_OF_YEAR Dias decorridos no ano corrente HOUR Hora do dia (manhã ou tarde) (0 a 11) A classe Calendar, oferece mecanismos adequados para realização de cálculos com datas ou para identificação das propriedades de um data, como, por exemplo, para identificar o dia da semana, o dia do mês em relação ao ano. Para isso a classe Calendar converte um tipo Date em uma série de campos: A classe Calendar Campo Descrição HOUR_OF_DAY Hora do dia (0 a 23). MILLISECOND Milissegundos em relação ao segundo corrente. MINUTE Minutos em relação à hora corrente. MONTH Mês em relação ao ano corrente. SECOND Segundos em relação ao minuto corrente. WEEK_OF_MONTH Semana em relação ao mês corrente (1 a 5). WEED_OF_YEAR Semana em relação ao ano corrente. YEAR Ano corrente JANARY,....,DECEMBER Mês correspondente ao ano. MONDAY,....,SUNDAY Dia correspondente à semana. A classe Calendar A classe Calendar Método Função Retorno add(int field, int valor) Função aritmética para objetos Date que adiciona o valor inteiro ao campo(Field) determinado void after(Object x) Verifica se o tempo (data e hora) do objeto x (pode ser Calendar ou outro tipo) é superior ao armazenado no objeto Calendar boolean before(Object x) Idem anterior, porém verifica se o tempo é anterior ao objeto boolean clear() Zera o conteúdo de data e hora armazenando em 1º de janeiro de 1970. void getFirstDayOfWeek() Fornece o primeiro dia da semana, dependendoda localidade int getTime() Fornece o tempo corrente Date getTimeMillis() Fornece o tempo corrente em milissegundos. long rolls() Função aritmética para objetos Date aplicando o efeito de rolagem de datas. Realiza cálculos sem considerar os campos de maior grandeza. Ex. O ano de uma data. void toString() Fornece uma representação em string para a data String Os métodos mais utilizados de Calendar são: Cálculos com Calendar Cálculos com Calendar A função roll adiciona um valor sem alterar as maiores grandezas Exercício Crie uma classe como mostra a figura abaixo. No primeiro método deve ser retornado uma String com a informação das parcelas de acordo com a data da compra de um item, seu valor e em quantas prestações o produto vai ser pago. O segundo método retorna true ou false de acordo com a conversão da String em data. O terceiro método imprime uma data com dia, mês e ano em linhas diferentes. O quarto método recebe uma data de nascimento e retorna quantos dias a pessoa viveu até a data presente. O quinto método retorna a data atual em um formato especial (veja próximo slide). O ultimo método mostra uma promoção em um supermercado de acordo com o dia da semana. Exercício Crie uma classe principal que usa a classe “ExercicioData” como mostra a figura abaixo: Atenção: 1) Os dados em verde devem ser informados pelo usuário. 2) Cada exercício Chama um método da classe “ExercicioData” Formatando valores numéricos Classe e Objetos um exame mais profundo cap. 8 Composição Um classe pode ter referências a objetos de outras classes como membros (propriedades). E é conhecido como um relacionamento tem um Exemplo: public class Carro{ private Porta portas; private Volante volante; \\continua........ } Classe e Objetos um exame mais profundo cap. 8 Composição Classe e Objetos um exame mais profundo cap. 8 Composição x Agregação Classe e Objetos um exame mais profundo cap. 8 Composição x Agregação Porém, os comportamentos semânticos das associações devem estar presentes quanto a existência. Para composição, por exemplo, poderíamos forçar que toda vez que uma nota seja criada, uma nova lista de ItemNotaFiscal deve ser criado. E toda vez que a nota fiscal for apagada, os itens devem ser destruídos. Classe e Objetos um exame mais profundo cap. 8 Membros e variáveis Static Cada objeto tem sua própria cópia de todas variáveis de instância da classe. Em certos casos, apenas uma cópia de uma variável particular deve ser compartilhada por todos os objetos de uma classe. Um campo static - chamado variável de classe é utilizado nestes casos. Uma variável static representa informações de escopo de classe – todos os objetos da classe compartilham os mesmos dados. Exemplo: um jogo de computador.... Declaração: private static int contador; Classe e Objetos um exame mais profundo cap. 8 Classe e Objetos um exame mais profundo cap. 8 Pacotes cap. 8 Por enquanto nossas classes estão todas em um mesmo diretório, dentro da pasta src. Conforme o projeto vai evoluindo, mais e mais classes são criadas e fica cada vez mais difícil manter a organização de nosso projeto. Com o passar do tempo, trabalharemos com classes de terceiros (bibliotecas) e classes da própria API da linguagem, o que torna ainda maior o risco de criarmos uma classe como nome igual a outra existente em alguma dessas bibliotecas. Ex: criar uma classe Date Como diferenciar a sua classe da implementação oferecida pela Oracle? Usamos o nome completo da classe, ou fully qualified name como é comumente chamado. Ele é composto pelo nome do pacote . (ponto) nome da classe. Pacotes cap. 8 Nomenclatura padrão dos pacotes Java Por padrão, um pacote em Java sempre: • é escrito em letra minúscula (lowercase); • deve ser um nome de domínio, iniciado com com, edu, gov etc. • É muito natural que o pacote seja o seu domínio (ou da empresa), como br.edu.ifmg Exemplo de código (uso das palavras package e import) Tipos Enum • São tipos de campos que consistem em um conjunto fixo de constantes (static final) - lista de valores pré-definidos. • Para criar um enum no Eclipse escolha: File > New > Others: Tipos Enum - propriedades • As instâncias dos tipos enum são criadas e nomeadas junto com a declaração da classe, sendo fixas e imutáveis; • Não é permitido criar novas instâncias com a palavra chave new; • O construtor é declarado private, embora não precise de modificador private explícito; • Os nomes declarados recebem todas as letras em MAIÚSCULAS; Tipos Enum - Inicializando valores • Para iniciar os valores declarados dentro das variáveis Enum, é preciso declarar um construtor para iniciar os seus atributos que são declarados; Tipos Enum - exemplo Tipos Enum - imprimindo valor Tipos Enum - percorrendo valor Tipos Enum - comparando valores Tipos Enum – métodos úteis Nos tipos Enum também existem outros métodos descritos abaixo: • String toString() - retorna uma String com o nome da instância (em maiúsculas). • valueOf(String nome) – retorna o objeto da classe enum cujo nome é a string do argumento. • int ordinal() - retorna o número de ordem do objeto na enumeração. Exercício 01 Implemente o diagrama abaixo: * * * nome papelaria ______ Exercício 01 Na classe principal entre com os dados necessários para cadastrar: 1. Uma papelaria com cinco produtos 2. Uma papelaria com três produtos 3. Mostre a quantidade de produtos cadastrados no sistema. 4. Mostre os produtos vendidos por caixa 5. Mostre o produto mais caro de uma papelaria 6. Mostre o último produto cadastrado de uma papelaria Exercício 02 Implemente o diagrama abaixo: Exercício 02 Na classe principal entre com os dados necessários para cadastrar: 1. Uma empresa com dois funcionários contendo 3 dependentes; 2. Uma empresa com três funcionários contendo número de dependentes diferentes; 3. Mostre os dados do funcionário mais velho; 4. Mostre os dados dos funcionários com mais de 60 anos; 5. Mostre os dados dos funcionários que tem dependentes maiores de 18 anos. Herança cap. 9 Herança é uma forma de reutilização de software na qual uma nova classe é criada, absorvendo membros de uma classe existente e aprimorada com capacidades novas ou modificadas. Com a herança, os programadores economizam tempo durante o desenvolvimento de programas reutililzando softwares de alta qualidade testados e depurados. Ao criar uma classe, em vez de declarar membros completamente novos, o programador pode designar que a nova classe deverá herdar membros de uma classe existente. Esta classe é chamada de superclasse, e a nova classe, de subclasse Herança (um dos principais recurso da POO) cap. 9 cont. Uma subclasse normalmente adiciona seus próprios campos e métodos. Portanto uma subclasse é mais especifica que sua superclasse e representa um grupo mais especializado de objetos. Em geral, a subclasse exibe os comportamentos de sua superclasse e comportamentos adicionais que são específicos à subclasse Já conhecemos o relacionamento do tipo “tem um”, a Herança é representa pela expressão “é um”. Em um relacionamento “é um”, um objeto de uma subclasse também pode ser tratado como um objeto de sua superclasse. Por exemplo, um carro é um veículo. Exemplos de superclasse e subclasse Herança (subclasse e superclasse) cap. 9 cont. Os relacionamentos de Herança formam estruturas hierárquicas do tipo árvore. também chamada de hierarquia de herança. Veja um exemplo abaixo: E specia lização G en era lização Herança (encapsulamento) cap. 9 cont. Protected Os membros public de uma classe são acessíveis onde quer que o programa tenha uma referência a um objeto dessa classe ou uma de suas subclasses. Os membros private de uma classe só são acessíveis por dentro da própria classe. O modificador de acesso protected oferece um nível intermediário de acesso entre public e private. Os membros protected de uma superclassepodem ser acessados por membros dessa superclasse, por membros de suas subclasses e por membros de outras classes no mesmo pacote. É importante ressaltar que membros public da superclasse tornam-se membros public da subclasse, e membros protected da superclasse tornam-se membros protected da subclasse. Já os menbros private de uma superclasse não pode ser acessado pelas subclasses Membros de uma classe = propriedades(variáveis) e métodos(funções) Herança (encapsulamento) cap. 9 cont. Herança (implementando) cap. 9 cont. Imagine que temos que implementar uma classe chamada “MembroDaComunidade” e outra chamada “Aluno” Elas são quase idênticas, ou seja, elas têm os atributos: Nome, Login e Senha do tipo String, a diferença é que a classe “Aluno” tem um atributo a mais do tipo String chamado Curso. Herança (implementando) cap. 9 cont. Possíveis soluções para “MembroDaComunidade” e “Aluno”: 1. Reescrever todo o código duas vezes. Entretanto terá que manter duas bases de código separadas. 2. Dentro de “Aluno” poderia existir um variável do tipo “MenbroDaComunidade” e delegar todas as mensagens, como getLogin( ), getSenha( ), à instância de “Aluno”. A delegação ainda o obriga a redefinir todos os métodos encontrados na interface de “MenbroDaComunidade” Delegação é o processo de um objeto passar uma mensagem para outro objeto, para atender algum pedido. 3. Usar herança Herança (implementando) cap. 9 cont. Implementando as duas classes usando Herança temos: Obs: Em java conseguimos implementar Herança através da palavra reservada extends Herança (quando usar) cap. 9 cont. “É um” versus “tem um”: aprendendo quando usar herança A herança de implementação permite que suas classes herdem a implementação de outras classes. Entretanto, somente porque uma classe pode herdar de outra não significa que isso deve ser feito! Então, como você sabe quando deve usar herança? Felizmente, existe uma regra geral a ser seguida, para evitar uma herança incorreta. Quando você está considerando a herança para reutilização ou por qualquer outro motivo, precisa primeiro perguntar-se a classe que está herdando é do mesmo tipo que a classe que está sendo herdada. O fato de pensar em termos de tipo enquanto se herda é freqüentemente referido como teste “é um”. Ex: Aluno “é um” MembroDaComunidade? Caso contrário é mais indicado usar a composição (“tem um”). Herança (mecânica da herança) cap. 9 cont. Uma classe construída através de herança pode ter três tipos importantes de métodos ou atributos: Sobrepostos: a nova classe herda o método ou atributo da progenitora, mas fornece uma nova definição. Novo: a nova classe adiciona um método ou atributo completamente novo. Recursivo: a nova classe simplesmente herda um método ou atributo da progenitora. Exemplo... Herança (mecânica da herança) cap. 9 cont. Novos métodos Método sobrescrito Uso recursivo Herança (tipos de herença) cap. 9 cont. Ao todo existem três tipos de herança: 1. Para reutilização de implementação. Até aqui, a herança de implementação parece excelente. Cuidado, contudo – o que parece uma técnica útil na superfície se mostra perigosa no uso. Na verdade, a herança de implementação é a forma mais deficiente de herança e normalmente você deve evitá-la (Problema: pode-se herdar métodos que nunca serão usados ou que não tem ligação com o domínio do problema a ser resolvido). Uma herança pobre é o monstro de Frankenstein da programação. Quando você usa herança unicamente para reutilização de implementação, sem quaisquer outras considerações, freqüentemente pode acabar com um monstro construído a partir de partes que não se encaixam. A classe “TocaCD” tem os botões “Play”, “Stop” e “Pause” que podem ser aproveitados na nova classe “Dvd”. Problema: O que será feito com os botões “Sintonizar” e “Estação (Am, Fm)”? Herança (tipos de herença) cap. 9 cont. Ao todo existem três tipos de herança: 2. Para a diferença. Você viu a herança para diferença no exemplo de “PontosDimensionais” e “PontosTridimencionais”. A programação pela diferença permite que você programe especificando apenas como uma classe filha difere de sua classe progenitora. A programação por diferença é um conceito poderoso. Ela permite que você adicione apenas o código necessário o suficiente para descrever a diferença entre a classe progenitora e a classe filha. Isso permite que você programa por incrementos. Ponto PontoBidimencional PontoTridimencional PontoQuatroDimensões Herança (tipos de herença) cap. 9 cont. Ao todo existem três tipos de herança: 3. Para substituição de tipo. Permite que você descreva relacionamentos com capacidade de substituição O que é capacidade de substituição? Linha recebe dois objetos “PontoBiDimencional” como argumentos e fornece alguns métodos para recuperar os valores, um método para calcular a distância entre dois pontos e um método para calcular o ponto médio. Herança (tipos de herança) cap. 9 cont. Um relacionamento com capacidade de substituição significa que você pode passar para o construtor de “Linha” qualquer objeto que herde de “PontoBiDimencional”. Lembre-se de que, quando uma filha herda de sua progenitora, você diz que a filha ‘é uma’ progenitora. Assim, como um objeto “PontoTriDimencional” é um “PontoBiDimencional”, você pode passar um objeto “PontoTriDimencional” para o construtor. No método principal temos um objeto bidimensional e outro tridimensional no construtor de Linha Herança (Hora de escrever algum código) cap. 9 cont. A classe “ObjetoHumor” define um método publico chamado “consultaHumor”, que imprime o humor do objeto e, um método protegido “getHumor”, que é usado internamente para consultar o humor do objeto. As subclasses podem simplesmente sobrescrever o método “getHumor” para especializar o humor. Crie duas subclasses a partir de “ObjetoHumor” chamadas “ObjetoTriste” e “ObjetoFeliz”. As duas subclasses devem simplesmente sobrepor “getHumor” para fornecer seu próprio humor especialmente especializado. Nas classes adicione os seguintes métodos próprios: Classe ObjetoTriste => Método “chorar()” que deve imprimir “rurururururu” Classe ObjetoFelis => Método “rir()” que deve imprimir “hahahaha...heheheh” Herança (Classes Abstratas) cap. 9 cont. Existirão ocasiões em que você desejará desenvolver uma classe especificamente para que outros possam herdar dela. Ou seja, não faz sentido instanciar a classe base diretamente. Embora a classe base contenha código comum, que é muito valioso para subclasses, ela pode não ter nenhum valor para instanciação e uso direto. Considere a classe empregado: Podemos usar “Empregado” como base para implementar as classes “EmpregadoComissionado” , “EmpregadoHoristas”, “EmpregadoSalariado”. Onde cada subclasse sabe calcular seu salário. Neste caso cada subclasse define seu próprio método. Mas há um pequeno problema: “Empregado” não tem nenhuma regra para pagamento! Herança (Classes Abstratas) cap. 9 cont. Uma solução é não definir o método “calculaSalario”. Entretanto não definir o método na classe base seria uma decisão infeliz. Isso não modela um funcionário muito bem. Outra solução é deixar o método retornando um valor fixo para que ele seja sobrescrito. Mas como garantir que o desenvolvedor sobrescreva este método? Felizmente, a POO oferece um tipo especial de classe, destinada especificamente à herança planejada: a classe abstrata Uma classe abstrata é muito parecida com qualquer outra definição de classe. A definição da classe pode definir comportamentos e atributos, exatamente como uma classe normal. Entretanto, você não pode instanciar diretamente uma classe abstrata, pois uma classe abstrata pode deixar alguns métodos indefinidos. Um método declarado, mas não implementado, é chamado de método abstrato. Somente classes abstratas podem ter métodos abstratos. Herança (Classes Abstratas) cap. 9 cont. Exercício - Herança A palavra finalcap. 10 Proibindo mudanças (3 usos dessa palavra reservada) 1) Se for utilizada na definição de uma classe, isso indica que ela não poderá ser estendida: public final class MyClass {} // o código abaixo não é permitido public class MyOtherClass extends MyClass {} 2) Se a palavra final for utilizada na definição de um método, indica que ele não poderá ser sobrescrito: public final class MyClass { public final void foo() {} } // o código abaixo não é permitido public class MyOtherClass extends MyClass { public void foo() {} } 3) Se a palavra final for usada em uma variável, isso indica que ela é na verdade uma constante, pois não será permitido que se modifique o valor da mesma uma vez que um valor seja atribuído: public class MyClass { public final void foo() {final int teste = 0;} } // o código abaixo não é permitido public class MyClass1 { public void foo() {final int teste = 0; teste++;} } Polimorfismo cap. 10 Aprendendo a prever o futuro Como você sabe o encapsulamento permite construir componentes independentes e a herança permite reutilizar e estender esses componentes. Entretanto, ainda falta algo. O software está em constante mudança (erros aparecem ou novas funcionalidades são exigidas). Felizmente, a POO entende que o software de sucesso não é estático. Assim, a programação orientada a objetos usa o conceito de polimorfismo, que é o terceiro pilar da POO Polimorfismo cap. 10 Aprendendo a prever o futuro Polimorfismo significa muitas formas. Em termos de programação, muitas formas significa que um único nome pode representar um código diferente, selecionado por algum mecanismo automático. Assim, um nome pode assumir muitas formas e como pode representar código diferente, o mesmo nome pode representar muitos comportamentos diferentes. Pense no termo abrir. Você pode abrir uma porta, uma caixa, uma janela e uma conta no banco. A palavra abrir pode ser aplicada a muitos objetos diferentes no mundo real. Cada objeto interpreta ‘abrir’ de sua própria maneira. Entretanto, em cada caso, você pode simplesmente dizer ‘abrir’. Para descrever a ação. A Herança fornece o aparato necessário para tornar certos tipos de polimorfismo possível. Vamos ver o código a seguir.... Polimorfismo cap. 10 Exemplo 01 Polimorfismo cap. 10 Exemplo 01 Polimorfismo cap. 10 Exemplo 01 - resultado Com base na saída, parece que o método “falar” de “ObjetoPersonalizável” tem muitos comportamentos diferentes. Mesmo que o array supostamente contenha instâncias de “ObjetoPersonalizável”. Polimorfismo cap. 10 O exemplo anterior explica o mecanismo, mas ele poderia não representar adequadamente o espírito do polimorfismo. Afinal, você sabe exatamente o que o array contém. Em vez disso, imagine que você tenha um objeto cujo o método recebe um objeto “ObjetoPersonalizável” como parâmetro: Os relacionamentos com capacidade de substituição permitem que você passe uma instância do objeto “ObjetoPersonalizável” ou qualquer descendente dessa classe. O polimorfismo entra em ação quando o método “façaFalar” é chamado. Logo, ele garante que o método correto seja chamado. Polimorfismo cap. 10 Escrevendo algum código 1) Cria a estrutura de classes mostradas abaixo: Polimorfismo cap. 10 Escrevendo algum código 2) Cria uma classe com o método “main” e execute os seguintes passos: a) Crie um objeto da classe FolhaDePagamento. b) Crie dois objetos da classe “EmpregadoComissionado” e informe seus dados. c) Informe as unidades vendidas para os dois empregados comissionados. d) Crie dois objetos da classe “EmpregadoHorista” e informe seus dados. e) Informe as horas trabalhadas para os dois empregados horistas. f) Registre as informações dos quatro empregados na classe “FolhaDePagamento” usando o método “registraInfoDoEmpregado”. g) Crie um array de 4 posições do tipo Empregado e preencha-o com os funcionários criados. h) Use o método “fazerPagamentos” da classe “FolhaDePagamento”. i) Use o método “imprimirRelatorio” da classe “FolhaDePagamento” Polimorfismo cap. 10 Escrevendo algum código 3) Responda as perguntas: a) Você pode instanciar um objeto do tipo “Empregado”? Justifique b) Identifique no código as linhas responsáveis por indicar herança. c) Identifique no código as linhas responsáveis por indicar herança por substituição. d) Identifique no código as linhas responsáveis por indicar sobrecarga e) Identifique no código as linhas responsáveis por indicar polimorfismo. Interface •Uma interface é uma construção similar a uma classe abstrata que contém apenas métodos abstratos; •Da mesma forma que uma classe abstrata, uma interface não pode ser instanciada; •Seu objetivo é declarar alguns métodos que serão implementados por uma ou mais classes; •Diferentemente de uma classe abstrata, uma interface não possui implementação, apenas declarações de métodos (cabeçalhos) e constantes. Interface Exemplo 1 •A classe java.util.Arrays possui um método, chamado sort, que ordena um array de objetos; •Para usá-lo é preciso, entretanto, que a classe dos elementos do array implemente a interface Comparable: •Isto é, uma classe deve implementar o método compareTo para implementar Comparable e, por conseguinte, usar o método sort. Interface Exemplo 1 (cont.) Interface Exemplo 1 (cont.) Interface Problema Seja a hierarquia de veículos mostrada a seguir: Interface Problema (cont.) •Todos os meios de transporte listados na hierarquia possuem pneus; •Por isso, o método calibrarPneus() foi declarado no topo da hierarquia, sendo, dessa forma, herdado pelas demais subclasses; •Apenas os aviões aterrissam. Logo, o método aterrissar() foi declarado na subclasse Aviao. •Quase todos os veículos da hierarquia anterior podem ser abastecidos com combustível; •Entretanto, se fosse definida uma implementação para tal na classe Veiculo, ela seria herdada por Bicicleta, que não pode ser abastecida; •Por outro lado, definir métodos distintos para abastecimento nas classes Aviao e Carro introduziria uma redundância indesejável. Como resolver este problema? Interface Solução – Herança Múltipla •A linguagem C++ resolveria o problema com herança múltipla: •A herança múltipla resolve alguns problemas, mas introduz outros. Por isso, Java implementa apenas herança simples. Interface Solução - Um método para cada veículo Interface Solução – A interface IUsaCombustivel Interface Um método para todos os veículos Interface A classe Aviao implementa a interface Interface A classe Carro implementa a interface Interface Exemplo de reabastecimento Interface • O link abaixo apresenta uma explicação interessante de herança entre interfaces: http://respostas.guj.com.br/1768-quando- utilizar-extends-e-implements-em-interfaces Interface Considerações Finais • Uma interface não pode ser instanciada, embora possa-se declarar variáveis que se comportam como tal; • Todas as operações definidas em um interface são públicas; • Uma interface não possui variáveis de instância nem implementação de métodos; • Todas as variáveis definidas em uma interface são tratadas como constantes estáticas (public static final); • Uma classe pode implementar múltiplas interfaces. • Para que uma classe implemente uma interface deve-se fazer o seguinte: -Declarar que a classe implementa (implements) a interface; -Fornecer uma implementação para cada operação declarada na interface. Interface e polimorfismo Um exemplo prático Vamos imaginar que somos responsáveis por implementar um sistema que controla a fabricação e venda de um simples restaurante de pizza de calabresa. Dado o contexto, poderíamos então escrever um projeto bem modesto de automatização. Versão 1 Interface e polimorfismo Um exemplo prático Versão 1 (continuação) Interface e polimorfismo Um exemplo prático Versão 2 Vamos imaginar que o programa esta funcionando com sucesso até que o proprietário do restaurante decide aumentar o cardápio acrescentando uma nova
Compartilhar