2
Linguagens de Programação
UMG
11
Linguagens de Programação
UMG
4
Linguagens de Programação
UMG
8
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
2
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
2
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
Texto de pré-visualização
PROGRAMAÇÃO ORIENTADA A OBJETOS Iniciar Parte 2 Caderno de Estudos Docente Bruno Vicente Alves de Lima 2 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Reitor Prof Dr Walter Canales SantAna ViceReitor Prof Dr Paulo Henrique Aragão Catunda PróReitora De Graduação Profa Dra Mônica Piccolo Almeida Chaves Núcleo de Tecnologias para Educação Profa Dra Lígia Tchaicka Coordenadora Geral Setor de Divisão de Design Educacional Cristiane Peixoto Coord Administrativa Danielle Martins Leite Fernandes Lima Coord Pedagógica Professor Conteudista Prof Dr Bruno Vicente Designer Pedagógico Lidiane Saraiva Ferreira Lima Paulo Brito Oliveira Lira Junior Designer de Linguagem Jéssica Natália Anjos Silva Luisa Mara Silva Lima Geovana Valle Porto Sirino Projeto Gráfico e Diagramação Ivania de Jesus Serra Barroso Normalização José Marcelino Nascimento Veiga Júnior UNIVERSIDADE ESTADUAL DO MARANHÃO UEMA Os materiais produzidos para os cursos ofertados pelo UEMAnetUEMA para o Sistema Universidade Aberta do Brasil UAB são licenciados nos termos da Licença Creative Commons Atribuição Não Comercial Compartilhada podendo a obra ser remixada adaptada e servir para criação de obras derivadas desde que com fins não comerciais que seja atribuído crédito ao autor e que as obras derivadas sejam licenciadas sob a mesma licença 3 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS 5 HERANÇA 51 Introdução à Herança 6 POLIMORFISMO 61 Conceito de Polimorfismo 62 Sobrecarga de Método Overloading 63 Polimorfismo de Substituição Overriding 7 ABSTRAÇÃO 71 Classe Abstrata 711 Métodos Abstratos 72 Interfaces REFERÊNCIAS 04 05 13 14 15 16 23 24 27 28 36 SUMÁRIO 4 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS A Programação Orientada a Objetos POO é um paradigma po deroso que organiza o software em torno de objetos promovendo maior modularidade reutilização e facilidade de manutenção Entre os pilares fundamentais da POO estão a Herança e o Polimorfismo conceitos que trabalham de forma complementar para tornar os sistemas mais flexíveis e reutilizáveis A herança permite que uma classe conhecida como subclasse ou classe derivada herde atributos e comportamentos de outra classe superclasse ou classe base Com isso é possível criar hierarquias de classes onde características comuns são agrupadas e reaproveita das promovendo a reutilização de código e evitando a duplicação Essa estrutura facilita a modelagem de sistemas mais coesos e claros baseados em especializações e generalizações Já o polimorfismo possibilita que diferentes classes respondam de maneira distinta a uma mesma mensagem ou chamada de méto do desde que compartilhem uma interface ou uma superclasse co mum Isso possibilita que objetos de tipos diferentes sejam tratados de forma uniforme tornando o sistema mais genérico extensível e adaptável Em conjunto herança e polimorfismo são fundamentais para a con strução de sistemas robustos dinâmicos e de fácil manutenção Este capítulo tem como objetivo explorar esses dois conceitos apresentar suas aplicações práticas em Java discutir boas práticas e fornecer exemplos reais para consolidar o aprendizado 5 Herança 5 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Antes de começar a programar em Java é importante compreender o ambiente necessário para escrever compilar e executar os progra mas Esse conjunto de ferramentas é chamado de Ambiente de De senvolvimento Além dos funcionários comuns existem também cargos diferentes como o de gerente Embora eles compartilhem as mesmas infor mações básicas de um funcionário comum possuem dados adicion ais e algumas funções específicas Por exemplo um gerente em nosso banco possui uma senha numérica para acessar o sistema interno e também armazena a quantidade de funcionários sob sua supervisão Código 52 Exemplo de modelagem Funcionários e Gerentes Vamos analisar uma situação prática toda empresa possui um banco de funcionários Sabendo disso podemos começar modelando uma classe genérica chamada Funcionario que conterá as informações comuns a todos os colaboradores como mostra no Código 51 51 Introdução à Herança public class Funcionario private String nome private String cpf private double salario métodos devem vir aqui Código 51 Classe Funcionario com atributos privados 6 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Caso fosse necessário criar um novo tipo de funcionário com carac terísticas distintas teríamos que desenvolver uma nova classe e repe tir grande parte do código existente Além disso se quisermos incluir uma nova informação válida para to dos os funcionários teríamos que modificar cada classe separada mente o que não é eficiente pois os dados principais do funcionário não estão centralizados public class Funcionario private String nome private String cpf private double salario private int senha private int numeroDeFuncionariosGerenciados public boolean autenticaint senha if thissenha senha SystemoutprintlnAcesso Permitido return true else SystemoutprintlnAcesso Negado return false outros métodos Código 52 Classe Gerente com método de autenticação 7 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Felizmente em Java é possível estabelecer uma relação entre class es em que uma herda os atributos e comportamentos da outra Essa relação é conhecida como herança entre classe pai e classe filha No nosso exemplo queremos que a classe Gerente tenha tudo o que a classe Funcionario oferece ou seja que a Gerente seja uma ex tensão de Funcionario Para isso usamos a palavrachave extends Veja no Código 53 abaixo Sempre que instanciamos um objeto da classe Gerente ele auto maticamente herda todos os atributos e comportamentos definidos na classe Funcionario public class Gerente extends Funcionario private int senha private int numeroDeFuncionariosGerenciados public boolean autenticaint senha if thissenha senha SystemoutprintlnAcesso Permitido return true else SystemoutprintlnAcesso Negado return false setter da senha omitido Código 53 Classe Gerente herdando de Funcionario com autenticação 8 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Isso ocorre porque um Gerente é uma especialização de um Fun cionario Podemos ver essa representação no esquema abaixo A classe Gerente herda todos os atributos e comportamentos da classe Funcionario que atua como sua classe base No entanto é importante lembrar que nem todos os membros herdados podem ser acessados diretamente Mesmo que os atributos privados sejam herdados a subclasse não tem acesso direto a eles Para permitir esse acesso de forma controlada a superclasse deve disponibilizar méto dos públicos ou protegidos protected que funcionem como uma in terface de comunicação segura Funcionário Gerente public class Main public static void mainString args Gerente gerente new Gerente podemos chamar métodos do Funcionario gerentesetNomeJoão da Silva e também métodos do Gerente gerentesetSenha4231 Código 54 Classe de teste demonstrando herança 9 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS E se for necessário acessar os atributos herdados Não é recomendáv el tornálos public na classe extttFuncionario pois isso permitiria que qualquer parte do código os modificasse diretamente Para es ses casos o Java oferece um modificador intermediário chamado extttprotected que fica entre extttprivate e extttpublic Atributos marcados como extttprotected podem ser acessados pela própria classe por suas subclasses e também por outras classes dentro do mesmo pacote De forma semelhante é possível criar outras subclasses que repre sentam diferentes níveis hierárquicos dentro da empresa Por exemplo podemos definir uma classe Diretor que herda de Gerente enquan to uma classe Presidente pode herdar diretamente de Funcionario como ilustrado no esquema acima É importante destacar que essa escolha faz parte do desenho do sis tema ou seja da modelagem de negócio Definir se a classe Diretor deve herdar de Gerente dependerá da sua lógica isso só faz sentido se você considerar que um Diretor é um tipo de Gerente Vale lembrar que em Java uma classe pode herdar de apenas uma outra classe Esse conceito é conhecido como herança simples Funcionário Engenheiro Diretor Secretário Gerente 10 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Atividades Questão 1 Conceito e Aplicação da Herança explique com suas próprias palavras o que é herança na programação orientada a ob jetos Em seguida apresente um exemplo prático em que seu uso é justificado mostrando como uma classe pode reutilizar característi cas de outra Questão 2 Superclasse e Subclasse na Hierarquia diferencie su perclasse e subclasse explicando o papel de cada uma e como elas se relacionam dentro de uma hierarquia de herança Questão 3 Construtores e Herança em Java explique por que os construtores não são herdados em Java e descreva como o constru tor da superclasse pode ser utilizado dentro de uma subclasse por meio da palavrachave super Questão 4 Acesso aos Membros Herdados explique o que acon tece com os atributos e métodos da superclasse quando são herda dos por uma subclasse Todos são acessíveis Descreva as restrições com base nos modificadores de acesso private protected public 11 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 5 Sobrescrita de Método Analisando o Código consid ere o código Questão 6 Hierarquia de Veículos crie a superclasse Veiculo con tendo marca String modelo String método exibirDados Explique o que acontece quando um objeto da classe Cachorro cha ma o método emitirSom analisando o processo de sobrescrita override public class Animal public void emitirSom SystemoutprintlnSom genérico public class Cachorro extends Animal public void emitirSom SystemoutprintlnAu au 12 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Em seguida crie duas subclasses Carro adiciona quantidadePortas Moto adiciona cilindradas Cada subclasse deve possuir seu atributo específico além dos herdados Questão 7 Produtos com Sobrescrita de Métodos crie a super classe Produto contendo marca String preco String método exibirPreco Depois crie duas subclasses Livro adiciona autor Eletronico adiciona garantiaEmMeses Ambas devem sobrescrever o método exibirPreco para incluir seus atributos extras Crie também uma classe Loja que possui um vetor ou lista de produtos e percorra essa lista chamando exibir Preco para cada item demonstrando polimorfismo 13 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS O polimorfismo é um dos pilares fundamentais da Programação Ori entada a Objetos POO ao lado da abstração encapsulamento e herança A palavra polimorfismo tem origem grega e significa mui tas formas No contexto da programação ela se refere à capaci dade de um mesmo método operação ou objeto se comportar de diferentes maneiras dependendo do contexto em que é utilizado Na prática o polimorfismo permite que classes diferentes possam ser tratadas de forma uniforme desde que compartilhem uma mes ma superclasse ou interface Isso possibilita por exemplo que uma variável do tipo de uma superclasse possa referenciar objetos de qualquer uma de suas subclasses tornando o código mais flexível reutilizável e extensível Em Java polimorfismo se manifesta principalmente de duas formas 1 Polimorfismo de Substituição ou de Inclusão permite que ob jetos de subclasses sejam utilizados como se fossem da super classe principalmente ao sobrescrever métodos herdados 2 Polimorfismo por Sobrecarga ocorre quando métodos com o mesmo nome mas diferentes assinaturas coexistem dentro da mesma classe O uso do polimorfismo promove o desenvolvimento de aplicações mais desacopladas e aderentes ao princípio programar para inter faces não para implementações tão valorizado em projetos orien tados a objetos Com ele é possível escrever algoritmos mais genéri cos como coleções e estruturas de dados que operam sobre tipos abstratos e funcionam corretamente com diversas implementações concretas 6 Polimorfismo 14 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Este capítulo abordará os principais conceitos tipos e aplicações do polimorfismo demonstrando sua importância no desenvolvimento de sistemas orientados a objetos robustos e escaláveis Além disso serão apresentados exemplos práticos em Java com foco no uso de herança sobrescrita de métodos e interfaces para reforçar a com preensão desse recurso essencial O polimorfismo é a habilidade de um objeto se comportar de ma neiras diferentes conforme o contexto em que é utilizado Na pro gramação orientada a objetos esse conceito permite que um mes mo método apresente comportamentos distintos dependendo do tipo do objeto que o invoca Em outras palavras polimorfismo signifi ca múltiplas formas de executar uma mesma operação Essa característica é essencial para garantir flexibilidade reutilização e extensibilidade nos sistemas orientados a objetos tornando o códi go mais genérico e menos dependente de implementações especí ficas Em Java um objeto de uma classe não é armazenado diretamente dentro de uma variável o que se armazena é uma referência que aponta para esse objeto Por exemplo uma variável do tipo Fun cionario não contém o objeto em si mas sim uma referência para um objeto do tipo Funcionario No contexto da herança aprendemos que todo Gerente é um tipo de Funcionario já que herda suas características Assim podemos tratar um objeto Gerente como se fosse um Funcionario Por ex emplo se alguém precisa interagir com um Funcionario do banco 61 Conceito de Polimorfismo 15 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS essa pessoa pode se comunicar com um Gerente pois um Gerente é também um Funcionario Essa é a lógica fundamental da herança Polimorfismo é a habilidade de um objeto ser acessado por diferentes tipos de referência Importante destacar que isso não significa que o objeto muda de tipo ao longo do tempo ele nasce e permanece sendo do mesmo tipo O que muda é apenas como nos referimos a ele no código Esse tipo de polimorfismo possibilita que múltiplos métodos compar tilhem o mesmo nome desde que suas assinaturas sejam diferentes isso pode incluir variações na quantidade e no tipo dos parâmetros assim como no tipo de retorno Cabe ao compilador identificar com base na lista de argumentos fornecida qual versão do método deve ser executada Esse mecanismo é conhecido como polimorfismo em tempo de com pilação pois a decisão sobre qual método será chamado ocorre du rante a compilação do programa e não em tempo de execução Na prática ele permite criar métodos sobrecarregados ou seja métodos com o mesmo nome mas com assi naturas diferentes dentro da mes ma classe Veja o Código refcod calculadorasomar 62 Sobrecarga de Método Overloading Fonte Envato 2025 16 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Calculadora public int somarint a int b return a b public double somardouble a double b return a b public int somarint a int b int c return a b c Código 61 Classe Calculadora com sobrecarga de métodos somar Neste exemplo Código refcodcalculadorasomar o método so mar foi sobrecarregado três vezes com diferentes assinaturas O compilador decide qual versão executar com base nos argumentos fornecidos na chamada O polimorfismo de substituição é um dos pilares mais importantes da Programação Orientada a Objetos Ele se baseia na ideia de que um objeto de uma subclasse pode ser tratado como se fosse da sua superclasse e ainda assim executar seu próprio comportamento es pecífico ao sobrescrever métodos herdados 63 Polimorfismo de Substituição Overriding 17 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS class Animal public void emitirSom SystemoutprintlnSom genérico de animal class Gato extends Animal Override public void emitirSom SystemoutprintlnMiau class Cachorro extends Animal Override public void emitirSom SystemoutprintlnAu au Código 62 Exemplo de sobrescrita de método com herança Essa forma de polimorfismo é chamada de polimorfismo em tempo de execução pois a escolha de qual método será executado é feita durante a execução do programa e não no momento da compi lação Quando uma subclasse sobrescreve ou substitui um método da su perclasse e esse método é chamado por meio de uma referência do tipo da superclasse o comportamento da subclasse é o que será executado desde que o método seja marcado com Override cor retamente Veja o Código 62 18 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Main public static void mainString args Animal a1 new Gato Animal a2 new Cachorro a1emitirSom Miau a2emitirSom Au au Código 63 Exemplo de polimorfismo com a classe Animal Testando as classes implementadas no Código 62 temos o Código 63 Mesmo com a variável a1 sendo do tipo Animal o que determina qual versão do método será executada é o tipo real do objeto referenciado nesse caso Gato Atividades Questão 1 Tipos de Polimorfismo em Java diferencie o poli morfismo de sobrecarga overloading do polimorfismo de sobre scrita overriding explicando quando cada um ocorre e como se manifesta na linguagem Java 19 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 2 Polimorfismo na Execução do Código observe o códi go apresentado e explique qual será a saída do programa Justifique sua resposta com base no conceito de polimorfismo de screvendo por que o método chamado é o da classe Gato mesmo quando a referência é do tipo Animal class Animal public void emitirSom SystemoutprintlnSom genérico class Gato extends Animal Override public void emitirSom SystemoutprintlnMiau public class Teste public static void mainString args Animal a new Gato aemitirSom Código 63 Exemplo de polimorfismo com a classe Animal 20 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 3 Prérequisitos do Polimorfismo de Substituição ex plique o que é necessário para que o polimorfismo de substituição ocorra em Java Liste claramente os prérequisitos e apresente um exemplo simples que demonstre esse tipo de polimorfismo em fun cionamento Questão 4 Sobrescrita de Métodos e Polimorfismo explique como o uso de métodos sobrescritos Override está relacionado ao poli morfismo Justifique por que a sobrescrita é essencial para aplicar polimorfismo de forma eficaz em sistemas orientados a objetos Questão 5 Polimorfismo em Funcionários de uma Empresa crie a superclasse Funcionario contendo atributo nome método double calcularSalario retornando 1000 Em seguida crie as subclasses Gerente recebe bônus de R 2000 Vendedor recebe comissão de 10 sobre vendas Estagiario recebe metade do salário base Cada classe deve sobrescrever calcularSalario com compor tamento próprio Por fim na classe principal crie uma lista de Fun cionario e imprima o salário real de cada um usando polimorfismo 21 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 6 Sistema de Mensagens usando Polimorfismo crie a su perclasse Mensagem com o método String formatar Implemente três subclasses MensagemTexto MensagemImagem MensagemVideo Cada classe deve retornar um texto diferente no método formatar por exemplo Texto simples Imagem formatada Vídeo com legenda Depois implemente uma classe SistemaDeMensagens que recebe uma lista de objetos do tipo Mensagem e imprime o resultado de formatar para cada item da lista Questão 7 Polimorfismo em um Sistema de Transporte Urbano você está criando um sistema para gerenciar diferentes veículos usa dos no transporte urbano ônibus vans e carros particulares 1 Defina uma superclasse Veiculo contendo placa marca anoFabricacao método exibirInformacoes 22 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS 2 Crie as subclasses Onibus possui capacidadePassageiros Van possui viagensPorDia CarroParticular possui motorista 3 Indique Quais atributos pertencem à superclasse Quais são exclusivos de cada subclasse Quais métodos serão sobrescritos e o motivo 4 Explique como o polimorfismo pode ser utilizado para armazenar todos os veículos em uma única lista de Veículo e chamar exibir Informacoes de forma genérica exibindo comportamentos dif erentes para cada tipo de veículo 23 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS A abstração é um dos pilares fundamentais da Programação Orien tada a Objetos POO Ela representa a capacidade de um sistema de destacar apenas os aspectos essenciais de um objeto ocultan do detalhes desnecessários e enfatizando o que realmente importa para o seu uso Na vida real fazemos uso constante de abstrações Ao dirigir um carro por exemplo o motorista interage com o volante os peda is e o câmbio sem precisar compreender o funcionamento interno do motor do sistema de ignição ou da injeção eletrônica Em pro gramação ocorre algo semelhante buscamos criar classes que rev elem apenas os comportamentos e características relevantes es condendo a complexidade da implementação interna O principal objetivo da abstração é tornar os sistemas mais simples organizados e reutilizáveis facilitando tanto o desenvolvimento quan to a manutenção do código Ela permite que o programador foque no o que um objeto faz e não no como ele faz Em Java os principais mecanismos para implementar a abstração são Classes abstratas definem comportamentos comuns mas deixam parte da implementação para as subclasses e Interfaces estabelecem contratos que garantem que diferentes classes ofereçam comportamentos compatíveis mesmo que as implementações sejam diferentes Ao longo deste capítulo você aprenderá a utilizar classes abstratas e interfaces para construir sistemas orientados a objetos mais lim pos flexíveis e alinhados aos princípios do bom design de software 7 Abstração 24 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Serão apresentados exemplos práticos comparações entre os me canismos disponíveis e orientações sobre quando empregar cada abordagem de forma mais eficiente Uma classe abstrata é uma classe que não pode ser instanciada di retamente e que tem como principal objetivo servir de base para outras classes Ela é utilizada para representar conceitos genéricos dentro do domínio do problema que serão posteriormente espe cializados pelas subclasses Ela pode conter Atributos e métodos com implementação completa e Métodos abstratos sem corpo os quais devem ser obrigatoria mente implementados pelas subclasses Afinal qual é o propósito da classe Funcionario definida em capítu los anteriores Em nosso sistema existem apenas cargos específi cos como Diretor Gerente e Secretário A classe Funcionario serve apenas como um modelo genérico uma estrutura base No contexto da nossa aplicação não faz sentido criar um objeto do tipo Funcionario diretamente Mesmo que em outros sistemas isso seja válido no nosso não é permitido ter um funcionário sem cargo definido Para impedir a criação direta de objetos dessa classe utilizamos o modificador abstract que a define como abstrata Esse modificador é justamente o que garante que a classe sirva apenas como super classe e não como um tipo de objeto concreto Vejamos no Código 71 abaixo 71 Classe Abstrata 25 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario protected double salario public double getBonificacao return thissalario 12 outros atributos e métodos comuns a todos Funcionarios Exception in thread main javalangError Unresolved compilation problem Cannot instantiate the type Funcionario at brcomcaelumempresaTestaFuncionariomainTestaFuncionariojava5 Código 71 Classe abstrata Funcionario com método de bonificação Caso executássemos instanciação da Classe Funcionario da seguinte forma Funcionario f new Funcionario o seguinte erro seria gerado O Código 71 apresentado anteriormente não é compilado justa mente porque tenta instanciar uma classe abstrata É importante lembrar que embora não seja possível criar objetos diretamente de uma classe abstrata ainda é permitido declarar referências para ela Mas afinal qual é a utilidade de uma classe que não pode ser instan ciada Ela serve como base para outras classes permitindo o uso de herança e polimorfismo dois recursos fundamentais da programação orientada a objetos 26 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario public double getBonificacao return thissalario 14 1000 Código 72 Classe Gerente sobrescrevendo o método de bonificação Sendo assim podemos herdar essa classe e implementar ou sobrescrever o método getBonificacao Então se criar uma classe Gerente que herde a classe Funcionario teremos o Código refcodgerentebonificacao Afinal qual é o benefício prático de utilizar uma classe abstrata Em teoria poderíamos recorrer apenas à herança comum sem mar car a classe como abstrata No entanto o simples fato de impedir a criação de objetos diretamente do tipo Funcionario já representa uma vantagem significativa mantém a coerência e a integridade do sistema É importante destacar que essa escolha é guiada pelo contexto do domínio Em outros sistemas poderia ser perfeitamente válido que uma classe semelhante a Funcionario fosse concreta tudo de pende da natureza do problema que se deseja modelar Mas afinal qual é a utilidade de uma classe que não pode ser instan ciada Ela serve como base para outras classes permitindo o uso de herança e polimorfismo dois recursos fundamentais da programação orientada a objetos 27 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS O esquema acima ilustra uma hierarquia tendo como elemento cen tral a classe abstrata Funcionario Essa classe representa um con ceito genérico que não pode ser instanciado diretamente servindo como base para outras classes mais específicas Ela define atributos e comportamentos comuns a todos os tipos de funcionários As classes Gerente e Presidente herdam diretamente de Funcionario espe cializandose ao sobrescrever ou complementar os métodos herda dos permitindo por exemplo a adição de bônus ou regras de cálculo de salário específicas A classe Diretor por sua vez herda da classe Gerente caracteri zando um caso de herança multinível Essa estrutura favorece a reuti lização de código organização e extensibilidade do sistema Isso tor na o sistema mais flexível permitindo a criação de soluções genéricas e adaptáveis às diferentes especializações dos funcionários Funcionário Gerente Diretor Presidente Um método abstrato é um método declarado mas não implementa do dentro de uma classe abstrata Em outras palavras ele representa uma ação que deve obrigatoriamente ser definida pelas subclasses pois sua lógica específica depende do comportamento particular de cada classe filha Em Java métodos abstratos são declarados usando a palavrachave abstract e não possuem corpo ou seja não incluem chaves nem 711 Métodos Abstratos 28 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario protected String nome protected double salario public FuncionarioString nome double salarioBase thisnome nome thissalarioBase salarioBase Método abstrato public abstract double calcularSalario Código 73 Classe abstrata Funcionario com construtor e método abstrato No exemplo anterior o método calcularSalario é abstrato porque a forma de calcular o salário varia de acordo com o tipo de funcionário A responsabilidade de definir a lógica desse cálculo recai sobre as subclasses que devem implementar o método de acordo com suas regras específicas código dentro delas A presença de pelo menos um método abstrato obriga a classe a ser abstrata também Veja o Código 73 Uma interface é um tipo especial de estrutura em Java que repre senta um contrato de comportamento Ela define um conjunto de métodos que uma classe deve implementar mas não fornece a im plementação desses métodos até o Java 7 Em outras palavras a 72 Interfaces 29 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS interface descreve o que uma classe deve fazer mas não como ela faz Interfaces são um dos principais mecanismos de abstração e poli morfismo na linguagem Java Elas permitem que diferentes classes mesmo sem relação de herança entre si compartilhem comporta mentos comuns e possam ser tratadas de forma genérica Suponha que desejemos tratar as classes Diretor Gerente e Cli ente de forma unificada ou seja identificar algo que todas elas ten ham em comum Se existisse um mecanismo que obrigasse essas classes a implemen tar um método específico como se fosse um contrato isso resolveria a questão As classes de modo geral definem duas coisas O que a classe faz e Como essa classe faz Uma interface define apenas o que o objeto deve ser capaz de fazer sem se preocupar com como isso será feito ou quais atributos serão usados para isso A responsabilidade pela implementação recai sobre as classes que assinam o contrato ou seja que implementam a interface Considerando as classes Funcionario e Gerente podemos criar uma interface que defina um contrato de autenticação Ambas as classes podem ser capazes de autenticar um contrato porém a forma como cada uma realiza essa autenticação pode ser diferente ou em alguns casos uma das classes pode não possuir essa funcionalidade 30 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public interface Autenticavel boolean autenticaint senha Código 74 Interface Autenticavel com método autentica Para representar esse comportamento comum e obrigatório cria mos a interface Autenticavel mostrada no Código 74 31 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Gerente extends Funcionario implements Autenticavel private int senha Outros atributos e métodos Override public boolean autenticaint senha if thissenha senha return false Pode fazer outras possíveis verificações como verificar departamento acesso ao sistema etc return true Código 75 Classe Gerente implementando a interface Autenticavel A classe Gerente pode assinar um contrato ou seja implementar uma interface Código 75 Quando isso acontece ela é obrigada a fornecer a implementação de todos os métodos definidos pela in terface Isso é semelhante a herdar métodos abstratos Vale lembrar que os métodos em interfaces são sempre públicos e abstratos por padrão Para realizar essa implementação em Java utilizamos a palavrachave implements na declaração da classe Ao contrário das classes uma interface pode herdar múltiplas outras interfaces Isso funciona como um contrato que depende de outros contratos serem firmados primeiro para ter validade Nesse tipo de 32 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS herança não são herdados métodos ou atributos concretos mas sim obrigações ou seja a responsabilidade de implementar determina dos comportamentos Interfaces representam uma barreira no aprendizado do Java parece que estamos escrevendo um código o qual não serve para nada uma vez que teremos essa linha a assinatura do método escrita nas nossas classes implementadoras Essa é uma maneira errada de se pensar O objetivo do uso de uma interface é deixar seu código mais flexível e possibilitar a mudança de implementação sem maiores traumas Não é apenas um código de prototipação ou um cabeçalho Questão 1 Conceito de Classe Abstrata explique com suas própri as palavras o que é uma classe abstrata em Java e cite um exemplo de situação em que seu uso é apropriado Questão 2 Função dos Métodos Abstratos explique para que serve um método abstrato dentro de uma classe abstrata diferencian doo de um método concreto e destacando o papel de cada um na hierarquia de classes Atividades 33 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 3 Funcionários com Classe Abstrata considere a classe abstrata abaixo Com base nela crie duas subclasses Professor com sua própria lógica de salário e Coordenador com uma lógica diferente Em seguida implemente uma classe de teste que instancie objetos dessas subclasses e exiba seus salários usando polimorfismo public abstract class Funcionario protected String nome public FuncionarioString nome thisnome nome public abstract double calcularSalario Questão 4 Transporte como Classe Abstrata crie uma hierarquia onde Transporte seja uma classe abstrata contendo um método ab strato mover Depois implemente duas subclasses Bicicleta comportamento próprio para mover Carro comportamento distinto para mover Cada classe deve implementar o método mover adequadamente 34 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 5 Instanciando Classes Abstratas considerando a classe Funcionario responda o código abaixo compila Questão 8 Interface Autenticável com Implementações Distin tas dada a interface Explique o motivo Funcionario f new FuncionarioMaria public interface Autenticavel boolean autenticarString senha Questão 6 Conceito de Interface em Java explique o que é uma interface em Java sua principal finalidade e como ela se diferencia de uma classe abstrata destacando quando cada uma é mais ap ropriada Questão 7 Implementação da Interface Imprimível crie uma in terface chamada Imprimivel contendo o método imprimir Im plemente essa interface nas classes Relatorio e Etiqueta Cada classe deve exibir uma mensagem diferente ao executar o método imprimir 35 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Implemente duas classes UsuarioSistema lógica própria de autenticação Administrador lógica diferenciada de autenticação Cada classe deve definir seu próprio critério dentro do método aut enticar 36 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS DEITEL Paul DEITEL Harvey Java Como Programar 10 ed São Pau lo Pearson 2016 ECKEL Bruce Thinking in Java 4 ed Prentice Hall 2006 HORSTMANN Cay S Conceitos de Computação com Java 5 ed Por to Alegre Bookman 2009 MENDES Douglas Rocha Programação Java com Ênfase em Orien tação a Objetos São Paulo Novatec 2009 NILSSON Per Introdução ao Java São Paulo Érica 2012 SAVITCH Walter Java An Introduction to Problem Solving and Pro gramming 7 ed Pearson 2014 SCHILDT Herbert Java para Iniciantes crie compile e execute pro gramas Java rapidamente 6 ed Porto Alegre Bookman 2015 SIERRA Kathy BATES Bert Use a Cabeça Java 2 ed Rio de Janeiro Alta Books 2014 SOUZA Rafael Santos de ELIAS Vinicius Java e Orientação a Obje tos São Paulo Novatec 2020 REFERÊNCIAS
2
Linguagens de Programação
UMG
11
Linguagens de Programação
UMG
4
Linguagens de Programação
UMG
8
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
2
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
2
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
1
Linguagens de Programação
UMG
Texto de pré-visualização
PROGRAMAÇÃO ORIENTADA A OBJETOS Iniciar Parte 2 Caderno de Estudos Docente Bruno Vicente Alves de Lima 2 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Reitor Prof Dr Walter Canales SantAna ViceReitor Prof Dr Paulo Henrique Aragão Catunda PróReitora De Graduação Profa Dra Mônica Piccolo Almeida Chaves Núcleo de Tecnologias para Educação Profa Dra Lígia Tchaicka Coordenadora Geral Setor de Divisão de Design Educacional Cristiane Peixoto Coord Administrativa Danielle Martins Leite Fernandes Lima Coord Pedagógica Professor Conteudista Prof Dr Bruno Vicente Designer Pedagógico Lidiane Saraiva Ferreira Lima Paulo Brito Oliveira Lira Junior Designer de Linguagem Jéssica Natália Anjos Silva Luisa Mara Silva Lima Geovana Valle Porto Sirino Projeto Gráfico e Diagramação Ivania de Jesus Serra Barroso Normalização José Marcelino Nascimento Veiga Júnior UNIVERSIDADE ESTADUAL DO MARANHÃO UEMA Os materiais produzidos para os cursos ofertados pelo UEMAnetUEMA para o Sistema Universidade Aberta do Brasil UAB são licenciados nos termos da Licença Creative Commons Atribuição Não Comercial Compartilhada podendo a obra ser remixada adaptada e servir para criação de obras derivadas desde que com fins não comerciais que seja atribuído crédito ao autor e que as obras derivadas sejam licenciadas sob a mesma licença 3 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS 5 HERANÇA 51 Introdução à Herança 6 POLIMORFISMO 61 Conceito de Polimorfismo 62 Sobrecarga de Método Overloading 63 Polimorfismo de Substituição Overriding 7 ABSTRAÇÃO 71 Classe Abstrata 711 Métodos Abstratos 72 Interfaces REFERÊNCIAS 04 05 13 14 15 16 23 24 27 28 36 SUMÁRIO 4 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS A Programação Orientada a Objetos POO é um paradigma po deroso que organiza o software em torno de objetos promovendo maior modularidade reutilização e facilidade de manutenção Entre os pilares fundamentais da POO estão a Herança e o Polimorfismo conceitos que trabalham de forma complementar para tornar os sistemas mais flexíveis e reutilizáveis A herança permite que uma classe conhecida como subclasse ou classe derivada herde atributos e comportamentos de outra classe superclasse ou classe base Com isso é possível criar hierarquias de classes onde características comuns são agrupadas e reaproveita das promovendo a reutilização de código e evitando a duplicação Essa estrutura facilita a modelagem de sistemas mais coesos e claros baseados em especializações e generalizações Já o polimorfismo possibilita que diferentes classes respondam de maneira distinta a uma mesma mensagem ou chamada de méto do desde que compartilhem uma interface ou uma superclasse co mum Isso possibilita que objetos de tipos diferentes sejam tratados de forma uniforme tornando o sistema mais genérico extensível e adaptável Em conjunto herança e polimorfismo são fundamentais para a con strução de sistemas robustos dinâmicos e de fácil manutenção Este capítulo tem como objetivo explorar esses dois conceitos apresentar suas aplicações práticas em Java discutir boas práticas e fornecer exemplos reais para consolidar o aprendizado 5 Herança 5 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Antes de começar a programar em Java é importante compreender o ambiente necessário para escrever compilar e executar os progra mas Esse conjunto de ferramentas é chamado de Ambiente de De senvolvimento Além dos funcionários comuns existem também cargos diferentes como o de gerente Embora eles compartilhem as mesmas infor mações básicas de um funcionário comum possuem dados adicion ais e algumas funções específicas Por exemplo um gerente em nosso banco possui uma senha numérica para acessar o sistema interno e também armazena a quantidade de funcionários sob sua supervisão Código 52 Exemplo de modelagem Funcionários e Gerentes Vamos analisar uma situação prática toda empresa possui um banco de funcionários Sabendo disso podemos começar modelando uma classe genérica chamada Funcionario que conterá as informações comuns a todos os colaboradores como mostra no Código 51 51 Introdução à Herança public class Funcionario private String nome private String cpf private double salario métodos devem vir aqui Código 51 Classe Funcionario com atributos privados 6 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Caso fosse necessário criar um novo tipo de funcionário com carac terísticas distintas teríamos que desenvolver uma nova classe e repe tir grande parte do código existente Além disso se quisermos incluir uma nova informação válida para to dos os funcionários teríamos que modificar cada classe separada mente o que não é eficiente pois os dados principais do funcionário não estão centralizados public class Funcionario private String nome private String cpf private double salario private int senha private int numeroDeFuncionariosGerenciados public boolean autenticaint senha if thissenha senha SystemoutprintlnAcesso Permitido return true else SystemoutprintlnAcesso Negado return false outros métodos Código 52 Classe Gerente com método de autenticação 7 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Felizmente em Java é possível estabelecer uma relação entre class es em que uma herda os atributos e comportamentos da outra Essa relação é conhecida como herança entre classe pai e classe filha No nosso exemplo queremos que a classe Gerente tenha tudo o que a classe Funcionario oferece ou seja que a Gerente seja uma ex tensão de Funcionario Para isso usamos a palavrachave extends Veja no Código 53 abaixo Sempre que instanciamos um objeto da classe Gerente ele auto maticamente herda todos os atributos e comportamentos definidos na classe Funcionario public class Gerente extends Funcionario private int senha private int numeroDeFuncionariosGerenciados public boolean autenticaint senha if thissenha senha SystemoutprintlnAcesso Permitido return true else SystemoutprintlnAcesso Negado return false setter da senha omitido Código 53 Classe Gerente herdando de Funcionario com autenticação 8 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Isso ocorre porque um Gerente é uma especialização de um Fun cionario Podemos ver essa representação no esquema abaixo A classe Gerente herda todos os atributos e comportamentos da classe Funcionario que atua como sua classe base No entanto é importante lembrar que nem todos os membros herdados podem ser acessados diretamente Mesmo que os atributos privados sejam herdados a subclasse não tem acesso direto a eles Para permitir esse acesso de forma controlada a superclasse deve disponibilizar méto dos públicos ou protegidos protected que funcionem como uma in terface de comunicação segura Funcionário Gerente public class Main public static void mainString args Gerente gerente new Gerente podemos chamar métodos do Funcionario gerentesetNomeJoão da Silva e também métodos do Gerente gerentesetSenha4231 Código 54 Classe de teste demonstrando herança 9 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS E se for necessário acessar os atributos herdados Não é recomendáv el tornálos public na classe extttFuncionario pois isso permitiria que qualquer parte do código os modificasse diretamente Para es ses casos o Java oferece um modificador intermediário chamado extttprotected que fica entre extttprivate e extttpublic Atributos marcados como extttprotected podem ser acessados pela própria classe por suas subclasses e também por outras classes dentro do mesmo pacote De forma semelhante é possível criar outras subclasses que repre sentam diferentes níveis hierárquicos dentro da empresa Por exemplo podemos definir uma classe Diretor que herda de Gerente enquan to uma classe Presidente pode herdar diretamente de Funcionario como ilustrado no esquema acima É importante destacar que essa escolha faz parte do desenho do sis tema ou seja da modelagem de negócio Definir se a classe Diretor deve herdar de Gerente dependerá da sua lógica isso só faz sentido se você considerar que um Diretor é um tipo de Gerente Vale lembrar que em Java uma classe pode herdar de apenas uma outra classe Esse conceito é conhecido como herança simples Funcionário Engenheiro Diretor Secretário Gerente 10 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Atividades Questão 1 Conceito e Aplicação da Herança explique com suas próprias palavras o que é herança na programação orientada a ob jetos Em seguida apresente um exemplo prático em que seu uso é justificado mostrando como uma classe pode reutilizar característi cas de outra Questão 2 Superclasse e Subclasse na Hierarquia diferencie su perclasse e subclasse explicando o papel de cada uma e como elas se relacionam dentro de uma hierarquia de herança Questão 3 Construtores e Herança em Java explique por que os construtores não são herdados em Java e descreva como o constru tor da superclasse pode ser utilizado dentro de uma subclasse por meio da palavrachave super Questão 4 Acesso aos Membros Herdados explique o que acon tece com os atributos e métodos da superclasse quando são herda dos por uma subclasse Todos são acessíveis Descreva as restrições com base nos modificadores de acesso private protected public 11 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 5 Sobrescrita de Método Analisando o Código consid ere o código Questão 6 Hierarquia de Veículos crie a superclasse Veiculo con tendo marca String modelo String método exibirDados Explique o que acontece quando um objeto da classe Cachorro cha ma o método emitirSom analisando o processo de sobrescrita override public class Animal public void emitirSom SystemoutprintlnSom genérico public class Cachorro extends Animal public void emitirSom SystemoutprintlnAu au 12 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Em seguida crie duas subclasses Carro adiciona quantidadePortas Moto adiciona cilindradas Cada subclasse deve possuir seu atributo específico além dos herdados Questão 7 Produtos com Sobrescrita de Métodos crie a super classe Produto contendo marca String preco String método exibirPreco Depois crie duas subclasses Livro adiciona autor Eletronico adiciona garantiaEmMeses Ambas devem sobrescrever o método exibirPreco para incluir seus atributos extras Crie também uma classe Loja que possui um vetor ou lista de produtos e percorra essa lista chamando exibir Preco para cada item demonstrando polimorfismo 13 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS O polimorfismo é um dos pilares fundamentais da Programação Ori entada a Objetos POO ao lado da abstração encapsulamento e herança A palavra polimorfismo tem origem grega e significa mui tas formas No contexto da programação ela se refere à capaci dade de um mesmo método operação ou objeto se comportar de diferentes maneiras dependendo do contexto em que é utilizado Na prática o polimorfismo permite que classes diferentes possam ser tratadas de forma uniforme desde que compartilhem uma mes ma superclasse ou interface Isso possibilita por exemplo que uma variável do tipo de uma superclasse possa referenciar objetos de qualquer uma de suas subclasses tornando o código mais flexível reutilizável e extensível Em Java polimorfismo se manifesta principalmente de duas formas 1 Polimorfismo de Substituição ou de Inclusão permite que ob jetos de subclasses sejam utilizados como se fossem da super classe principalmente ao sobrescrever métodos herdados 2 Polimorfismo por Sobrecarga ocorre quando métodos com o mesmo nome mas diferentes assinaturas coexistem dentro da mesma classe O uso do polimorfismo promove o desenvolvimento de aplicações mais desacopladas e aderentes ao princípio programar para inter faces não para implementações tão valorizado em projetos orien tados a objetos Com ele é possível escrever algoritmos mais genéri cos como coleções e estruturas de dados que operam sobre tipos abstratos e funcionam corretamente com diversas implementações concretas 6 Polimorfismo 14 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Este capítulo abordará os principais conceitos tipos e aplicações do polimorfismo demonstrando sua importância no desenvolvimento de sistemas orientados a objetos robustos e escaláveis Além disso serão apresentados exemplos práticos em Java com foco no uso de herança sobrescrita de métodos e interfaces para reforçar a com preensão desse recurso essencial O polimorfismo é a habilidade de um objeto se comportar de ma neiras diferentes conforme o contexto em que é utilizado Na pro gramação orientada a objetos esse conceito permite que um mes mo método apresente comportamentos distintos dependendo do tipo do objeto que o invoca Em outras palavras polimorfismo signifi ca múltiplas formas de executar uma mesma operação Essa característica é essencial para garantir flexibilidade reutilização e extensibilidade nos sistemas orientados a objetos tornando o códi go mais genérico e menos dependente de implementações especí ficas Em Java um objeto de uma classe não é armazenado diretamente dentro de uma variável o que se armazena é uma referência que aponta para esse objeto Por exemplo uma variável do tipo Fun cionario não contém o objeto em si mas sim uma referência para um objeto do tipo Funcionario No contexto da herança aprendemos que todo Gerente é um tipo de Funcionario já que herda suas características Assim podemos tratar um objeto Gerente como se fosse um Funcionario Por ex emplo se alguém precisa interagir com um Funcionario do banco 61 Conceito de Polimorfismo 15 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS essa pessoa pode se comunicar com um Gerente pois um Gerente é também um Funcionario Essa é a lógica fundamental da herança Polimorfismo é a habilidade de um objeto ser acessado por diferentes tipos de referência Importante destacar que isso não significa que o objeto muda de tipo ao longo do tempo ele nasce e permanece sendo do mesmo tipo O que muda é apenas como nos referimos a ele no código Esse tipo de polimorfismo possibilita que múltiplos métodos compar tilhem o mesmo nome desde que suas assinaturas sejam diferentes isso pode incluir variações na quantidade e no tipo dos parâmetros assim como no tipo de retorno Cabe ao compilador identificar com base na lista de argumentos fornecida qual versão do método deve ser executada Esse mecanismo é conhecido como polimorfismo em tempo de com pilação pois a decisão sobre qual método será chamado ocorre du rante a compilação do programa e não em tempo de execução Na prática ele permite criar métodos sobrecarregados ou seja métodos com o mesmo nome mas com assi naturas diferentes dentro da mes ma classe Veja o Código refcod calculadorasomar 62 Sobrecarga de Método Overloading Fonte Envato 2025 16 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Calculadora public int somarint a int b return a b public double somardouble a double b return a b public int somarint a int b int c return a b c Código 61 Classe Calculadora com sobrecarga de métodos somar Neste exemplo Código refcodcalculadorasomar o método so mar foi sobrecarregado três vezes com diferentes assinaturas O compilador decide qual versão executar com base nos argumentos fornecidos na chamada O polimorfismo de substituição é um dos pilares mais importantes da Programação Orientada a Objetos Ele se baseia na ideia de que um objeto de uma subclasse pode ser tratado como se fosse da sua superclasse e ainda assim executar seu próprio comportamento es pecífico ao sobrescrever métodos herdados 63 Polimorfismo de Substituição Overriding 17 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS class Animal public void emitirSom SystemoutprintlnSom genérico de animal class Gato extends Animal Override public void emitirSom SystemoutprintlnMiau class Cachorro extends Animal Override public void emitirSom SystemoutprintlnAu au Código 62 Exemplo de sobrescrita de método com herança Essa forma de polimorfismo é chamada de polimorfismo em tempo de execução pois a escolha de qual método será executado é feita durante a execução do programa e não no momento da compi lação Quando uma subclasse sobrescreve ou substitui um método da su perclasse e esse método é chamado por meio de uma referência do tipo da superclasse o comportamento da subclasse é o que será executado desde que o método seja marcado com Override cor retamente Veja o Código 62 18 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Main public static void mainString args Animal a1 new Gato Animal a2 new Cachorro a1emitirSom Miau a2emitirSom Au au Código 63 Exemplo de polimorfismo com a classe Animal Testando as classes implementadas no Código 62 temos o Código 63 Mesmo com a variável a1 sendo do tipo Animal o que determina qual versão do método será executada é o tipo real do objeto referenciado nesse caso Gato Atividades Questão 1 Tipos de Polimorfismo em Java diferencie o poli morfismo de sobrecarga overloading do polimorfismo de sobre scrita overriding explicando quando cada um ocorre e como se manifesta na linguagem Java 19 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 2 Polimorfismo na Execução do Código observe o códi go apresentado e explique qual será a saída do programa Justifique sua resposta com base no conceito de polimorfismo de screvendo por que o método chamado é o da classe Gato mesmo quando a referência é do tipo Animal class Animal public void emitirSom SystemoutprintlnSom genérico class Gato extends Animal Override public void emitirSom SystemoutprintlnMiau public class Teste public static void mainString args Animal a new Gato aemitirSom Código 63 Exemplo de polimorfismo com a classe Animal 20 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 3 Prérequisitos do Polimorfismo de Substituição ex plique o que é necessário para que o polimorfismo de substituição ocorra em Java Liste claramente os prérequisitos e apresente um exemplo simples que demonstre esse tipo de polimorfismo em fun cionamento Questão 4 Sobrescrita de Métodos e Polimorfismo explique como o uso de métodos sobrescritos Override está relacionado ao poli morfismo Justifique por que a sobrescrita é essencial para aplicar polimorfismo de forma eficaz em sistemas orientados a objetos Questão 5 Polimorfismo em Funcionários de uma Empresa crie a superclasse Funcionario contendo atributo nome método double calcularSalario retornando 1000 Em seguida crie as subclasses Gerente recebe bônus de R 2000 Vendedor recebe comissão de 10 sobre vendas Estagiario recebe metade do salário base Cada classe deve sobrescrever calcularSalario com compor tamento próprio Por fim na classe principal crie uma lista de Fun cionario e imprima o salário real de cada um usando polimorfismo 21 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 6 Sistema de Mensagens usando Polimorfismo crie a su perclasse Mensagem com o método String formatar Implemente três subclasses MensagemTexto MensagemImagem MensagemVideo Cada classe deve retornar um texto diferente no método formatar por exemplo Texto simples Imagem formatada Vídeo com legenda Depois implemente uma classe SistemaDeMensagens que recebe uma lista de objetos do tipo Mensagem e imprime o resultado de formatar para cada item da lista Questão 7 Polimorfismo em um Sistema de Transporte Urbano você está criando um sistema para gerenciar diferentes veículos usa dos no transporte urbano ônibus vans e carros particulares 1 Defina uma superclasse Veiculo contendo placa marca anoFabricacao método exibirInformacoes 22 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS 2 Crie as subclasses Onibus possui capacidadePassageiros Van possui viagensPorDia CarroParticular possui motorista 3 Indique Quais atributos pertencem à superclasse Quais são exclusivos de cada subclasse Quais métodos serão sobrescritos e o motivo 4 Explique como o polimorfismo pode ser utilizado para armazenar todos os veículos em uma única lista de Veículo e chamar exibir Informacoes de forma genérica exibindo comportamentos dif erentes para cada tipo de veículo 23 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS A abstração é um dos pilares fundamentais da Programação Orien tada a Objetos POO Ela representa a capacidade de um sistema de destacar apenas os aspectos essenciais de um objeto ocultan do detalhes desnecessários e enfatizando o que realmente importa para o seu uso Na vida real fazemos uso constante de abstrações Ao dirigir um carro por exemplo o motorista interage com o volante os peda is e o câmbio sem precisar compreender o funcionamento interno do motor do sistema de ignição ou da injeção eletrônica Em pro gramação ocorre algo semelhante buscamos criar classes que rev elem apenas os comportamentos e características relevantes es condendo a complexidade da implementação interna O principal objetivo da abstração é tornar os sistemas mais simples organizados e reutilizáveis facilitando tanto o desenvolvimento quan to a manutenção do código Ela permite que o programador foque no o que um objeto faz e não no como ele faz Em Java os principais mecanismos para implementar a abstração são Classes abstratas definem comportamentos comuns mas deixam parte da implementação para as subclasses e Interfaces estabelecem contratos que garantem que diferentes classes ofereçam comportamentos compatíveis mesmo que as implementações sejam diferentes Ao longo deste capítulo você aprenderá a utilizar classes abstratas e interfaces para construir sistemas orientados a objetos mais lim pos flexíveis e alinhados aos princípios do bom design de software 7 Abstração 24 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Serão apresentados exemplos práticos comparações entre os me canismos disponíveis e orientações sobre quando empregar cada abordagem de forma mais eficiente Uma classe abstrata é uma classe que não pode ser instanciada di retamente e que tem como principal objetivo servir de base para outras classes Ela é utilizada para representar conceitos genéricos dentro do domínio do problema que serão posteriormente espe cializados pelas subclasses Ela pode conter Atributos e métodos com implementação completa e Métodos abstratos sem corpo os quais devem ser obrigatoria mente implementados pelas subclasses Afinal qual é o propósito da classe Funcionario definida em capítu los anteriores Em nosso sistema existem apenas cargos específi cos como Diretor Gerente e Secretário A classe Funcionario serve apenas como um modelo genérico uma estrutura base No contexto da nossa aplicação não faz sentido criar um objeto do tipo Funcionario diretamente Mesmo que em outros sistemas isso seja válido no nosso não é permitido ter um funcionário sem cargo definido Para impedir a criação direta de objetos dessa classe utilizamos o modificador abstract que a define como abstrata Esse modificador é justamente o que garante que a classe sirva apenas como super classe e não como um tipo de objeto concreto Vejamos no Código 71 abaixo 71 Classe Abstrata 25 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario protected double salario public double getBonificacao return thissalario 12 outros atributos e métodos comuns a todos Funcionarios Exception in thread main javalangError Unresolved compilation problem Cannot instantiate the type Funcionario at brcomcaelumempresaTestaFuncionariomainTestaFuncionariojava5 Código 71 Classe abstrata Funcionario com método de bonificação Caso executássemos instanciação da Classe Funcionario da seguinte forma Funcionario f new Funcionario o seguinte erro seria gerado O Código 71 apresentado anteriormente não é compilado justa mente porque tenta instanciar uma classe abstrata É importante lembrar que embora não seja possível criar objetos diretamente de uma classe abstrata ainda é permitido declarar referências para ela Mas afinal qual é a utilidade de uma classe que não pode ser instan ciada Ela serve como base para outras classes permitindo o uso de herança e polimorfismo dois recursos fundamentais da programação orientada a objetos 26 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario public double getBonificacao return thissalario 14 1000 Código 72 Classe Gerente sobrescrevendo o método de bonificação Sendo assim podemos herdar essa classe e implementar ou sobrescrever o método getBonificacao Então se criar uma classe Gerente que herde a classe Funcionario teremos o Código refcodgerentebonificacao Afinal qual é o benefício prático de utilizar uma classe abstrata Em teoria poderíamos recorrer apenas à herança comum sem mar car a classe como abstrata No entanto o simples fato de impedir a criação de objetos diretamente do tipo Funcionario já representa uma vantagem significativa mantém a coerência e a integridade do sistema É importante destacar que essa escolha é guiada pelo contexto do domínio Em outros sistemas poderia ser perfeitamente válido que uma classe semelhante a Funcionario fosse concreta tudo de pende da natureza do problema que se deseja modelar Mas afinal qual é a utilidade de uma classe que não pode ser instan ciada Ela serve como base para outras classes permitindo o uso de herança e polimorfismo dois recursos fundamentais da programação orientada a objetos 27 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS O esquema acima ilustra uma hierarquia tendo como elemento cen tral a classe abstrata Funcionario Essa classe representa um con ceito genérico que não pode ser instanciado diretamente servindo como base para outras classes mais específicas Ela define atributos e comportamentos comuns a todos os tipos de funcionários As classes Gerente e Presidente herdam diretamente de Funcionario espe cializandose ao sobrescrever ou complementar os métodos herda dos permitindo por exemplo a adição de bônus ou regras de cálculo de salário específicas A classe Diretor por sua vez herda da classe Gerente caracteri zando um caso de herança multinível Essa estrutura favorece a reuti lização de código organização e extensibilidade do sistema Isso tor na o sistema mais flexível permitindo a criação de soluções genéricas e adaptáveis às diferentes especializações dos funcionários Funcionário Gerente Diretor Presidente Um método abstrato é um método declarado mas não implementa do dentro de uma classe abstrata Em outras palavras ele representa uma ação que deve obrigatoriamente ser definida pelas subclasses pois sua lógica específica depende do comportamento particular de cada classe filha Em Java métodos abstratos são declarados usando a palavrachave abstract e não possuem corpo ou seja não incluem chaves nem 711 Métodos Abstratos 28 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public abstract class Funcionario protected String nome protected double salario public FuncionarioString nome double salarioBase thisnome nome thissalarioBase salarioBase Método abstrato public abstract double calcularSalario Código 73 Classe abstrata Funcionario com construtor e método abstrato No exemplo anterior o método calcularSalario é abstrato porque a forma de calcular o salário varia de acordo com o tipo de funcionário A responsabilidade de definir a lógica desse cálculo recai sobre as subclasses que devem implementar o método de acordo com suas regras específicas código dentro delas A presença de pelo menos um método abstrato obriga a classe a ser abstrata também Veja o Código 73 Uma interface é um tipo especial de estrutura em Java que repre senta um contrato de comportamento Ela define um conjunto de métodos que uma classe deve implementar mas não fornece a im plementação desses métodos até o Java 7 Em outras palavras a 72 Interfaces 29 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS interface descreve o que uma classe deve fazer mas não como ela faz Interfaces são um dos principais mecanismos de abstração e poli morfismo na linguagem Java Elas permitem que diferentes classes mesmo sem relação de herança entre si compartilhem comporta mentos comuns e possam ser tratadas de forma genérica Suponha que desejemos tratar as classes Diretor Gerente e Cli ente de forma unificada ou seja identificar algo que todas elas ten ham em comum Se existisse um mecanismo que obrigasse essas classes a implemen tar um método específico como se fosse um contrato isso resolveria a questão As classes de modo geral definem duas coisas O que a classe faz e Como essa classe faz Uma interface define apenas o que o objeto deve ser capaz de fazer sem se preocupar com como isso será feito ou quais atributos serão usados para isso A responsabilidade pela implementação recai sobre as classes que assinam o contrato ou seja que implementam a interface Considerando as classes Funcionario e Gerente podemos criar uma interface que defina um contrato de autenticação Ambas as classes podem ser capazes de autenticar um contrato porém a forma como cada uma realiza essa autenticação pode ser diferente ou em alguns casos uma das classes pode não possuir essa funcionalidade 30 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public interface Autenticavel boolean autenticaint senha Código 74 Interface Autenticavel com método autentica Para representar esse comportamento comum e obrigatório cria mos a interface Autenticavel mostrada no Código 74 31 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS public class Gerente extends Funcionario implements Autenticavel private int senha Outros atributos e métodos Override public boolean autenticaint senha if thissenha senha return false Pode fazer outras possíveis verificações como verificar departamento acesso ao sistema etc return true Código 75 Classe Gerente implementando a interface Autenticavel A classe Gerente pode assinar um contrato ou seja implementar uma interface Código 75 Quando isso acontece ela é obrigada a fornecer a implementação de todos os métodos definidos pela in terface Isso é semelhante a herdar métodos abstratos Vale lembrar que os métodos em interfaces são sempre públicos e abstratos por padrão Para realizar essa implementação em Java utilizamos a palavrachave implements na declaração da classe Ao contrário das classes uma interface pode herdar múltiplas outras interfaces Isso funciona como um contrato que depende de outros contratos serem firmados primeiro para ter validade Nesse tipo de 32 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS herança não são herdados métodos ou atributos concretos mas sim obrigações ou seja a responsabilidade de implementar determina dos comportamentos Interfaces representam uma barreira no aprendizado do Java parece que estamos escrevendo um código o qual não serve para nada uma vez que teremos essa linha a assinatura do método escrita nas nossas classes implementadoras Essa é uma maneira errada de se pensar O objetivo do uso de uma interface é deixar seu código mais flexível e possibilitar a mudança de implementação sem maiores traumas Não é apenas um código de prototipação ou um cabeçalho Questão 1 Conceito de Classe Abstrata explique com suas própri as palavras o que é uma classe abstrata em Java e cite um exemplo de situação em que seu uso é apropriado Questão 2 Função dos Métodos Abstratos explique para que serve um método abstrato dentro de uma classe abstrata diferencian doo de um método concreto e destacando o papel de cada um na hierarquia de classes Atividades 33 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 3 Funcionários com Classe Abstrata considere a classe abstrata abaixo Com base nela crie duas subclasses Professor com sua própria lógica de salário e Coordenador com uma lógica diferente Em seguida implemente uma classe de teste que instancie objetos dessas subclasses e exiba seus salários usando polimorfismo public abstract class Funcionario protected String nome public FuncionarioString nome thisnome nome public abstract double calcularSalario Questão 4 Transporte como Classe Abstrata crie uma hierarquia onde Transporte seja uma classe abstrata contendo um método ab strato mover Depois implemente duas subclasses Bicicleta comportamento próprio para mover Carro comportamento distinto para mover Cada classe deve implementar o método mover adequadamente 34 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Questão 5 Instanciando Classes Abstratas considerando a classe Funcionario responda o código abaixo compila Questão 8 Interface Autenticável com Implementações Distin tas dada a interface Explique o motivo Funcionario f new FuncionarioMaria public interface Autenticavel boolean autenticarString senha Questão 6 Conceito de Interface em Java explique o que é uma interface em Java sua principal finalidade e como ela se diferencia de uma classe abstrata destacando quando cada uma é mais ap ropriada Questão 7 Implementação da Interface Imprimível crie uma in terface chamada Imprimivel contendo o método imprimir Im plemente essa interface nas classes Relatorio e Etiqueta Cada classe deve exibir uma mensagem diferente ao executar o método imprimir 35 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS Implemente duas classes UsuarioSistema lógica própria de autenticação Administrador lógica diferenciada de autenticação Cada classe deve definir seu próprio critério dentro do método aut enticar 36 PROGRAMAÇÃO ORIENTADA A OBJETOS CADERNO DE ESTUDOS DEITEL Paul DEITEL Harvey Java Como Programar 10 ed São Pau lo Pearson 2016 ECKEL Bruce Thinking in Java 4 ed Prentice Hall 2006 HORSTMANN Cay S Conceitos de Computação com Java 5 ed Por to Alegre Bookman 2009 MENDES Douglas Rocha Programação Java com Ênfase em Orien tação a Objetos São Paulo Novatec 2009 NILSSON Per Introdução ao Java São Paulo Érica 2012 SAVITCH Walter Java An Introduction to Problem Solving and Pro gramming 7 ed Pearson 2014 SCHILDT Herbert Java para Iniciantes crie compile e execute pro gramas Java rapidamente 6 ed Porto Alegre Bookman 2015 SIERRA Kathy BATES Bert Use a Cabeça Java 2 ed Rio de Janeiro Alta Books 2014 SOUZA Rafael Santos de ELIAS Vinicius Java e Orientação a Obje tos São Paulo Novatec 2020 REFERÊNCIAS