Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objetos 5 Hoje veremos alguns assuntos introdutórios na nossa disciplina e aproveito para apresentar-lhes alguns conceitos que utilizaremos na estrutura de todas as nossas unidades. Para obter um bom aproveitamento nesta unidade vamos conferir a estrutura desta unidade: Conteúdo Teórico: neste link você encontrará o material principal de estudos na forma de texto escrito. Atividade de Sistematização: os exercícios disponibilizados são de autocorreção e visam que você pratique o que aprendeu na disciplina e que identifique os pontos em que precisa prestar mais atenção, ou pedir esclarecimentos a seu tutor. Além disso, as notas atribuídas aos exercícios serão parte de sua média final na disciplina. Atividade de Aprofundamento: é uma atividade dissertativa. Material Complementar e Referências Bibliográficas: nestes links você poderá ampliar seus conhecimentos. Vídeo Aula: nestes links serão apresentadas algumas ferramentas na prática e também a resolução de alguns exercícios de forma prática. Lembramos a você da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule e que você tenha problemas ao final do semestre. Uma última recomendação, caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, não deixe de entrar em contato com seu professor tutor através do botão mensagens. · Olá alunos(as), sejam bem vindos a disciplina de Programação Orientada a Objetos, nesta unidade estudaremos os conceitos básicos para a criação e entendimento dos conceitos da orientação. Mostraremos a diferença entre programação estruturada e a programação orientada a objetos. Essa será uma aula bem teórica mas importante para a compreensão das unidades seguintes. · Vamos estudar? Introdução a Programação Orientada a Objetos • Introdução • Importância do Software • Por que a Tecnologia de Objetos? • Conceito da Análise e Projeto Orientado a Objetos • Notação UML para Classe e objetos 7 A metodologia Orientação a Objetos é baseada em “objetos do mundo real”, e por este motivo é mais intuitiva ao ser humano, tais como: objetos e atributos, classes e membros, estruturas e componentes, ação e reação. Os métodos de desenvolvimento de software anteriores ao surgimento desse paradigma organizam a especificação de um sistema de acordo com suas funções ou com os dados manipulados. Geralmente, esses métodos apresentam dificuldades na transição da representação do sistema em uma fase para outra do processo de desenvolvimento (da Análise para o Projeto e, do Projeto para a Implementação). Em um sistema orientado a objetos, os dados e todas as operações, que manipulam esses dados, são agrupados em uma única estrutura: “as classes”. Desde o início do desenvolvimento desses sistemas e, em todas as suas fases, o analista trabalha com o mesmo elemento de abstração, os objetos. Estudo das técnicas de programação utilizando o paradigma da orientação a objetos, bem como ferramentas em laboratório para o desenvolvimento de aplicações científicas e comerciais. Dependência generalizada da vida moderna em sistemas de computação. O software é parte cada vez maior dos custos e do sucesso desses sistemas. Produzir software é uma atividade inerentemente complexa: independe de leis físicas, restrições de materiais e processos de manufatura Requer métodos disciplinados de desenvolvimento. Histórico A orientação a objetos (OO) foi utilizada primeiramente na década de 70. A Origem na linguagem SIMULA-67 (década de 60 - Noruega), que já implementava alguns conceitos da Orientação a Objetos. SIMULA-68 foi a primeira linguagem a suportar os conceitos da Orientação a Objetos. Smaltalk, criada pela Xerox, popularizou e incentivou a Orientação a Objetos. Introdução Importância do Software 8 Unidade: Introdução a Programação Orientada a Objetos Outras linguagens de Orientação a Ojbjetos: C++, Object Pascal (Delphi), C#, Java... Java, de fato, popularizou a Orientação a Objetos. Programa Estruturada versus Programa Orientado a Objetos Estruturado: Ênfase nos procedimentos, implementados em blocos estruturados, com comunicação entre procedimentos por passagem de dados Orientado a objetos: Dados e procedimentos fazem parte de um só elemento básico (objeto). Os elementos básicos comunicam-se entre si, caracterizando a execução do programa à Dados e procedimentos agrupados em um só elemento. Os principais problemas do software hoje são: Diminuir o custo e o tempo da mudança Aumentar a capacidade e facilidade de adaptação Dados Funções Prog. Estruturada Atributos (dados) Métodos (funções) Prog. O.O Objeto Por que a Tecnologia de Objetos? 9 Objetos são especialmente bons para: Reduzir o tempo necessário para adaptar um sistema existente (reação mais rápida à mudanças no seu ambiente de negócio) Reduzir o esforço, a complexidade e os custos associados à mudança Orientação a objetos – Fase e responsabilidade Análise Projeto Implementação Define “o quê” Define “o como”Fases Construção do Software Análise • Entender o domínio do problema • Definir a estrutura estática da aplicação • Criar vocabulário comum de conceitos • Apresentar a melhor solução para problema • Definir a estrutura dinâmica da aplicação • Fazer especificação Projeto • Construir a aplicação em conformidade com a especificação • Fazer testes e validações • Fazer implantação Implementação 10 Unidade: Introdução a Programação Orientada a Objetos A metodologia de Análise e Projeto Orientado a Objetos é um processo que contém suporte a notação para definição de software baseado no conceito de objetos que combinam estrutura e comportamento na mesma entidade. Este processo geralmente não é linear, mas é previsível, cíclico, e passível de teste e rastreamento. A notação OOA&D (Object-oriented Analysis and Design ) é definição visual comum que permite as pessoas compartilharem conhecimento sobre sistema - OOA&D consiste em três partes: Processo (São as atividades) Notação (demonstra a interação dos objetos) Regras (descreve como o sistema deve trabalhar) Principais Conceitos As duas principais característica da Orientação a objetos são Classes e Objetos O que é uma classe? Conceito da Análise e Projeto Orientado a Objetos Diálogo com o Autor classe [Do lat. classe.] S. f. 1. Numa série ou num conjunto, grupo ou divisão que apresenta carac- terísticas semelhantes;....... 21. Inform. Em programação ou modelagem orientada a objetos (v. orientação a objetos), categoria descritiva geral, que abrange o conjunto de objetos que compartilham uma ou mais características quanto a seus itens de dados e procedimentos associados. 22. Lóg. Agrupamento de objetos que têm uma ou mais características em comum. “Uma classe é uma entidade descreve um conjunto de objetos com propriedades e comportamen- tos semelhantes e com relacionamentos comuns com outros objetos” As classes são as partes mais importantes de qualquer sistema orientado a objetos. Usamos as classes para capturar o vocabulário do sistema que está em desenvolvimento. Essas classes podem incluir abstrações que são parte do domínio do problema, assim como as classes que fazem uma implementação. Podemos usar ainda as classes para representar itens de software, de hardware e até itens que sejam somente conceituais. 11 Contexto: Venda de flores Chris precisa enviar flores para o amigo Robin que mora em outra cidade… Agentes e Comunidades 1. Chris passa uma mensagem para o florista contendo uma requisição (entregar flores para Robin em outra cidade). 2. É responsabilidade do florista satisfazer esta requisição. 3. Chris não sabe o método que o florista irá utilizar para entregar flores em outra cidade e também desconhece os detalhes desta operação. POO é estruturada como uma comunidade de agentes que interagem chamadosde objetos; Cada objeto tem um papel a ser executado; Cada objeto fornece serviços ou executam ações que podem ser utilizadas por outros membros da comunidade. FloristaChris Robin Objetivo: Mandar Flores para o Robin Arranjador Cultivador Atacadista Entregador Objetivo: Fornecer flores “frescas” Objetivo: Criar Flores Objetivo: Entregar as flores para o Robin Objetivo: Criar o arranjo das flores Objetivo: Satisfazer o Cliente Figura 1. Venda de Flores, Adaptado de Budd,2002 FloristaChris Objetivo: Mandar Flores para o Robin 12 Unidade: Introdução a Programação Orientada a Objetos Mensagens e Métodos Uma ação é a transmissão de uma mensagem para um agente (objeto) responsável pela ação. Quando um objeto aceita a mensagem ele é responsável por tratar a ação. Em resposta a esta mensagem o receptor executará algum método para atender a solicitação. Responsabilidades Descreve o comportamento em termos de responsabilidades. O conjunto de responsabilidades de um objeto é descrito através e protocolos Classes e Instâncias O Florista é um exemplo de classe, pois representa todos os floristas. O Florista Pitoco, e o Bodjo são instâncias desta classe. Um outro exemplo de classes e instâncias é forma de gelatina e as gelatinas. Objetivo: Criar Flores 13 A identificação para as classes em UML é um retângulo divido em três partes. Caso não queira exibir os detalhes da classe você pode suprimir alguns detalhes como atributo e os métodos, conforme mostram as figuras a seguir A seção superior é reservada para a identificação da classe. Essa seção é obrigatório o preenchimento. O nome da classe deve conter somente letras e palavras concatenadas e a primeira letra deve ser escrita em maiúsculo. Exemplo de nomes: Aluno Empregado Curso Na segunda seção são exibidos os atributos da classe, esses atributos são variáveis membro da classe que podem ser usadas pelos métodos tanto para acesso ou escrita. O atributo pode ser criado com as seguintes notações: + Acesso público, tanto funções membros da classe e funções externas podem ter acesso ao atributo público. - Acesso privado, somente funções membros da classe tem acesso a esses atributos # Acesso protegido, o atributo também é privado mas as funções membros das classes derivadas também tem acesso aos atributos. Na última seção são exibidos os métodos da classe, ou seja, as funções que a classe possui. Os métodos também seguem a mesma notação que os atributos. + Acesso público, tanto funções membros da classe e funções externas podem ter acesso ao atributo público. - Acesso privado, somente funções membros da classe tem acesso a esses atributos # Acesso protegido, o atributo também é privado mas as funções membros das classes derivadas também tem acesso aos atributos. Notação UML para Classe e objetos Notação UML para classes 5 • Classes x Objetos • Principais Conceitos • Tipos de dados em Java Lembramos a você da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule e que você tenha problemas ao final do semestre. Caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, não deixe de entrar em contato com seu professor tutor através do botão mensagens. Aprenderemos o que é classe e o que é objeto. Veremos como trazer o problema do mundo real para o mundo da orientação a objetos. Aprenderemos o conceito de atributos, “métodos de acesso”, “parâmetros” e outros. Classes x Objetos • Set e Get 7 Classes x Objetos Mecanismo de Trabalho A JVM interpreta os bytecodes gerados pelo compilador. O objetivo da JVM é permitir que qualquer sistema operacional possa executar uma aplicação Java Classe Java public class BemVindo { public static void main(String args[]) { System.out.println(“Bem vindo a Java.”); } } Atenção Lembre-se o Java é case sensitive (há diferença entre maiúsculas e minúsculas) 8 Unidade: Classes x Objetos Programa = Classe public class BemVindo { public static void main(String args[]){ System.out.println(”Bem vindo”); /* esta linha impirme uma mensagem na tela*/ } } Atenção Os arquivos Java têm que ter o nome da classe principal. No exemplo acima, o nome do arquivo seria Bemvindo.java e depois de compilado ficaria Benvindo.class Nome da classe = Nome dos Arquivos public class BemVindo { public static void main(String[ ] args){ System.out.println(”Benvindo”); } } Método main public class BemVindo { public static void main(String[ ] args){ System.out.println(”Bemvindo”); } } 9 /** Aplicação Hello World */ public class MinhaClasse { public static void main(String[] args) { System.out.println("Hello, world!"); } } Comentário de bloco Definição de classe HelloWorld Definição de método main() Declaração de argumento Nome do método Nome da classe variável local: args t ipo: String[] Chamada de método println() via objeto out accessível através da classe System Atribuição de argumento para o método println() Ponto-e-vírgula é obrigatório no final de toda instrução Principais Conceitos O que são Objetos? São quaisquer coisas na natureza que possuam propriedades (características) e comportamentos (operações). Exemplos de Objetos: um bolo, um cachorro, um livro, etc... Orientação a Objetos: O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam estes dados, como exemplo podemos montar os seguintes objetos pessoas e pássaros. Classe: Pessoa Propriedades Comportamento Nome Andar Profissão Correr Data de Nascimento Trabalhar Altura Chorar Peso Dançar 10 Unidade: Classes x Objetos Classe: Pássaro Propriedades Comportamento Espécie Andar Cor das penas Correr Tamanho Voar Peso Pousar Estrutura de um objeto Um objeto tem identificação, dados e comportamento, atributos e métodos. Podemos dizer que objeto é espécie da classe, ou seja, uma instância da classe. Cliente: clientemulher nome = Fulana cpf = 022.200.708-12 idade = 27 Cliente: clientehomem nome = Ciclano cpf = 022.200.708-55 idade = 32 Para finalizarmos as comparações entre Classe e Objetos temos os seguintes exemplos: Classes Objetos Funcionário Os funcionarios Pitoco Aguiar e José da Silva Carro de passeio O astra, vinho, placa CIL 8445 Nota Fiscal A nota fiscal #29470 referente a um computador notbook Em resumo, o objeto é definido pelo conjunto de valores dos seus atributos em determinado instante. O comportamento é definido pelo conjunto de métodos. Ao criar uma classe, ela passa a ser um tipo abstrato de dados que pode instanciar objetos. Para instanciar objetos usamos o operador new. 11 Motor: 2.0 Cor: Prata Marca: Citroen Motor: 1.6 Cor: Vermelha Marca: Ford Uma coleção de carros pode ser representada por uma classe chamada Carro. Cada carro desta coleção é a “instância” (objeto) da classe Carro. Atributos Os atributos são as características dos objetos, o estado do objeto equivale aos valores de todos os atributos. No caso do exemplo acima os atributos são representado pelo motor, cor e marca. Construindo a classe em Java Um arquivo em Java precisa de uma classe pública com o mesmo nome do arquivo, abaixo um exemplo de como criar o arquivo. public class <nome_da_classe> { <lista de atributos> <lista de métodos> } Atenção Por padrão as classes e atributo em java devem seguir algumas regras: 9 Somente letras, números e underline 9 Não pode começar por números 9 Não pode ter espaços em branco 9 Não pode ser palavra reservada • Classes: Possuem as iniciais maiúsculas e sem espaços ou caracteres especiais • Atributos: São sempre em letras minúsculas 12 Unidade: Classes xObjetos Tipos de dados em Java Java possui 8 tipos primitivos que podem ser usados como tipos de atributos e que são eles: • byte - 8 bits • short - 16 bits • int - 32 bits • long - 64 bits • float - ponto flutuante de 32 bits • double - ponto flutuante de 64 bits • char - Unicode de 16 bits • boolean – true / false • String - classe Vejamos um exemplo de criação da classe carro e a instância da classe. Classes: Atributos (Propriedades) + Métodos (Comportamento) Método é a implementação de uma operação. Os métodos expressam os comportamentos que todos os objetos dessa classe possuem. tipo nome (parâmetros) { instruções; <return resposta>; } 13 Set e Get Servem como métodos de leitura/escrita aos atributos de classes. Um método de leitura para um atributo deve ser chamado de getXxx (onde Xxx é o nome do atributo). Este método não recebe nada como parâmetro, e retorna o mesmo tipo do atributo. Já um método de gravação deve ser chamado setXxx, não retorna nada (geralmente), e recebe como parâmetro o valor que deve ser armazenado no atributo. Na programação orientada a objetos, os atributos da classe quase nunca estão visíveis para os usuários, é necessário criar um método público para que a aplicação possa acessá-lo. Temos basicamente 3 modificadores de acesso: • Private ( - ): é o mais restritivo de todos, atributos e métodos com esse modificador são visíveis somente dentro da definição da própria classe, acessando-o diretamente ou através de uma instância da mesma classe. • Protected ( # ): define que atributos e métodos somente podem ser acessados por subclasses da classe onde está sendo definido. • Public ( + ): é o mais abrangente de todos os tipos de acesso, declara que elementos que o utilizam são acessíveis de qualquer classe Java. Vejamos a implementação do código: 14 Unidade: Classes x Objetos Agora os atributos da classe Carro são privados, não é mais possível atribuir informações diretamente: Os métodos também possuem padrão de nomenclatura. Os métodos possuem sempre a primeira inicial minúscula e as outras iniciais maiúsculas. pegarInformacao(), executarComandoInicial() Os métodos geralmente são ações que podem ser efetuadas entre os atributos do objeto. Métodos que não retornam valores, apenas executam ações, são do tipo void. Por exemplo, na classe Carro, podemos criar um método que imprima seus atributos na tela, ou como vimos anteriormente, mostre o estado do objeto. 15 Métodos - Procedimentos Os métodos podem ou não assumir tipos de dados, caso não assumam, são chamados de procedimentos, pois executam um conjunto de instruções sem devolverem valor algum a quem os chamou. Um método sem tipo recebe em sua definição a palavra-chave void no lugar do tipo. Métodos - Funções Quando os métodos assumem algum tipo, eles são chamados de funções e precisam do comando return para devolver o valor resultante da execução de suas instruções internas. 16 Unidade: Classes x Objetos Métodos - Parâmetros Os métodos podem receber dados para serem utilizados internamente, os quais são chamados de parâmetros ou de argumentos. Quando os parâmetros são passados para os métodos, é criada uma cópia dos valores. Podemos passar vários parâmetros para os métodos, inclusive de tipos diferentes. 5 • Expressões • Operadores • Desvio condicional simples Hoje veremos alguns assuntos introdutórios na nossa disciplina e aproveito para apresentar- lhes alguns conceitos que utilizaremos na estrutura de todas as nossas unidades. Para obter um bom aproveitamento nesta unidade vamos conferir a estrutura desta unidade: Conteúdo Teórico: neste link você encontrará o material principal de estudos na forma de texto escrito. Atividade de Sistematização: os exercícios disponibilizados são de autocorreção e visam que você pratique o que aprendeu na disciplina e que identifique os pontos em que precisa prestar mais atenção, ou pedir esclarecimentos a seu tutor. Além disso, as notas atribuídas aos exercícios serão parte de sua média final na disciplina. · Olá turma, está unidade é muito interessante. Aprenderemos como inserir uma decisão e deixar que o programa tenha alguma possibilidades de execução, também veremos como inserir uma estrutura de repetição nos métodos das classes criadas. · Vamos praticar? Métodos + Estruturas de Decisão e Repetição • Desvio condicional composta • Estrutura de decisão Switch Case • Estrutura de repetição While • Estrutura de repetição Do While • Estrutura de repetição For 6 Unidade: Métodos + Estruturas de Decisão e Repetição Vimos na unidade anterior como encapsular as informações, vimos também como criar os métodos e funções e executá-los. Agora que já sabemos tudo sobre encapsular, métodos e funções, vamos aprender a utilizar estruturas de decisão e estruturas de repetidos nos métodos do objeto. Contextualização Atividade de Aprofundamento: é uma atividade dissertativa. Material Complementar e Referências Bibliográficas: nestes links você poderá ampliar seus conhecimentos. Vídeo Aula: nestes links serão apresentadas algumas ferramentas na prática e também a resolução de alguns exercícios de forma prática. Lembramos a você da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule e que você tenha problemas ao final do semestre. Uma última recomendação, caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, não deixe de entrar em contato com seu professor tutor através do botão mensagens. 7 O conceito de expressões está associado a fórmulas matemáticas onde um conjunto de variáveis e constantes numéricas se relacionam através de operadores matemáticos formando uma expressão e resultando em um valor. Por exemplo, a fórmula da área do retângulo é A = a x b, está fórmula utiliza duas variáves: A, a e b , em que é o lado, b a altura e A que resultará na operação de multiplicação. Em informática uma expressão é a combinação de variáveis, constantes e operadores e que quando verificadas resultam um valor. Os operadores são utilizados nas expressões, por exemplo, 3 + 2, os números 3 e 2 são relacionados por um operador representado pelo sinal + que significa adição. Os operadores se classificam em aritméticos, lógicos e literais, essa divisão depende do tipo de expressão que os mesmos serão inseridos, existe, ainda, um tipo de operador que é o relacional, por meio do qual se compara informações e o resultado é um valor lógico. Tipos de expressões Expressões aritméticas resultam um tipo de dado numérico inteiro ou real, somente é permitido operador aritmético e variáveis numéricas nessas expressões, vejam a tabela a seguir as operações aritméticas: Expressões Operadores 8 Unidade: Métodos + Estruturas de Decisão e Repetição Operadores aritméticos Operador Operação + Adição - Substração * Multiplicação / Divisão % Mod (Resto Divisão) Como na matemática, em computação existe uma ordem de execução dos operadores, por exemplo, primeiro são resolvidos as expressões com os símbolos * e /, em seguida + e -. Expressões lógicas Expressões lógicas são aquelas que retornam ou resulta um valor lógico e só existem dois tipos de dados, verdadeiros ou falsos. Na expressão lógica utilizamos um operador lógico. A tabela a seguir ilustra a utilização e resultado da expressão Tabela verdade A B ! A ! B A .OU. B ( || ) A .E. B ( && ) F F V V F F F V V F V F V F F V V F V V F F V V O operador lógico .NÃO.(!) sempre inverterá o valor do seu operando. O operador .OU. resultará verdadeiro quando um dos seus operando for Verdadeiro, já o operando .E. só resultará verdade quando todos os seus operando forem Verdadeiros. Operadores relacionais Ainda existe outro tipo de operadores que é o relacional, esses operadores relacionais poder ser utilizados entre as operações lógicas. Operador RelacionalOperador Operação == Igual != Diferente < Menor <= Menor ou Igual > Maior >= Maior ou Igual 9 Uma decisão simples é composta pela instrução se... então...fim, se a condição estabelecida for verdadeira, serão executas todas as instruções definidas entre o se... então e depois serão executadas todas as instruções que existirem após o fim. Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado uma classe de nome Conta com o atributo saldo, os métodos de acesso setSaldo() e getSaldo(). O método de nome sacar, recebe um parâmetro de entrada, dentro do método é realizada a seguinte operação: - Se o valor de entrada for maior do que o saldo, exibe uma mensagem de saldo insuficiente, caso contrário realiza a operação de saldo, retirando o valor informado da variável saldo. Desvio condicional simples 10 Unidade: Métodos + Estruturas de Decisão e Repetição A estrutura condicional composta é similar com a estrutura condicional simples. Sempre um comando será executado independente da condição, ou seja, caso a condição seja verdadeira os comandos da condição serão executados ou os comandos da condição falsa serão executados. Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado uma classe de nome Boletim com os atributos media, n1 e n2, os métodos de acesso setN1(), getN1(),setN2() e getN2(). O método de nome calcularMedia(), dentro do método é realizada a seguinte operação: - calcula-se a média das notas. - se a média for menor do que 4, exibir “Conceito D” - se a média for maior ou igual a 4 e menor do que 6, exibir “Conceito C” - se a média for maior ou igual a 6 e menor do que 8, exibir “Conceito B” - se a média for maior ou igual a 8 e menor ou igual a 10, exibir “Conceito A”. Desvio condicional composta 11 Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código: O comando switch case pode ser útil quando precisamos fazer diversas verificações e executar diferentes comandos de acordo com o valor de alguma variável. Estrutura de decisão Switch Case 12 Unidade: Métodos + Estruturas de Decisão e Repetição Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado uma classe de nome Cambio com o atributo valorRS e os métodos de acesso setValor() e getValor(). O método de nome converterMoeda(), dentro do método é realizada a seguinte operação: - calcula-se a média das notas. - se a opçao for igual a 1, exibir a conversão para dólar - se a média for maior ou igual a 4 e menor do que 6, exibir “Conceito C” - se a média for maior ou igual a 6 e menor do que 8, exibir “Conceito B” - se a média for maior ou igual a 8 e menor ou igual a 10, exibir “Conceito A”. Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código: While é uma estrutura de repetição que compara uma variável, quando o resultado da comparação é verdadeiro, ele executa o bloco de instruções. O problema com estruturas de repetição, principalmente com while, é o que chamamos de looping infinito, esse nome é dado por a linha de comando é executada repetitivamente sem nunca chegar ao resultado final, por isso é imprescindível que uma determinada variável seja modificada de acordo com cada loop. Estrutura de repetição While 13 Veja o exemplo: Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado uma classe de nome QtdeNumPar com o atributo numero, os métodos de acesso setQtdeNumero() e getQtdeNumero(). O método de nome retQtdeNumPar(), que recebe um parâmetro de entrada, dentro do método é realizada a seguinte operação: - realiza uma repetição e com cada item verifica se o número é par, executando o MOD de 2 - Cada vez que o resto da operação for 0, contabilizamos 1 para o método retornar o valor. Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código: 14 Unidade: Métodos + Estruturas de Decisão e Repetição DO WHILE é uma estrutura de repetição, tal como o próprio while. A principal diferença entre os dois é que DO WHILE irá fazer a comparação apenas no final do bloco de código, sendo representado da seguinte forma: Em Java podemos representar a estrutura condicional de repetição while por meio do seguinte trecho de código: Estrutura de repetição Do While 15 É um loop mais “fixo”, permite executar o conjunto de sentenças com um número determinado de vezes. Sua expressão geral seria como a que segue: Em Java podemos representar a estrutura condicional de repetição while por meio do seguinte trecho de código: Estrutura de repetição For 5 • Introdução a vetores Hoje veremos alguns assuntos introdutórios, na nossa disciplina. Aproveito para apresentar-lhes alguns conceitos que utilizaremos na estrutura de todas as nossas unidades. Para obter um bom aproveitamento nesta unidade, vamos conferir sua estrutura: • Conteúdo Teórico - neste link você encontrará o material principal de estudos na forma de texto escrito. • Atividade de Sistematização - os exercícios disponibilizados são de autocorreção; nessa atividade, você vai praticar o que aprendeu na disciplina e identificar os pontos em que precisa prestar mais atenção, ou pedir esclarecimentos a seu tutor. As notas atribuídas aos exercícios serão parte de sua média final na disciplina. • Atividade de Aprofundamento - é uma atividade dissertativa. • Material Complementar e Referências - nestes links você poderá ampliar seus conhecimentos. • Videoaula - neste link serão apresentadas algumas ferramentas na prática e a resolução de alguns exercícios também de forma prática. Lembramos a você da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule. Evitará ainda problemas ao final do semestre. Uma última recomendação: caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, entre em contato com seu professor tutor através do botão Mensagens. · Nesta unidade iremos enriquecer nosso conhecimento com novos conceitos. · Nós já estudamos os tipos de variáveis e como criá-las, e vimos também que nem sempre uma variável atenderá nossas necessidades. · Para aprimoramos nosso desenvolvimento, aprenderemos o conceito de vetores e como utilizá-los juntamente com os objetos e também passagem de parâmetros. Introdução a Vetores 7 Introdução a vetores Antes de começar a falar de arrays, devemos lembrar o que é uma variável e para que ela serve. Nas unidades anteriores, vimos que variável é a representação simbólica dos elementos, e que ficam armazenadas em memória. Cada variável corresponde a uma posição, cujo conteúdo pode se alterado ao longo do tempo durante a execução de um programa. No entanto, a variável só pode ser armazena por um único tipo. Também vimos que as variáveis podem ser de três tipos: numéricas, alfanuméricas e lógicas, e que para declarar uma variável precisamos definir o seu nome e que tipo de dados será armazenado nela. Antes de definir vetor, imaginemos a seguinte situação: A solução é bem simples. Definiremos uma variável, alocamos um espaço na memória do computador para armazenar uma e somente uma constante por vez, seja ela literal, numérica ou lógica. Quando atribuímos um valor à variável sobrescrevemos seu conteúdo. Em algumas rotinas é necessário a manipulação de várias variáveis ao mesmo tempo, por exemplo, imagine que o programa deverá controlar o nome de 100 pessoas, ao invés de criar 100 variáveis é possível à criação de apenas uma, que é definida como array. Mas como criar um array? É muito simples: especificamos o nome do array e o número de posições da memória que queremos alocar. Cada posição de memória pode armazenar um valor. Os arrays são criados para que possam armazenar várias informações do mesmo tipo ou da mesma classe; com um vetor também é possível o armazenamentode vários objetos. Essas diversas informações que foram armazenadas em array são de fácil manipulação. As informações ficam disponíveis em forma de tabelas e podem ser acessadas por meio do índices. Nas unidades anteriores vimos que para se chamar um programa em Java, devemos criar um programa principal com o método main, e como parâmetro do método devemos criar um string args[], isso nada mais é do que um array de Strings. Os arrays estão presentes em todas as linguagens de programação, em Java, os arrays são objetos que permitem armazenar uma lista de itens relacionados. Precisamos criar um programa que armazene as seguintes notas de um aluno: 8.0, 10.0, 9.0, 10.0, 8.5, 10.0 e que calcule a média final. 8 Unidade: Introdução a Vetores Arrays Unidimensionais Os arrays de uma dimensão são aqueles que possuem um único índice para acessar os elementos. Eles podem ser declarados da seguinte forma: TIPO-DE-DADO NOME-DO-ARRAY[] = NEW TIPO-DO-DADO[QTDE]. Em que: Tipo-de-dado: Qualquer tipo de variável ou de classe; Nome-do-array: Qualquer nome válido vale o mesmo conceito para a criação dos nomes de variáveis. Exemplos: Criar um array de nome Cidades contendo 50 elementos do tipo String e seu índice varia de 0 a 49. Criar um array de nome mes contendo 12 elementos do tipo int e seu índice varia de 0 a 11. Para se atribuir valores a um vetor (array), devemos colocar o índice desejado entre os colchetes, como demonstrado abaixo: 9 O exemplo que será demonstrado a seguir utiliza um array para armazenar um conjunto de argumentos do tipo inteiro, informado pelo usuário na linha de execução: Exemplo do livro Java 2 - Ensino Didático ( pag. 142 ) Os vetores (arrays) podem ser criados e inicializados ao mesmo tempo, para isso, deve- se utilizar o operador new para instanciar um novo objeto. Os arrays criados entre chaves e separados por vírgula devem ter o mesmo tipo que a variável. Veja a sintaxe abaixo: TIPO-DE-DADO NOME-DO-ARRAY[] = { valores separados por vírgula } O exemplo abaixo mostra como usar, e explica também a função String.valueOf() para manipulação do conteúdo de um array de caracteres. 10 Unidade: Introdução a Vetores Linha 5: criando array de caracteres. Linha 9: mostrando a quantidade de elementos do array. Linha 15: armazenando informações no array. Arrays Bidimensionais Os arrays bidimensionais ou arrays multidimensionais permite a criação de vetores com mais de um índice. Essa característica possibilita que os valores sejam armazenados na forma de matrizes de qualquer dimensão. TIPO-DO-DADO NOME-DO-ARRAY[][] = NEW TIPO-DO-DADO[<índice>][<índice>]. O exemplo abaixo demonstra o uso de arrays bidimensionais para armazenar 2 (duas) notas de 3 (três) alunos (total de 6 notas). Uma vez armazenadas, o programa solicita ao usuário o número do aluno para exibir suas notas e também a média. Informação Alguns pontos devem ser levados em consideração quando se trabalhar com vetores (arrays) de caracteres e strings: nos array de caracteres são utilizados ‘ (apóstrofos) e já nos arrays de string são utilizados “ (aspas). A função String.valueOf() pode ser usada para apresentar os elementos do array de caracteres ou um trecho dele. A função String.valueOf() não funciona para um conjunto de arrays do tipo string, apenas do tipo char(conjunto de caracteres). 11 Arrays de objetos Do mesmo jeito que criamos array de dados primitivos (int, float, Double, string e char), é possível criar um array para armazenamento de objetos. Isso é muito útil, pois permite as mesmas operações com diversos objetos do mesmo tipo. O exemplo abaixo utiliza um array de objetos, aproveitando das funcionalidades da classe Veículo. 12 Unidade: Introdução a Vetores Passagem de arrays em métodos Os métodos já foram vistos nos capítulos anteriores. Vimos que é possível a criação de métodos que recebem valores, manipulam esses valores e retornam um resultado. A passagem de arrays em métodos é basicamente o mesmo das variáveis. Quando um método é invocado, um vetor qualquer é informado; esse vetor pode ser manipulado internamente pelo método e também retornar o resultado. Public static TIPO_DE-ARRAY[] nome-do-método (tipo-do-array nome-do-array[]) O exemplo a seguir mostra o método que recebe um array do tipo inteiro, organiza seus elementos e retorna o array. 5 • Construtores • Sobrecarga • Herança Hoje, veremos alguns assuntos introdutórios na nossa disciplina e aproveito para apresentar-lhes alguns conceitos que utilizaremos na estrutura de todas as nossas unidades. Para obter um bom aproveitamento, vamos conferir a estrutura desta unidade? Conteúdo Teórico: neste link você encontrará o material principal de estudos na forma de texto escrito. Atividade de Sistematização: os exercícios disponibilizados são de autocorreção e visam que você pratique o que aprendeu na disciplina e que identifique os pontos em que precisa prestar mais atenção, ou pedir esclarecimentos a seu tutor. Além disso, as notas atribuídas aos exercícios serão parte de sua média final na disciplina. Atividade de Aprofundamento: é uma atividade dissertativa. Material Complementar e Referências Bibliográficas: nestes links você poderá ampliar seus conhecimentos. Vídeoaula: nestes links serão apresentadas algumas ferramentas na prática e também a resolução de alguns exercícios de forma prática. Atenção Lembramos-lhe da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule e que você tenha problemas ao final do semestre. Uma última recomendação, caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, não deixe de entrar em contato com seu professor-tutor por meio do item mensagens. · Iremos enriquecer nosso conhecimento com novos conceitos, veremos qual a importância dos construtores, sobrecarga e herança. Veremos que isso é de fácil implementação e adaptação. Construtores, Sobrecarga e Herança 7 Construtores são métodos que são invocados automaticamente quando um objeto é instanciado. São métodos que nunca retornam nada e não possuem tipo. Em todas as instanciações foram utilizadas a palavra reservada, conforme o exemplo abaixo: Carro c1 = new Carro(); Conforme comentado nas unidades anteriores, a palavra new é a responsável por inicializar o objeto. O método construtor é o método que é chamado toda vez que o objeto é criado, ou seja, quando se utiliza o operador new, o primeiro método que é chamado é o construtor do objeto. Ele é responsável por disponibilizar ou alocar o espaço em memória para a utilização do novo objeto. Obrigatoriamente, o método construtor deve possuir o mesmo nome da classe, se ele não for declarado, por default é criado automaticamente. Logo abaixo demonstrado-se a codificação de dois arquivos: Arquivo classe: Arquivo para instanciar a classe e invocar o método construtor: O método construtor funciona como qualquer método criado em um programa Java, pode receber argumentos no momento da criação, veja os exemplos abaixo. Suponhamos a necessidade de criar dois objetos da classe carro, com diferentes conteúdos para a variável nome. Construtores 8 Unidade: Construtores, Sobrecarga e Herança Classe carro com recebimento de argumentos Classe UsaCarro com passagem de valores: Em Java, existe uma referência para a própria classe através da palavra-chave “this”. Assim, no construtor ao invés de usar “nome = n”, podemos usar “this.nome = nome”, nesse caso as mesmas variáveis no construtor podem ser usadas nos atributos. 9 Agora, quando instanciamos um objeto da classe Carro, veja como fica: Sobrecarregar (do inglês overload) trata-se de um método para criar mais métodos com o mesmo nome, porém com assinaturas diferentes. Os parâmetros podem se diferenciar em tipo e/ou em quantidade, assim como o tipo de retorno. Ficará a cargo docompilador escolher de acordo com a lista de argumentos enviados os métodos a serem executados. Vejamos os exemplos abaixo: O método recebe dois parâmetros e o retorno é o resultado impresso na tela, veja o método implementado. Agora, imagine que precisamos fazer um método que multiplique números inteiros e não números reais. Para o usuário, é transparente, o programador deve realizar uma sobrecarga de métodos e desenvolveria da seguinte forma: Sobrecarga 10 Unidade: Construtores, Sobrecarga e Herança As possibilidades são ilimitadas e a sobrecarga vai depender das necessidades de cada projeto de classe. Em Java, muitos métodos já são sobrecarregados. Por exemplo, o próprio comando de imprimir que sempre usamos “System.out.println” possui várias sobrecargas. Você pode passar como parâmetro um número inteiro, um número real ou mesmo uma String que ele consegue imprimir na tela o que passou. Isso quer dizer que existe um método println que recebe um int, outro que recebe um double, outro que recebe uma String, além de outros tipos. Herança Como o nome sugere, na orientação a objeto, se refere a algo que será herdado. Em Java ocorre quando uma classe herda todas as características, métodos e atributos de outra classe, essa técnica possibilita o compartilhamento e reaproveitamento de recursos definidos anteriormente. A classe principal que irá disponibilizar todos os recursos recebe o nome de superclasse e a classe que herda recebe o nome de subclasse. Outro recurso da herança, permite que a classe que está herdando, ou subclasse possa aproveitar toda a característica da superclasse, como também implementar novos atributos e métodos. Essa técnica de herança é muito utilizada em Java, para melhor entendimento sobre herança, observe os exemplos abaixo: Classe veículo: 11 A classe Veículo possui duas variáveis de instância (nome e velocidade) e seis métodos. Existe a necessidade de outra classe utilizar as mesmas características da classe Veiculo, mas também implementará métodos que não foram desenvolvidos na superclasse, como por exemplo, os métodos de ligar e desligar. Com a técnica da herança, as características da classe serão herdadas na nova classe e, para realizar a herança, utiliza-se a palavra extends, ou seja a subclasse extends superclasse, veja o exemplo abaixo: A classe Veículo1 estende (extends) as funcionalidades da classe Veículo, ou seja, a classe Veículo1 está herdando os métodos set e get e também os métodos acelera() e frea(). Veja a implementação do código: Ao instanciar o objeto v, o mesmo receberá as variáveis de instância e todos os métodos presentes nas classes Veículo e Veículo1, desse modo o objeto v terá acesso as variáveis nome, velocidade, ligado e os métodos frea, acelera, liga e desliga. Com base na modelagem UML abaixo, veremos como ficará o desenvolvimento das classes MembroUniversidade, Aluno, Bolsista, Funcionário e Professor. 12 Unidade: Construtores, Sobrecarga e Herança Logicamente, começaremos pela classe principal (superclasse). 13 Vamos, agora, implementar a classe Aluno que herda todas as características de MembroUniversidade. Observe a palavra extends, essa palavra indica que a classe Aluno herda as características da classe MembroUniversidade. Pode-se observar que a classe aluno tem seus próprios atributos como RGM e curso. A palavra chave “super” refere-se à superclasse da classe. O comando “super()” está chamando o construtor da classe pai, nesse exemplo a classe pai é a MembroUniversidade. Veja, agora, como fica a classe Bolsista que será subclasse de Aluno. 5 • Classes Abstratas • Polimorfismo e Sobreposição • Interfaces Hoje veremos alguns assuntos introdutórios na nossa disciplina e aproveito para apresentar-lhes alguns conceitos que utilizaremos na estrutura de todas as nossas unidades. Para obter um bom aproveitamento nesta unidade vamos conferir a estrutura desta unidade: Conteúdo Teórico: neste link você encontrará o material principal de estudos na forma de texto escrito. Atividade de Sistematização: os exercícios disponibilizados são de autocorreção e visam que você pratique o que aprendeu na disciplina e que identifique os pontos em que precisa prestar mais atenção, ou pedir esclarecimentos a seu tutor. Além disso, as notas atribuídas aos exercícios serão parte de sua média final na disciplina. Atividade de Aprofundamento: é uma atividade dissertativa. Material Complementar e Referências Bibliográficas: nestes links você poderá ampliar seus conhecimentos. Vídeo Aula: nestes links serão apresentadas algumas ferramentas na prática e também a resolução de alguns exercícios de forma prática. Atenção Lembramos a você da importância de realizar todas as atividades propostas dentro do prazo estabelecido para cada Unidade, dessa forma, você evitará que o conteúdo se acumule e que você tenha problemas ao final do semestre. Uma última recomendação, caso tenha problemas para acessar algum item da disciplina, ou dúvidas com relação ao conteúdo, não deixe de entrar em contato com seu professor tutor através do botão mensagens. · Nesta Unidade você verá conceitos de Classes Abstratas, Polimorfismo, Sobreposição e Interfaces. Nessa altura, você já deve ter incorporado muitos termos de POO, esses conceitos são bastante importantes em Orientação a Objetos, pois permitem a extensibilidade de componentes e seu reuso. Classes Abstratas, Polimorfismo, Sobreposição e Interfaces 7 À medida que você sobe na hierarquia de herança, as classes tornam-se mais gerais. Em algum momento, a classe torna-se tão geral que ela seria apenas uma base para as outras classes e não mais uma classe com instâncias específicas que você queira utilizar. Uma classe abstrata é desenvolvida para representar entidades e conceitos abstratos. Usamos uma classe abstrata para criar um padrão de subclasses com comportamentos iguais. Vamos analisar a Figura 1 a seguir: Figura 1 – Diagrama de Herança para a classe Veiculo e suas subclasses No Diagrama de classes representado na Figura 1 podemos criar classes comuns (classes concretas) para todas as classes representadas. Isso fará com que possamos instanciar objetos de qualquer uma das sete classes. Porém, a classe Veículo só serviu de molde para atributos e métodos comuns às subclasses Carro e Caminhão. Podemos, por exemplo, ter como atributos na classe Veículo “velocidade” e “passageiros”, e alguns métodos como “acelera”, “freia” e seus métodos de acesso “set” e “get”. Desse modo, não há motivos para instanciar objetos da classe Veículo, pois ela serviu apenas como abstração das subclasses da mesma. Nesse caso, dizemos que Veículo pode ser uma classe abstrata. Para a criação de uma classe abstrata usamos a palavra chave “abstract”. Veja na Figura 2 a implementação da classe Veículo. Classes Abstratas 8 Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces Figura 2 – Implementação de classe abstrata Veiculo Uma classe abstrata, além de seus métodos concretos, pode conter também métodos abstratos. Note na Figura 2 que temos dois métodos abstratos, “acelera” e “freia”. Métodos abstratos não possuem corpo, apenas a sua assinatura e eles devem ser implementados obrigatoriamente em suas subclasses, a não ser que suas subclasses também sejam abstratas e nesse caso, devem ser implementados na primeira classe concreta do diagrama. Portanto, uma subclasse de uma classe abstrata herda os métodos concretos e se obriga a implementar os métodos abstratos. Figura 3 – Implementação da subclasse concreta Carro 9 Na Figura 3 temos a implementação da classe Carro, que é subclasse de Veiculo. Note que, por ser uma classe concreta, temos obrigatoriamente que implementar os métodos “acelera” e “freia”. Nesse caso, não podemos instanciar objetos da classe abstrata Veiculo, ou seja, um comando do tipo “Veiculo v1 = new Veiculo();” estaria incorreto. O termo polimorfismo é originário do gregoe significa “muitas formas” (poli = muitas, morphos = formas). A propriedade segundo o qual uma operação pode comportar-se diferentemente em classes diferentes. O polimorfismo é o responsável pela extensibilidade em programação orientada a objetos, promovendo o reuso. Em termos de programação, é o princípio pelo qual duas ou mais subclasses de uma mesma superclasse podem invocar métodos quem tem a mesma identificação (assinatura), mas com comportamentos distintos, especializados para cada classe derivada. Para exemplificar, pense no termo “abrir”. Você pode abrir uma porta, uma caixa, uma janela ou conta no banco. A palavra abrir pode ser aplicada a muitos objetos diferentes no mundo real e cada objeto interpreta a ação de “abrir” à sua maneira, entretanto podemos simplesmente dizer “abrir” para expressar a ação. Uma linguagem polimórfica é a que suporta polimorfismo ( Actionscript, Java), já a linguagem monomórfica não suporta polimorfismo (Pascal, ASP). Uma maneira de utilizar o polimorfismo, utilização o mecanismo de Sobreposição de Métodos (do inglês override), que consiste em reescrever o método herdado da superclasse. Não confundir Sobrecarga de Métodos (overload), que consiste em escrever métodos com o mesmo nome, porém com parâmetros diferentes, o que faz com que eles tenham assinaturas diferentes. Na Sobreposição de Métodos, a assinatura é idêntica ao método herdado, porém o corpo do método é alterado para o propósito específico da subclasse. Na Figura 2, a classe abstrata Veiculo possui métodos abstratos “acelera” e “freia”. Isso fez com que fôssemos obrigados a implementar esses métodos na classe Carro conforme Figura 3. Se analisarmos novamente a Figura 1, notamos que as classes Uno e Ferrari herdam todos os atributos e métodos de Carro, incluindo os métodos acelera e freia. Porém, sabemos que o os objetos da classe Uno aceleram e freiam mais lentamente que objetos da classe Ferrari, portanto, devemos sobrepor esses métodos para que ajam de acordo com a realidade de cada objeto. Polimorfismo e Sobreposição 10 Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces Figura 4 – Implementação das classes Uno e Ferrari Note na Figura 4 que nós reescrevemos os métodos acelera e freia das subclasses Uno e Ferrari, adaptando para as próprias necessidades. Podemos notar que a assinatura do método é idêntica à superclasse carro usando então o mecanismo de Sobreposição. Figura 5 – Exemplo de Polimorfismo e Sobreposição Veja mais um exemplo na Figura 5. Temos uma classe abstrata “Telefone” que possui um método calcularConta. Por herança, as classes “Movel” e “Fixo” recebem o método calcularConta, porém a maneira de calcular a conta de um Telefone Móvel e de um Telefone Fixo é diferente. 11 Nesse caso, através da Sobreposição de Métodos, reescrevemos os métodos calcularConta em cada subclasse para que se adapte à sua necessidade, criando então o conceito de Polimorfismo. Figura 6 – Exemplo de Polimorfismo e Sobreposição Veja o exemplo da Figura 6, onde temos uma classe “Animal” que possui um único método “andar”. Criamos uma subclasse de Animal chamada Cavalo, que por herança recebe o método andar. Nesse exemplo, estamos sobrescrevendo o método andar para que faça outra coisa. Tanto a classe Animal como a classe Cavalo são concretas e aceitam instanciar objetos, podemos ter o seguinte código Java: Animal a = new Animal(); Cavalo b = new Cavalo(); a.andar(); b.andar(); Para o objeto “a”, aparecerá a mensagem de “pessoa andando” e para o objeto “b” a mensagem será “Cavalo Andando”. Porém, podemos ter também o seguinte código: Animal a = new Animal(); Animal b = new Cavalo(); a.andar(); b.andar(); No exemplo anterior, o resultado será o mesmo, para o objeto “a” aparecerá “pessoa andando” e para o “b” será “Cavalo andando”. Porém temos agora “b” como uma variável polimórfica. Um objeto do tipo Animal pode referir-se a um objeto do tipo Animal ou a um objeto de qualquer subclasse da classe Animal. 12 Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces Muitas linguagens de programação orientada a objetos não possuem o conceito de Herança Múltipla. Isso ocorre porque alguns mecanismos da POO são incompatíveis com processos de herança múltipla. Linguagens como C++ e Eiffel possuem mecanismos de herança múltipla, porém são pouco utilizados por serem complexos e por vezes ineficientes. Vamos analisar a Figura 7 a seguir: Figura 7 – Cenário de Herança Múltipla Analisando a Figura 7 podemos notar que a classe ComboDrive herda características das superclasses GravadorDVD e GravadorCD, caracterizando uma herança múltipla. Porém, sabemos que por herança as subclasses herdam todos os atributos e métodos da classe pai. No nosso exemplo, o método “burn” foi sobrescrito nas duas classes GravadorCD e GravadorDVD. Qual método será chamado quando invocarmos o método “burn” da classe ComboDrive? Esse cenário não é possível em Java e em muitas outras linguagens OO. Nesse caso, usamos outro mecanismo chamado Interfaces. Uma interface especifica um conjunto de operações públicas de uma classe e/ou um componente. Uma interface não é uma classe, mas um conjunto de requisitos para classes que precisam se adequar a ela, ou seja, você nunca poderá utilizar o operador new para instanciar uma interface. Interfaces 13 Figura 8 - Interface Note na Figura 8 que Cliente não é uma classe e sim uma Interface. Ela define quais os métodos que deverão ser criados nas classes que a implementam. Uma interface não é herdada e sim implementada. Quando dizemos que uma classe implementa uma interface, estamos firmando um contrato de compromisso que essa classe, obrigatoriamente, implementará os métodos da interface. Os métodos na interface são métodos “ocos”, ou seja, só possuem as assinaturas, mas não possuem corpo. Além dos métodos, as interfaces podem conter constantes, cujas classes que implementam a interface recebem as constantes como um mecanismo de herança. Uma classe pode herdar apenas de uma superclasse, porém podem implementar diversas interfaces, podendo assim simular o mecanismo de herança múltipla. Figura 9 – Interface Imprimível e classe Produto Na Figura 9 temos uma Interface Imprimivel e uma classe Produto. A implementação da Interface pode ser algo como: 14 Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces Podemos notar que, ao invés de usar “public class”, usamos “public interface” para criação de interfaces e não classes. Nessa interface temos uma constante de nome “nlin”, definida com o modificador “final” e a assinatura de dois métodos “toString” e “toSystemOut”. Notem que esses métodos são ocos e não possuem implementação, semelhante aos métodos abstratos vistos anteriormente, mas sem o “abstract”. Todos os métodos de interface serão obrigatoriamente públicos. Todas as classes que implementam a interface “Imprimivel” terão a obrigação de implementar os métodos “toString” e “toSystemOut”. Isso faz com que tenhamos um padrão de programação, assim não importa quais os métodos que as subclasses terão, saberemos que pelo menos esses 2 métodos existirão em todas as classes que implementam a interface. Todos os métodos em uma interface são implicitamente abstratos, porém o modificador “abstract” não é utilizado com métodos de interface, apesar de poder ser, ele é desnecessário. Veja a seguir como uma classe implementa uma interface, utilizando o operador “implements”. Veja no código da classe Produto que usamos a palavra chave “implements” para dizer que a classe implementa a interface. Veja que tivemos que criar os métodos “toString” e “toSystemOut” dentro da classe. public interface Imprimivel { final char nlin = ’\n’; public String toString(); public void toSystemOut(); } public class Produto implements Imprimivel { private String descricao; private int quantidade;public Produto(String d,int q) { descricao = d; quantidade = q; } public String toString() { String resp = “Descrição:” + descricao; resp += nlin + “Qtde:” + quantidade; return resp; } public void toSystemOut() { String resp = “Descrição:” + descricao; resp += nlin + “Qtde:” + quantidade; System.out.print(resp); } } 15 Apesar de não podermos instanciar interfaces, podemos criar variáveis de interface e instanciar objetos de classes que a implementam. O código abaixo teria o mesmo efeito que o anterior: Podemos então perceber que o conceito de classes abstratas é semelhante ao de interfaces. Quando devemos usar uma ou outra? Use classes abstratas quando você quer definir um “template” para subclasses e você possui alguma implementação (métodos concretos) que todas as subclasses podem utilizar. Use interfaces quando você quer definir uma regra que todas as classes que implementem a interface devem seguir, independentemente se pertencem a alguma hierarquia de classes ou não. Claro que podemos também usar ambas no caso de uma simulação de herança múltipla. public class TesteProduto { public static void main(String args[]) { Produto prod = new Produto(“Macarrão”,10); prod.toSystemOut(); System.out.println(“\n” + prod.toString()); } } public class TesteProduto { public static void main(String args[]) { Imprimivel prod = new Produto(“Macarrão”,10); prod.toSystemOut(); System.out.println(“\n” + prod.toString()); } }
Compartilhar