·

Análise de Sistemas ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Programação Orientada a Objetos UniSENAI SENAI SENAI DEPARTAMENTO REGIONAL DE SANTA CATARINA MANTENEDORA Fabrizio Machado Pereira Diretor Regional do SENAISC e Diretor de Educação e Tecnologia da FIESC Adriana Paula Cassol Gerente Executiva de Educação Ana Luisa Mulbert Cleunisse Aparecida Rauen de Luca Canto Gestão da Educação Superior CENTRO DE EDUCAÇÃO DIGITAL Fabiano Bachmann Gerente do Centro de Educação Digital CDI Gisele Umbelino Coordenadora de Desenvolvimento de Recursos Digitais CDI Hellen Cristine Geremia Líder de Projeto Nayara Pereira Gonçalves Gustavo Lucas Alves Analista de Educação Digital Felipe Demarchi Autoria Vagner Kugelmeier Tondello Luciano Antonio Costa Revisor Técnico Stephanie Johansen Longo Basso Cinthia Berwanger Pereira Design Educacional Janaina da Silveira Vieira Heliziane Babosa Design Gráfico MANTIDA Barbara Yadira Mellado Perez Proreitora de Ensino Pesquisa e Extensão do Centro Universitário Fabricio Roulin Bittencout Diretor Faculdade Senai Davi Leon Dias Anderson da Rosa Eloy Ilustrações e Tratamento de Imagens Felipe Moisés da Silva Hintz Programação Web André Gonçalves de Freitas Elder Benites Junior Gabriela da Silva Cândido Gabriel Sousa Vieira Isac Diniz Pedro Borrionuevo Nascimento Produção Audiovisual Michele Antunes Corrêa Stephanie Johansen Longo Basso Projeto Educacional Heliziane Barbosa Janaina da Silveira Vieira Juliana Tonietto Projeto Webgráfico MSL Traduções Revisão ortográfica gramatical e normalização IStock Photo Banco de Imagens 2023 SENAI Departamento Regional de Santa Catarina A reprodução total ou parcial desta publicação por quaisquer meios seja eletrônico mecânico fotocópia de gravação ou outros somente será permitida com prévia autorização por escrito do SENAI Sede Rodovia Admar Gonzaga 2765 Itacorubi Florianópolis SC 88034001 Tel 48 32314100 SENAISC Serviço Nacional de Aprendizagem Industrial de Santa Catarina FFICHA CATALOGRÁFICA D372p Demarchi Felipe Programação orientada a objetos Felipe Demarchi Florianópolis SENAISC 2023 472 p il Color ISBN 1 Programação orientada a objetos Computação 2 Java Linguagem de programação de computador 3 Projeto de banco de dados 4 Linguagem de programação de computador I Serviço Nacional de Aprendizagem Industrial Departamento Regional de Santa Catarina II Título III Série CDU 00443 SUMÁRIO Abertura 13 Iniciando no mundo da Orientação a Objetos 15 Para Iniciar 17 Desafio 19 Desafio Desenvolvendo uma classe para gestão de notas 21 Agenda Desafio Desenvolvendo uma classe para gestão de notas 23 Estudo e Prática I Conhecendo o mundo da Orientação a Objetos e a Linguagem de Programação Java 25 Ebook I 25 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 27 Ebook II 49 Iniciando o Desenvolvimento em Java 51 Videoflix 85 Estruturando um Objeto para uma Conta Bancária 85 Conhecendo o Eclipse 85 Primeiro código em Java 86 Variáveis e Tipos de Dados 86 Solicitando e imprimindo valores 86 Estruturas de controle e vetores 86 Infocast 87 Intervalo dos tipos de dados numéricos89 Diferença entre Programação Orientada a Objetos e Programação Estruturada 91 Analisando e definindo a estrutura de um objeto 93 Quero saber 95 Resumindo 97 Estudo e Prática II Primeiros conceitos de Orientação a Objetos 99 Ebook I 99 Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 101 Ebook II 135 Definindo construtores e controlando o acesso às informações do objeto 137 Videoflix 167 Conhecendo o exemplo que será desenvolvido 167 Criando a classe com seus atributos 167 Criando objetos 168 Inserindo os métodos a classe 168 Criando os construtores para a classe 168 Adicionando modificadores de acesso e encapsulamento 168 Infocast 169 Qual a diferença entre classes e objetos 171 Quais as regras que definem uma sobrecarga de métodos 173 Por que o encapsulamento é tão importante 175 Quero saber 177 Resumindo 179 Para Concluir 181 Aprofundando os conceitos de Orientação a Objetos 187 Para Iniciar 189 Desafio 191 Desafio Criando um sistema para gestão imobiliária 193 Agenda Desafio Desenvolvendo uma classe para gestão de notas 197 Estudo e Prática I Relacionando as classes e aplicando herança 199 Ebook I 199 Relacionamento entre Classes 201 Ebook II 221 Herança e Sobrescrita de Métodos223 Videoflix 247 Apresentando a estrutura do projeto 247 Criando as classes Pessoa e Transação 247 Criando as classes que herdam de Pessoa 247 Iniciando a criação da classe conta 248 Finalizando a implementação da classe Conta 248 Finalizando a implementação do projeto 248 Infocast 249 Explicando herança 251 Diferença entre agregação e composição 253 Quero saber 255 Resumindo 257 Estudo e Prática II Polimorfismo e Tratamento de Exceção 259 Ebook I 259 Abstração Interface e Polimorfismo 261 Ebook II 289 Tratamentos de Exceções 291 Videoflix 305 Diagrama da conta bancária atualizado 305 Modificando as estruturas de herança 305 Implementando a estrutura de empréstimo 305 Permitindo adquirir um empréstimo 306 Tratando exceções 306 Infocast 307 Qual a relação entre Polimorfismo e Herança Classes AbstratasInterface 309 Por que é importante realizar o tratamento de exceções 311 Classes Abstratas X Interfaces 313 Quero saber 315 Resumindo 317 Para Concluir 319 Trabalhando com arquivos e acesso a banco de dados 325 Para Iniciar 327 Desafio 329 Gerenciamento de Estoque 331 Agenda Desafio Gerenciamento de Estoque 333 Estudo e Prática I Arquivos e Interface Gráfica 335 Ebook I 335 Trabalhando com arquivos 337 Ebook II 361 Interface Gráfica 363 Videoflix 387 Apresentando o projeto que será desenvolvido 387 Criando a classe ArquivoUtils Parte 1 387 Criando a classe ArquivoUtils Parte 2 387 Criando a tela de Página Inicial 388 Criando a tela de Cadastro 388 Criando a tela de Listar 388 Infocast 389 Diferenças entre o AWT e o Swing 391 Diferença entre os arquivos de texto e os arquivos binários 393 Quero saber 395 Resumindo 397 Estudo e Prática II Conectando ao Banco de Dados 399 Ebook I 399 Configurando a Conexão com o Banco de Dados 401 Ebook II 425 Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 427 Videoflix 451 Apresentando e iniciando o projeto 451 Criando a classe de modelo e iniciando a implementação do padrão DAO 451 Continuando a implementação da estrutura DAO 451 Finalizando a estrutura DAO e definindo o service 452 Finalizando a definição do service e implementando o controller 452 Implementação da interface gráfica 452 Infocast 453 Por que é tão importante definir uma arquitetura de código 455 Explicando o padrão DAO 457 Quero saber 459 Resumindo 461 Para Concluir 463 Fechamento 469 Referências 470 13 Olá estudante Seja bemvindo à Unidade Curricular de Programação Orientada a Objetos Nos estudos anteriores você aprendeu diversos conceitos de desenvolvimento de software na Unidade Curricular de Algoritmos e Programação Agora na Unidade Curricular de Programação Orientada a Objetos iremos aprender como implementar algoritmos utilizando objetos o que nos permite criar uma estrutura bem definida para o nosso código separandoo em arquivos a fim de melhorar a legibilidade e a manutenção do sistema Esses conceitos de Orientação a Objetos são de grande importância para um profissional da área de Análise e Desenvolvimento de Sistemas pois serão a base para o desenvolvimento de algoritmos e sistemas mais complexos Outro fator relevante é que hoje a grande maioria das linguagens de programação permite um desenvolvimento orientado a objetos Durante os seus estudos você irá acompanhar o desenvolvimento de um projeto no qual iremos aplicar os conceitos de Orientação a Objetos desde a criação de classes e objetos até a utilização de conceitos como Herança e Polimorfismo E ao final nós iremos desenvolver aplicações que sejam capazes de realizar a Manipulação de Arquivos assim como aplicações que serão capazes de se comunicar com um Banco de Dados para realizar a gravação e a leitura de dados Então vamos mergulhar neste universo da Programação Orientada a Objetos para aprendermos a desenvolver grandes sistemas projetandoos com a capacidade de serem mantidos e de continuarem a se expandir Bons estudos ABERTURA Iniciando no mundo da Orientação a Objetos 17 Olá estudante Seja bemvindo aos estudos sobre Programação Orientada a Objetos Para você iniciar no mundo da Programação Orientada a Objetos primeiramente você precisa compreender os conceitos que formam sua base Esse é um dos focos desta etapa na qual além desses conceitos você também começará a compreender como é desenvolvido um pensamento voltado para o paradigma de Orientação a Objetos Para isso iremos trabalhar com cenários do nosso dia a dia para a partir disso compreendermos como transformar os itens desse cenário em objetos para a programação Na sequência você irá conhecer um pouco sobre a linguagem de programação Java a qual será utilizada no decorrer deste estudo Você também aprenderá a realizar a instalação do Java assim como das ferramentas necessárias para o desenvolvimento de software utilizando essa linguagem de programação Após tudo configurado você irá compreender como é o funcionamento da ferramenta de desenvolvimento e criará o primeiro código nessa linguagem de programação Por fim você aprenderá os primeiros conceitos de desenvolvimento da Programação Orientada a Objetos iniciando por Classes Objetos Atributos e Métodos para então seguir para conceitos como sobrecarga de métodos Modificadores de Acesso Encapsulamento e construtores Para cada um destes conceitos será realizado um exemplo prático para demonstrar como é feita a implementação desse conceito Bons estudos PARA INICIAR 19 Confira a seguir uma situação prática relacionada aos conteúdos que você estudará a partir de agora Esta é uma importante etapa de seu processo avaliativo Então dediquese ao máximo e busque em sua trajetória de estudos aqui fundamentar os resultados esperados no desafio que está proposto a seguir Aproveite pois essa é uma grande oportunidade de praticar novos conhecimentos Desafio Auxiliando no desenvolvimento de um sistema para a gestão de uma universidade Para fortalecer as capacidades e os conhecimentos que serão abordados neste módulo você terá o desafio de compor uma equipe de desenvolvimento que irá auxiliar na implementação de uma funcionalidade que está contida em um cenário maior Com isso você poderá começar a se habituar com o dia a dia de trabalho de um desenvolvedor de software que tem um cenário muito semelhante ao apresentado neste desafio O intuito deste desafio é que você possa ter uma experiência prática dos conhecimentos adquiridos ao longo deste estudo pois desenvolver uma competência significa justamente ter a habilidade de utilizar os conceitos aprendidos dentro do nosso contexto pessoal e profissional de forma efetiva e eficaz Lembrese esteja atento a todos os detalhes indicados no Desafio e na Agenda pois tratase de uma parte importante de seu processo avaliativo nestes estudos DESAFIO 21 Comunicação Oral e Escrita 21 A empresa onde você trabalha foi contratada para realizar o desenvolvimento de um software de gestão para uma universidade Entre as atividades necessárias para a criação desse software foi designado a você o desenvolvimento da classe de Matrícula que deve conter as seguintes características e funcionalidades Armazenar o nome do aluno Armazenar o nome da disciplina Armazenar o valor referente à primeira nota obtida Esse valor poderá ser entre 0 zero e 10 dez incluindo valores com vírgula Armazenar o valor referente à segunda nota obtida Esse valor poderá ser entre 0 zero e 10 dez incluindo valores com vírgula Armazenar o valor referente à terceira nota obtida Esse valor poderá ser entre 0 zero e 10 dez incluindo valores com vírgula Desafio Desenvolvendo uma classe para gestão de notas Comunicação Oral e Escrita 22 22 Uma ação para calcular a média final do aluno considerando o mesmo peso para todas as notas Ao final essa ação deve retornar o resultado do cálculo Uma ação para calcular a média final do aluno enviando por parâmetro o peso de cada nota para ser utilizado no cálculo Ao final essa ação deve retornar o resultado do cálculo Uma ação sem retorno para imprimir as informações referentes à matrícula no seguinte formato Nome do Aluno Valor referente ao nome do aluno Nome da Disciplina Valor referente ao nome da disciplina Média Final Valor da média final obtida pelo aluno Para construir um objeto a partir da classe Matrícula deve ser obrigatório informar o Nome do Aluno e o Nome da Disciplina A classe deve estar encapsulada e as seguintes regras devem ser seguidas ao atribuir uma nova nota para o aluno Caso a nota for menor do que 0 zero devese atribuir o valor 0 zero para a nota Caso a nota for maior do que 10 dez devese atribuir o valor 10 dez para a nota Caso a nota esteja entre 0 zero e 10 dez devese atribuir o valor enviado por parâmetro para a nota Lembrese de consultar a agenda e conferir os detalhes do desafio como resultado esperado forma de desenvolvimento critérios de avaliação e forma de entrega 23 AGENDA Desafio Desenvolvendo uma classe para gestão de notas Resultado esperado O resultado esperado é a implementação da classe Matrícula utilizando a linguagem de programação Java atendendo a todas as características e funcionalidades solicitadas Desenvolvimento Individual Confirmar com o professortutor Critérios de avaliação Criar a classe Matrícula Criar um atributo para o Nome do Aluno definindo um tipo de dado de acordo com o tipo de informação que será armazenada no atributo Criar um atributo para o Nome da Disciplina definindo um tipo de dado de acordo com o tipo de informação que será armazenada no atributo Criar um atributo para a Primeira Nota definindo um tipo de dado de acordo com o tipo de informação que será armazenada no atributo Criar um atributo para a Segunda Nota definindo um tipo de dado de acordo com o tipo de informação que será armazenada no atributo Criar um atributo para a Terceira Nota definindo um tipo de dado de acordo com o tipo de informação que será armazenada no atributo Criar um método que realiza o cálculo da média considerando o mesmo peso para todas as notas retornando ao final o resultado do cálculo Criar um método que realiza o cálculo da média recebendo por parâmetro os pesos para cada nota retornando ao final o resultado do cálculo Criar um método sem retorno que imprime os dados de matrícula apresentando o Nome do Aluno Nome da Disciplina e Média Final Criar apenas um construtor o qual recebe o Nome do Aluno e Nome da Disciplina para criação do objeto 24 Realizar o encapsulamento da classe Ao atribuir um valor para a Primeira Nota realizar o tratamento para não atribuir notas menores que 0 zero e maiores que 10 dez Ao atribuir um valor para a Segunda Nota realizar o tratamento para não atribuir notas menores que 0 zero e maiores que 10 dez Ao atribuir um valor para a Terceira Nota realizar o tratamento para não atribuir notas menores que 0 zero e maiores que 10 dez Nomear a classe atributos e métodos respeitando as convenções da linguagem Entregar atividade conforme prazo estabelecido Forma de entrega Arquivo com o código desenvolvido com a extensão java a ser entregue em ferramenta do Ambiente Virtual de Aprendizagem AVA 25 Para iniciar você irá compreender os conceitos referentes ao paradigma de Programação Orientada a Objetos com exemplos que demonstrem como compreender a representação de um objeto Junto a isso você verá como realizar as instalações dos softwares necessários para o desenvolvimento como o Java e o Eclipse ESTUDO E PRÁTICA I CONHECENDO O MUNDO DA ORIENTAÇÃO A OBJETOS E A LINGUAGEM DE PROGRAMAÇÃO JAVA No primeiro ebook você compreenderá o conceito de Programação Orientada a Objetos e verá diversos exemplos que demonstram o processo com base em um item do mundo real de como realizar a conversão para representar esse item na Programação Orientada a Objetos Já no segundo ebook você irá ver um pouco mais sobre a linguagem de programação Java o porquê da utilização dessa linguagem de programação no decorrer deste estudo e como realizar a instalação do Java no seu computador assim como do Eclipse para realizar o desenvolvimento do código Você já aprendeu a desenvolver utilizando algoritmos sequenciais o que também chamamos de Programação Estruturada Para isso você aprendeu a desenvolver algoritmos com grande complexidade lógica para os quais é criado um grande arquivo com diversas linhas contendo todo o código necessário para a perfeita execução desse algoritmo E essa foi a sua porta de entrada para o mundo da programação de computadores Agora você irá aprender uma nova abordagem para o desenvolvimento de software o qual chamamos de Programação Orientada a Objetos que tem como princípio garantir uma melhor organização do código facilitando assim a manutenção desse código Ebook 26 Com esse conceito você irá aprender a desenvolver códigos que permitam a adição de novas funcionalidades ou a alteração de funcionalidades já existentes de forma simples sem a necessidade de modificar inúmeros pontos do algoritmo Neste ebook você aprenderá sobre o conceito da Orientação a Objetos e terá a possibilidade de compreender como fazer a conversão de um objeto da vida real para um objeto no paradigma de Programação Orientada a Objetos Para isso você irá analisar um objeto para compreendêlo o que irá simplificar o processo quando você precisar converter esse objeto para uma classe atendendo aos principais conceitos de Programação Orientada a Objetos Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 28 A Programação Orientada a Objetos é um paradigma de programação implementado por diversas linguagens de programação da atualidade e para compreender esse conceito é de grande importância compreender a definição de um objeto no desenvolvimento de software Por isso que aqui você compreenderá como representar um objeto do mundo real em um objeto do mundo da programação compreendendo todos os principais conceitos que definem um objeto Junto a isso você conhecerá um pouco da história das linguagens de programação que utilizam do conceito de orientação a objetos CONCEITOS DE ORIENTAÇÃO A OBJETOS Quando iniciamos no mundo do desenvolvimento de software o primeiro paradigma de programação que aprendemos é o de Programação Estruturada Esse conceito consiste basicamente em criar um algoritmo sequencial utilizando de forma global as variáveis e estruturas de controle como comandos de decisão e repetição Nesse paradigma geralmente todo o código é escrito em um único arquivo podendo ser dividido em funções para ajudar na sua legibilidade Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 29 Outro paradigma de programação muito difundido atualmente é o Orientado a Objetos o qual busca trazer uma maior proximidade entre o mundo real e o desenvolvimento de software Para atingir esse objetivo o conceito de objeto é muito forte nesse paradigma pois aqui o intuito é representar qualquer coisa tangível como um objeto MANZANO COSTA JUNIOR 2014 É muito comum você presenciar discussões sobre qual o melhor paradigma de programação porém é importante compreender que cada paradigma irá se encaixar melhor a determinados cenários A programação estruturada é muito utilizada quando falamos de performance pois executa o seu código de forma sequencial sem muitos desvios Ao desenvolver utilizando esse conceito geralmente seguimos uma lógica bem definida para um contexto específico por exemplo uma receita de bolo em que temos uma sequência lógica para a produção daquele bolo porém se você tentar utilizar essa mesma receita para pintar uma parede o resultado não será o esperado Dessa forma conseguimos saber sem a necessidade de muita análise o que vai acontecer na sequência do código Um cenário comum para a utilização da programação estruturada é o desenvolvimento de sistemas embarcados porque estarão sendo executados em máquinas com hardware muito restrito por exemplo uma máquina de lavar louça Atenção Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 30 A programação Orientada a Objetos é mais utilizada quando precisamos representar um cenário mais próximo do nosso mundo real por exemplo um sistema de gestão de estoque de uma empresa Veja que nesse cenário buscaremos representar uma situação do nosso universo em códigos de programação em que será preciso representar os produtos os locais onde esses produtos estão armazenados os funcionários que estão manuseando esses produtos entre diversos outros pontos Outro ponto que torna a Programação Orientada a Objetos mais interessante para esse cenário é que permitirá uma maior abstração do código ou seja será possível criar um código para representar um produto que poderá ser utilizado para criar diferentes tipos de produtos que possuam os mesmos tipos de características a serem definidos tornando assim mais fácil a manutenção desse código Para uma melhor compreensão do conceito de Objeto vamos utilizar como base esta imagem de um veículo a fim de visualizarmos o que seria necessário para pensar em um objeto dentro do contexto de Programação Orientada a Objetos para representar esse objeto referente ao nosso mundo real Figura 1 Imagem de um veículo para visualização do que seria necessário para pensar em um objeto Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 31 Segundo Araújo 2008 todo objeto será representado pelas características que o compõe e pelas ações que pode realizar Vamos iniciar pelas características que formam esse objeto as quais serão divididas em dois tipos As características que serão utilizadas para de fato caracterizar o objeto são as seguintes Cor Marca Modelo Ano de Fabricação Ano do Modelo Além disso também é possível definir um outro tipo de características as quais poderão representar estados desse objeto tais como Velocidade Atual Marcha Atual Veículo Ligado Agora que já temos as características desse objeto o próximo passo é definirmos quais ações esse objeto pode realizar Pensando em um veículo este pode acelerar o que fará com que o valor referente à característica que chamamos de velocidade aumente e também pode frear o que fará com que o valor referente à característica de velocidade diminua Outra ação que esse objeto pode realizar é trocar de marcha o que irá gerar impacto na característica referente à marcha atual do carro As ações muitas vezes irão modificar ou fazer uso dos estados do nosso objeto ou seja ao realizar uma ação esta irá modificar o valor de uma característica como foi o caso das ações de acelerar frear e trocar de marcha ou irá utilizar os valores de algumas características do objeto para apresentar informações como é o caso da ação de apresentar dados Outro cenário muito comum é para que ao executar uma ação o objeto utilize informações referentes a algumas características para definir como será a alteração de outras características Por exemplo vimos que ao executar a ação de acelerar o carro irá aumentar o valor referente à velocidade do veículo porém apenas fará sentido que isso aconteça se este estiver ligado certo Portanto pode ser feita uma verificação antes de aumentar a velocidade para confirmar se o veículo realmente está ligado antes de realizar essa ação Com esse exemplo o objetivo era que você conseguisse compreender o processo ao visualizar um objeto do mundo real de como identificar as características e ações para começarmos a visualizar esse objeto no mundo da programação É muito importante que você tenha compreendido esse processo pois no decorrer deste ebook iremos voltar a utilizar esse objeto que construímos para compreender outros conceitos da Programação Orientada a Objetos Mão na massa Agora que você conheceu o processo de conversão de um objeto do tipo carro do mundo real para um objeto do mundo da programação realize a conversão de um objeto do tipo laptop do mundo real para um objeto do mundo da programação Lembrese de definir as características desse objeto tanto as de informação quanto as de estado e também as ações que esse objeto poderá realizar Para que uma linguagem de programação seja considerada Orientada a Objetos esta precisa atender a alguns requisitos os quais são chamados de Os 4 quatro pilares da Programação Orientada a Objetos compostos por Abstração Encapsulamento Herança e Polimorfismo Iremos verificar de forma simples o que esses conceitos representam aplicandoos ao exemplo do veículo demonstrado anteriormente e estudaremos esses conceitos mais a fundo no decorrer deste estudo 33 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 33 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 34 ABSTRAÇÃO O desenvolvimento Orientado a Objetos utiliza muito como base o princípio da abstração que consiste na habilidade de modelar características do nosso mundo real Ao pensar no objeto referente ao veículo levamos em consideração características e ações que podem ser atribuídas a qualquer tipo de veículo isto é o que consideramos a abstração na Orientação a Objetos Para exemplificar pense na estrutura que pensamos para os objetos referentes ao veículo A partir das características e ações definidas podemos criar objetos pensando em veículos de montadoras diferentes ou até mesmo de estruturas diferentes como um carro e uma moto ambos podem ser criados como objetos a partir da estrutura de veículo definida ARAÚJO 2008 ENCAPSULAMENTO O encapsulamento consiste em restringir o acesso a algumas informações referentes ao objeto quando acessadas a partir de outros objetos Em outras palavras esse conceito restringe o acesso a algumas de suas informações quando acessados por objetos que estejam em outro contexto ARAÚJO 2008 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 35 Utilizando o exemplo do veículo para esclarecer melhor o conceito pense que quando um motorista que seria um objeto em outro contexto quiser acelerar ou frear este não precisa saber tudo o que acontece dentro do objeto veículo para garantir que a aceleração aconteça Tudo o que o motorista precisa saber é que ao executar a ação de acelerar a característica referente à velocidade irá aumentar Porém dentro do objeto veículo essa ação de acelerar pode realizar inúmeras validações ou utilizar de diversos valores referentes às suas características para definir quão rápida será essa aceleração ou até se o veículo ainda consegue aumentar a sua aceleração ou se irá apenas manter uma constante Portanto ao guardar apenas para si todo o processo e todos os detalhes que definem como irá acontecer a aceleração o objeto veículo está utilizando do conceito de encapsulamento E como você pode observar o objeto motorista apenas precisará saber que existe uma ação chamada acelerar e que ao chamar essa ação a velocidade do carro irá aumentar Esse conceito ajuda a setorizar as responsabilidades de cada objeto isolando partes do código facilitando assim a manutenção do código Para identificar isso melhor pense na situação em que seja realizada uma melhoria no processo de aceleração dos veículos Neste cenário seria preciso apenas modificar o código dentro do objeto veículo o que já irá modificar o comportamento de todos Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 36 os veículos criados a partir da estrutura desse objeto Porém se o processo de aceleração não fosse encapsulado e o objeto motorista pudesse realizar alterações dentro desse processo de aceleração seria necessário também modificar todos esses objetos que estariam modificando a estrutura HERANÇA A herança consiste na possibilidade de um objeto herdar características e ações de outro objeto Quando temos muitos objetos que possuem características e ações semelhantes com apenas algumas diferenças podemos pensar em uma estrutura onde temos um objeto mais generalizado o qual concentra todas essas características e ações comuns E a partir desse objeto generalizado é possível definir diversos objetos mais especializados os quais irão herdar as características e ações do objeto mais genérico juntando as características e ações específicas desse objeto ARAÚJO 2008 Retornando para o exemplo do veículo você viu quando falamos de abstração que a partir dessa estrutura de veículo que definimos é possível criar um carro ou uma moto certo Aqui entra o conceito de generalização e especialização que define a herança Por mais que seja possível criar esses dois tipos de veículo utilizando o objeto mais genérico tanto o carro quanto a moto terão características e ações que são específicas de cada um ou seja podemos pensar em objetos mais especializados para cada tipo de veículo Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 37 Pensando na diferença entre esses dois tipos de veículos se pensarmos nas características do carro este pode ter airbags e estepe que são características que não fazem parte de uma moto Nesse caso essas seriam adicionadas apenas ao objeto carro o qual herdaria todas as informações já definidas para o veículo e juntaria a isso essas duas características apresentadas Outra implementação que também é possível realizar é a personalização das ações para cada tipo de veículo Vimos anteriormente que o encapsulamento restringe o acesso a algumas informações porém ao trabalhar com herança os objetos mais específicos herdarão as ações dos objetos mais genéricos permitindo também realizar alterações na implementação dessas ações Portanto é possível definirmos uma lógica de aceleração para o objeto carro e outra lógica para o objeto moto Como foi possível observar a herança é um conceito que nos ajuda a modelar os nossos objetos com um nível de abstração ainda maior separando de forma mais específica as responsabilidades entre as implementações dos objetos POLIMORFISMO O polimorfismo consiste em trabalharmos com um objeto mais genérico porém obtendo informações com base nas implementações dos objetos mais especializados ARAÚJO 2008 Para que possamos compreender de forma simples como funciona esse conceito vamos pensar em um novo contexto para trabalhar com o nosso objeto veículo De tempos em tempos será necessário abastecer esse veículo e para isso será preciso interagir com um objeto denominado Posto de Combustível Para realizar o abastecimento não é preciso que o Posto de Combustível saiba qual o tipo específico de veículo Para esse objeto seja um carro ou uma moto o processo é exatamente o mesmo será adicionado combustível dentro de um tanque Com base nesse cenário é possível perceber que o objeto Posto de Combustível pode visualizar todos os veículos de uma forma genérica não sendo preciso criar uma ação de abastecimento no Posto de Combustível para cada tipo mais especializado Será criada apenas uma ação para realizar o abastecimento de um veículo e esse veículo a ser informado para o posto de combustível pode ser de qualquer tipo sendo visualizado pelo posto apenas como um simples veículo Em outras palavras o polimorfismo consiste em enviar objetos em diferentes formatos para receber um mesmo resultado como no exemplo apresentado indiferentemente se tivermos uma moto ou um carro iremos enviar esse objeto como um veículo para o posto de combustível que conseguirá executar a sua ação sem precisar saber qual é o tipo específico desse veículo Esses 4 quatro pilares apresentados são a base da Programação Orientada a Objetos Por conta disso todas as linguagens de programação que se caracterizam como Orientadas a Objetos devem permitir a implementação desses pilares Agora que você já compreendeu o que é um objeto como criar um objeto no mundo da programação a partir de um objeto do mundo real e como funcionam os principais pilares da orientação a objetos o próximo passo é conhecermos algumas das linguagens que permitem o desenvolvimento orientado a objetos Dica Lembrese de sempre que for imaginar um objeto no mundo da Programação Orientada a Objetos imagineo da forma mais abstrata possível O motivo é que você sempre irá construir um template que deve servir como base para todos os objetos desse mesmo tipo sempre pensando em suas características e ações e com isso deverá ser possível criar qualquer objeto que corresponda ao contexto modificando apenas os valores das características LINGUAGENS DE PROGRAMAÇÃO COM SUPORTE À ORIENTAÇÃO A OBJETOS O conceito de programação orientada a objetos teve origem a partir da década de 1960 pois nesse período já se demonstrava uma grande preocupação com o reaproveitamento de código e com o tempo de desenvolvimento A primeira linguagem de programação orientada a objetos foi denominada SIMULA I e foi criada em 1965 pelos pesquisadores OlenJohan Dahl e Kristen Nygaard sendo uma linguagem desenvolvida para o computador UNIVAC Universal Automatic Computer Posteriormente em 1967 lançaram uma nova versão dessa linguagem de programação a qual chamaram de SIMULA 67 MANZANO COSTA JUNIOR 2014 Entre os anos de 1968 e 1972 surgiram as linguagens de programação PASCAL e C as quais utilizavam do conceito de programação estruturada e não possuíam suporte para orientação a objetos Posteriormente essas linguagens serviram de base para a criação de duas novas linguagens de programação o OBJECT PASCAL e o C as quais trouxeram como diferencial o suporte à programação orientada a objetos Outras linguagens de programação com suporte à orientação a objetos que surgiram nesse período e que importam citar foram a SMALLTALK e a ADA Entre as linguagens até aqui citadas a que permanece sendo amplamente utilizada atualmente é o C MANZANO COSTA JUNIOR 2014 39 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 39 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 40 A partir da década de 1980 as linguagens de programação orientadas a objetos começam a surgir com maior frequência Vamos conhecer aqui algumas das principais linguagens que foram criadas e que permanecem em utilização até os dias atuais ObjectiveC Foi desenvolvida no início da década de 80 e teve como principais criadores Brad Cox e Tom Love A linguagem foi adquirida pela empresa NeXT que posteriormente foi comprada pela Apple fazendo com que esta se tornasse a linguagem de programação base para todos os sistemas operacionais da empresa DEITEL DEITEL 2016 Perl Desenvolvida em 1987 por Larry Wall é uma das linguagens de script orientada a objetos mais utilizadas para a Web DEITEL DEITEL 2016 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 41 Python Lançado publicamente em 1991 foi desenvolvido por Guido van Rossum no Instituto Nacional de Pesquisa para Matemática e Ciência da Computação em Amsterdã É uma linguagem de script multiparadigma que suporta a utilização de orientação a objetos e é amplamente utilizada na atualidade DEITEL DEITEL 2016 PHP Uma linguagem de script com códigofonte aberto que foi criada em 1995 por Rasmus Lerdorf Inicialmente a linguagem não apresentava suporte à Orientação a Objetos passando a permitir o uso desse paradigma a partir do PHP3 lançado em 1998 DEITEL DEITEL 2016 JavaScript Podemos dizer que esta é a linguagem de script mais utilizada atualmente Surgiu no final de 1995 e foi criado por Brendan Eich a pedido da empresa Netscape Esta é uma linguagem de programação multiparadigma que possui suporte para orientação a objetos DEITEL DEITEL 2016 C Foi criada no ano 2000 pela empresa Microsoft e é uma linguagem de programação multiparadigma com suporte à orientação a objetos Teve como base a linguagem de programação C mas também possui muita influência de outras linguagens como o OBJECT PASCAL e o JAVA DEITEL DEITEL 2016 Como é possível observar as principais linguagens de programação com suporte ao paradigma de orientação a objetos surgiram a partir da década de 90 com algumas exceções como ObjectiveC e Pearl que foram criadas na década anterior O Java é uma linguagem de programação com suporte à orientação a objetos da qual ainda não falamos isso porque iremos dedicar o restante deste ebook a essa linguagem a qual utilizaremos durante todo este estudo De acordo com Deitel e Deitel 2016 o Java surgiu de um projeto de pesquisa corporativa interna financiado pela empresa Sun Microsystem em 1991 o qual foi chefiado por James Gosling O principal objetivo da criação dessa linguagem de programação era tornar possível escrever um programa de computador que possa ser executado em qualquer dispositivo computacional Um termo muito comum utilizado para esse conceito é escreva uma vez execute em qualquer lugar 42 A linguagem de programação se popularizou e se tornou uma das mais utilizadas para o desenvolvimento de sistemas computacionais o que levou a empresa Oracle no ano de 2010 a adquirir os direitos referentes a essa linguagem Hoje o Java é utilizado para o desenvolvimento de sistemas de grande porte principalmente voltados para o contexto Web e também para o desenvolvimento de aplicativos de smartphones tablets e televisões DEITEL DEITEL 2016 Diferentemente da maioria das outras linguagens de programação o Java não é compilado para código nativo que é um código executado diretamente pelo computador Um código desenvolvido em Java é compilado para um bytecode o que podemos dizer que é uma forma intermediária de código e este será executado por uma máquina virtual a qual possui o nome de Java Virtual Machine ou de forma abreviada JVM Esse processo de compilação permite que o Java seja totalmente multiplataforma pois indiferentemente do Sistema Operacional a execução será realizada a partir da máquina virtual Na sequência serão apresentados os principais passos para a criação e execução de uma aplicação Java DEITEL DEITEL 2016 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 1º Passo Consiste em criar o código fonte que representa o programa em Java a ser desenvolvido Este código pode ser criado a partir de qualquer editor de texto de qualquer Sistema Operacional Outra opção é utilizar os Ambientes de Desenvolvimento Integrado também conhecidos como IDEs por exemplo Eclipse Netbeans ou IntelliJ IDEA A vantagem de se utilizar uma IDE são as facilidades que trazem para o desenvolvimento do código com funções de autocompletar e diversas teclas de atalho além de permitir compilar e executar a aplicação de forma simples e rápida DEITEL DEITEL 2016 Ao criar um código em Java é preciso salvar o código em um arquivo com a extensão java essa é a forma de se identificar que um determinado arquivo representa o código de uma aplicação Java 2º Passo Após criar e salvar o código fonte a próxima etapa consiste em compilar este código para bytecode que vimos anteriormente que representa uma forma intermediária de código O responsável pela realização da compilação do código é o javac e este pode ser chamado diretamente a partir do prompt de comando ou terminal do seu Sistema Operacional DEITEL DEITEL 2016 Para exemplificar você pode criar um arquivo com o nome Testejava utilizando qualquer editor de texto com o código apresentado a seguir para o qual não vamos entrar em detalhes neste momento mas a sua função será apresentar a mensagem Olá Mundo na console ao executar o código public class Exemplo public static void mainString args SystemoutprintlnOlá Mundo 43 Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 44 Na sequência para compilar o código será preciso abrir o prompt de comando ou terminal do seu Sistema Operacional e acessar a pasta na qual foi criado o exemplo para então digitar o seguinte código javac Testejava Esse comando irá dar início ao processo de compilação que transformará o código que escrevemos usando a linguagem de programação Java em um bytecode e este será salvo em um arquivo de mesmo nome no mesmo diretório porém com a extensão class Caso exista algum erro no código salvo no arquivo com extensão java gerará um erro no processo de compilação sendo necessário realizar a correção do código para ser possível finalizar a compilação 3º Passo Após criar e compilar o código a última etapa consiste na execução da aplicação Para isso a Java Virtual Machine faz uso do arquivo gerado em bytecode no caso o arquivo com extensão class A execução pode ser feita também pelo Prompt de Comando ou Terminal do seu Sistema Operacional só que agora utilizase o seguinte comando DEITEL DEITEL 2016 java Teste Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 45 Com isso estamos indicando a Java Virtual Machine que deve iniciar a execução da aplicação utilizando o arquivo Testeclass porém aqui não é necessário indicar a extensão Mão na massa É preciso que você realize a instalação do Java na sua máquina para que consiga implementar os códigos de exemplo e realizar os exercícios referentes a estes estudos Para isso você deve realizar o download e instalação do Java Development Kit JDK que você encontra no link a seguir ou através do código QR httpswwwjavacomptBRdownloadhelp downloadoptionsptbrhtml E para auxiliar no processo segue uma referência de leitura que irá contribuir para essa instalação Seção Antes de Começar do livro DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 Neste estudo você conheceu os princípios básicos da Programação Orientada a Objetos utilizando como base os pilares que norteiam esse paradigma Também conheceu um pouco da história das linguagens de programação orientadas a objetos finalizando com um estudo sobre o Java e o seu funcionamento Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 46 A partir desse momento começamos a direcionar o nosso pensamento para o contexto do mundo da orientação a objetos Você compreendeu como idealizar a estrutura de um objeto assim como os pilares que definem a programação orientada a objetos que são abstração encapsulamento herança e polimorfismo Você também deu um leve mergulho na história das linguagens de programação que fazem uso desse paradigma desde o SIMULA I na década de 1960 até as linguagens de programação utilizadas na atualidade como o Java Por fim você pode compreender o processo de criação e execução de uma aplicação Java assim como recebeu orientações para a instalação do Java na sua máquina REFERÊNCIAS Começando a pensar de forma Orientada a Objetos e conhecendo as principais linguagens com suporte a esse paradigma 47 ARAÚJO E C de Orientação a Objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 49 Existem diversos softwares que representam ambientes para o desenvolvi mento de aplicações em Java os quais tornam o desenvolvimento mais ágil trazendo diversas facilidades como a simples função de autocompletar Para podermos tirar proveito dessas ferramentas neste ebook iremos instalar confi gurar e utilizar a ferramenta de desenvolvimento que será utilizada no decorrer deste estudo Ao utilizar a ferramenta estaremos realizando codificações utilizando a lin guagem Java e por conta disso iremos aproveitar para aprender como aplicar alguns conceitos básicos de algoritmos como a criação de variáveis a utiliza ção de estruturas de controle e vetores utilizando a sintaxe do Java Você pode observar algumas diferenças na forma de codificar referente a outras linguagens que já conhece mas verá que os conceitos são exatamente os mesmos que já aprendeu anteriormente modificando apenas a forma como o código é escrito Ebook Iniciando o Desenvolvimento em Java Iniciando o Desenvolvimento em Java 52 PRIMEIROS PASSOS NO DESENVOLVIMENTO EM JAVA Quando você inicia o aprendizado de uma nova linguagem de programação o primeiro passo é entender como funciona a sintaxe para o desenvolvimento de código nessa linguagem o que é caracterizado por leves diferenças entre a maior das linguagens Por conta disso antes de entrar no mundo da programação orientada a objetos iremos relembrar alguns conceitos básicos de algoritmos como variáveis e estruturas de controle só que desta vez voltados para a linguagem de programação Java Com o objetivo de iniciar no desenvolvimento de aplicações Java o primeiro passo que precisamos dar é compreender como funciona o software que será utilizado para o desenvolvimento dessas aplicações Existem diversos aplicativos que podem ser utilizados para esse fim entre os quais os principais são Eclipse Aplicativo gratuito que segue o modelo open source que permite o desenvolvimento Java assim como de outras linguagens de programação conhecidas como C Python e PHP Visual Studio Code Aplicativo gratuito desenvolvido pela Microsoft que permite o desenvolvimento para diversas linguagens de programação Um de seus diferenciais é que existem inúmeros plugins criados para auxiliar no desenvolvimento das diversas linguagens de programação que suporta IntelliJ IDEA Aplicativo criado pela JetBrains com foco no desenvolvimento com o uso de linguagens de programação que são baseadas na Java Virtual Machine Possui uma versão community que é gratuita para uso pessoal e comercial e uma versão ultimate que é paga e traz mais possibilidades de desenvolvimento como Java EE e Spring Iniciando o Desenvolvimento em Java 53 A opção sobre qual desses aplicativos também conhecidos como IDEs Integrated Development Environment em português Ambiente de Desenvolvimento Integrado se irá utilizar para realizar o desenvolvimento do código é pessoal de cada desenvolvedor preferindose geralmente a opção que encontrou mais facilidades para auxiliar no desenvolvimento No decorrer deste estudo vamos exemplificar os códigos com o uso do Eclipse que foi escolhido por ser open source e também por ser um aplicativo de ampla utilização Porém caso você opte por utilizar outra opção os conceitos e principais facilidades que serão utilizadas se aplicam a todas essas ferramentas muitas vezes modificando apenas o local onde se deve ir para executar determinadas ações Iniciando o Desenvolvimento em Java 54 INSTALANDO E COMPREENDENDO O ECLIPSE O primeiro passo para que você inicie nesse processo é o download e instalação do Eclipse que pode ser encontrado na página eclipseorgdownloads Para realizar o download do Eclipse você deve acessar o link a seguir ou através do código QR httpswwweclipseorgdownloads Nessa página você encontrará algumas opções para o download O mais destacado consiste em um instalador para o Eclipse o qual após o download será necessário apenas executar e seguir os passos para a instalação Porém dependendo do Sistema Operacional em algumas situações o instalador não consegue finalizar o processo sendo necessário realizar o download do pacote para a instalação o qual estará disponível em um link denominado Download Package logo abaixo dos botões de download Na figura a seguir é possível verificar tanto os botões de download do instalador quanto o link para realizar o download dos pacotes Iniciando o Desenvolvimento em Java 55 Figura 2 Tela de download do Eclipse Fonte Eclipse Foundation 2023 Caso você opte por realizar o download dos pacotes então deverá clicar no link indicado que irá levar para uma nova página que inicialmente sugere novamente o download do instalador porém mais abaixo irá apresentar diversas opções de download de pacotes do Eclipse E qual a principal diferença dos pacotes para o instalador É que os pacotes irão trazer um arquivo compactado que ao descompactar você pode apenas clicar no ícone referente ao executável do Eclipse e iniciar a utilização da aplicação Na figura a seguir é possível verificar algumas opções de pacotes para realizar o download sendo neste caso dois pacotes um pacote para o Eclipse voltado para desenvolvimento Java e um pacote para o Eclipse voltado para o desenvolvimento de C e C Se seguir olhando as demais opções você verá a existência de diversos outros pacotes focados em diferentes linguagens de programação Iniciando o Desenvolvimento em Java 56 Figura 3 Tela para download do Eclipse a partir de pacotes Fonte Eclipse Foundation 2023 Para a utilização no decorrer deste estudo você pode estar realizando o download de qualquer um dos dois pacotes Java A diferença entre eles é que a primeira opção com nome Eclipse IDE for Java Developers irá permitir apenas o desenvolvimento de aplicações Java focadas no contexto Desktop Já a segunda opção com nome Eclipse IDE for Enterprise Java and Web Developers permite além do desenvolvimento de aplicações Desktop também de aplicações Web Como neste estudo não será realizado o desenvolvimento Web todas as duas aplicações são válidas Iniciando o Desenvolvimento em Java 57 Lembrese que caso tenha realizado o download a partir do link Download Packages não é necessário realizar a instalação do Eclipse É só descompactar o arquivo baixado e executar o ícone correspondente a aplicação Atenção Após executar a aplicação Eclipse a primeira tela que aparecerá será referente à seleção do diretório que irá armazenar o nosso workspace ou seja o local em seu Sistema Operacional onde será criada uma nova pasta que irá armazenar todos os projetos e arquivos criados dentro do Eclipse conforme apresenta a figura a seguir Para continuar selecione o local onde deseja armazenar o seu workspace e clique em Launch Com isso irá inicializar o seu Eclipse apontando para o diretório indicado Figura 4 Tela de configuração do Workspace Fonte Do autor a partir de Eclipse IDE 202212 2023 Iniciando o Desenvolvimento em Java 58 Ao finalizar o carregamento do Eclipse você verá uma tela com uma aba de boasvindas ao fechar esta aba você terá uma estrutura semelhante à da figura a seguir que consiste na tela que possui todos os recursos necessários para o desenvolvimento de uma aplicação Java Figura 5 Tela geral do Eclipse Fonte Do autor a partir de Eclipse IDE 202212 2023 Vamos começar a explicação pelo lado esquerdo da tela Ali temos o Project Explorer ou Package Explorer e é o local onde ficarão os projetos que iremos criar sempre separados por pastas Na parte inferior da tela temos algumas abas para auxiliar no desenvolvimento como a Console onde é possível inserir ou imprimir valores No lado direito está o Outline onde é apresentado de uma forma estruturada todos os métodos da classe Caso considere que essa aba não seja útil para você é possível fechála sem nenhum problema Na parte de cima da tela temos todos os menus para auxiliar no desenvolvimento Por ali conseguimos criar novos projetos novos arquivos executar o nosso código entre várias outras possibilidades que iremos conhecer no decorrer deste estudo Por fim a parte central da tela consiste no local onde iremos abrir os arquivos para realizar a edição do código É possível abrir vários arquivos ao mesmo tempo sendo eles separados em abas nessa mesma área Iniciando o Desenvolvimento em Java 59 Para iniciar o desenvolvimento de um código é preciso primeiro criar um projeto Para isso é preciso clicar em FileNew Project e na sequência selecionar a opção Java Project Caso esta opção não esteja aparente será preciso clicar em Other para então selecionar a opção Java Project e clicar em Next Na tela seguinte é onde será feita a configuração do projeto e no momento iremos manter todas as configurações como padrão definindo apenas um nome para o projeto Após a definição do nome clique em Finish e o projeto será criado aparecendo no lado esquerdo da sua tela Conforme demonstrado na figura a seguir é possível observar que foi criado um projeto com nome primeiroExemplo e dentro deste projeto existem dois diretórios O primeiro denominado JRE System Library representa todas as bibliotecas Java que foram importadas para dentro do projeto Nessas bibliotecas estão definidos diversos códigos que são considerados base para o desenvolvimento e podem ser utilizados durante a nossa implementação O segundo diretório denominado src consiste no local onde serão criados os nossos arquivos para realizar a codificação do nosso projeto Iniciando o Desenvolvimento em Java 60 Figura 6 Aba com o projeto criado Fonte Do autor a partir de Eclipse IDE 202212 2023 Para iniciar o desenvolvimento vamos precisar criar um novo arquivo o qual será uma classe dentro da pasta src Para isso clique com o botão da direita na pasta src e selecione a opção Class Caso esta opção não esteja disponível será necessário clicar na opção Other para na sequência pesquisar e selecionar a opção Class Isso irá abrir uma tela para definir as configurações da classe conforme demonstrado na figura a seguir Figura 7 Tela para realizar a criação de uma classe Fonte Do autor a partir de Eclipse IDE 202212 2023 Iniciando o Desenvolvimento em Java 61 Para criar uma classe temos diversas configurações possíveis de serem realizadas Nesse momento você manterá praticamente todas as configurações padrões pois os conceitos necessários para compreendermos cada um desses pontos serão abordados no decorrer deste estudo Será necessário modificar apenas duas coisas nessa tela de criação da classe que consistem em definir um nome para a classe e marcar a caixa de seleção referente ao public static void mainString args Ao marcar esta caixa de seleção estamos dizendo para o Eclipse já criar a função main em nossa classe a qual é responsável por inicializar a execução do nosso código ou seja sempre que pedirmos para executar o nosso código Java este irá buscar pela função main para inicializar a sua execução a partir da primeira linha dessa função Após a criação da classe será apresentada a tela de edição de código conforme demonstra a figura a seguir Figura 8 Tela de edição de código Fonte Do autor 2023 package primeiroExemplo public class Teste public static void mainString args Iniciando o Desenvolvimento em Java 62 Dica Em Java existe uma convenção definida para a nomenclatura de classes que consiste em Não haver espaços no nome da classe A primeira letra de cada palavra deve iniciar com letra maiúscula Isso quer dizer que indiferentemente de quantas palavras utilizar para definir o nome da classe não deve haver espaço entre as palavras e a primeira letra de cada palavra deve ser maiúscula Veja alguns exemplos Com uma palavra Teste Com duas palavras PrimeiroExemplo Com três palavras PrimeiraClasseJava INICIANDO A CODIFICAÇÃO EM JAVA Após compreender o funcionamento do Eclipse chegou o momento de iniciar a codificação em Java Para esse primeiro contato com essa linguagem de programação iremos relembrar alguns conceitos básicos de algoritmos porém aplicados ao Java Definição de variáveis e tipos de dados Um conceito muito utilizado no desenvolvimento de algoritmos é o de variáveis que consiste em armazenar valores em memória que são identificados por um rótulo para que seja possível utilizálos em outros momentos do código MANZANO COSTA JUNIOR 2014 Em Java as variáveis são consideradas fortemente tipadas ou seja é preciso na criação de uma variável definir qual será o seu tipo de dado e essa definição irá seguir com a variável do início ao fim da sua existência no código não sendo possível trocar esse tipo de dado em momento algum Na tabela a seguir são apresentados os principais tipos de dados junto a uma breve descrição referente a que tipo de informação consegue armazenar TIPO DE DADO DESCRIÇÃO char Consegue armazenar um único caractere o qual deve ser definido entre aspas simples Exemplo A boolean Armazenar valores lógicos os quais devem ser escritos com todas as letras minúsculas Os dois únicos valores aceitos são true e false byte Armazena números inteiros com tamanho de 1 byte em um intervalo que vai de 128 até 127 short Armazena números inteiros com tamanho de 2 bytes em um intervalo que vai de 32768 até 32767 int Armazena números inteiros com tamanho de 4 bytes em um intervalo que vai de 2147483648 até 2147483647 long Armazena números inteiros com tamanho de 8 bytes em um intervalo que vai de 9223372036854775808 até 9223372036854775807 float Armazena números reais com tamanho de 4 bytes permitindo definir até 8 dígitos de precisão após a vírgula double Armazena números reais com tamanho de 8 bytes permitindo definir até 17 dígitos de precisão após a vírgula Tabela 1 Tipos de dados Fonte Adaptado de Manzano e Costa Junior 2014 Iniciando o Desenvolvimento em Java 63 Iniciando o Desenvolvimento em Java 64 Todos esses tipos de dados apresentados são considerados tipos primitivos de dados os quais são predefinidos pela linguagem Java e pela maioria das demais linguagens de programação Além desses tipos de dados também é possível trabalhar com o tipo String que não é considerado um tipo primitivo porém faz uso do char O objetivo da String é armazenar um conjunto de caracteres permitindo assim que tenhamos um tipo de dado para armazenar textos Todo valor atribuído a uma String deve estar entre aspas duplas por exemplo Esta é uma String Após conhecer os principais tipos de dados da linguagem Java o próximo passo é compreender como é realizada a criação de uma variável ou seja a declaração de uma variável Em Java toda variável deve seguir a mesma estrutura que consiste em indicar o tipo de dado seguido pelo nome da variável Caso deseje atribuir um valor para a variável na sua criação é só utilizar o sinal de igual e na sequência informar qual o valor que deve ser atribuído No código a seguir é possível verificar alguns exemplos de criação de variáveis utilizando os principais tipos de dados Iniciando o Desenvolvimento em Java 65 public static void mainString args char letra A boolean tipoLogico true String texto Este é um texto int numeroInteiro 589 double numeroReal 589 float numeroFloat 329f Um ponto importante a observar no código apresentado é que na última linha onde é criada uma variável do tipo float o valor numérico informado apresenta a letra f no final do número Isso ocorre porque por padrão a linguagem de programação Java considera todos os números com vírgula como sendo do tipo double Portanto se não adicionarmos a letra f ao final do número o compilador tentará atribuir um valor do tipo double para uma variável do tipo float o que não será possível pois o double possui 8 bytes de tamanho e o float apenas 4 bytes Por conta disso que nesse caso é preciso adicionar a letra f ao final do número Agora que aprendeu a criar e inicializar variáveis no Java na próxima etapa você verá como solicitar valores para o usuário para atribuir as variáveis em vez de definir apenas valores fixos Entrada e Saída de Dados Para muitos exemplos e atividades que serão desenvolvidas no decorrer deste estudo será necessário apresentar informações assim como solicitar informações ao usuário Nesse contexto a entrada de dados consiste no fato de solicitar valores para o usuário enquanto a saída de dados consiste em apresentar informações para o usuário Para tanto você verá duas formas de realizar esse processo uma que faz uso exclusivamente da console e outra que apresenta caixas de diálogo na tela com uma abordagem que utiliza um pequeno contexto de interface gráfica Iniciando pela forma que faz uso da console vamos iniciar pelo processo de simplesmente apresentar uma informação para o usuário Para isso utilizase o código Systemoutprintln e devese enviar como parâmetro o valor que deseja imprimir na console Para exemplificar crie uma nova classe e adicione o código conforme apresenta o código a seguir public static void mainString args SystemoutprintlnImprimindo valor na console Na sequência execute o código Para isso você pode clicar no círculo verde com uma seta no meio que se encontra no menu superior do Eclipse conforme indicado pela seta amarela na figura a seguir Outra opção é fazer uso da tecla de atalho Para isso basta pressionar as teclas CTRL F11 Feito isso o código será executado e será possível observar na parte inferior do Eclipse na aba Console indicada pela seta vermelha na figura a seguir que agora está aparecendo o texto Imprimindo valor na console conforme solicitado no código Iniciando o Desenvolvimento em Java 66 Figura 9 Indicação dos locais para execução do código Fonte Do autor a partir de Eclipse IDE 202212 2023 Agora que você já sabe como imprimir um valor na console a próxima etapa consiste em solicitar que o usuário informe um valor pela console para ser utilizado na execução do código Para isso será utilizado o Scanner o qual é disponibilizado pela biblioteca do Java Para explicar a sua utilização iremos utilizar como base o código apresentado a seguir Iniciando o Desenvolvimento em Java 67 Iniciando o Desenvolvimento em Java 68 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import javautilScanner public class Exemplo public static void mainString args Scanner scanner new ScannerSystemin SystemoutprintlnInforme o seu nome String nome scannernextLine SystemoutprintlnInforme sua idade int idade scannernextInt SystemoutprintlnSeu nome é nome e possui idade anos Na linha 8 é possível verificar a criação de um Scanner Não iremos entrar no detalhe de como esse objeto é instanciado pois veremos esses conceitos um pouco mais adiante O que precisamos compreender neste momento é que o Scanner é o responsável por permitir a solicitação de valores da console e para utilizálo precisamos adicionar essa primeira linha a nossa função main Um ponto importante é que pelo Scanner ser proveniente da biblioteca do Java e não um código básico com os tipos de variáveis por exemplo precisamos realizar um import desse componente apontando o local da biblioteca onde esse pode ser encontrado e esse import é feito na linha 3 do código Na sequência do código nas linhas 10 e 12 temos a parte do código onde o Scanner é utilizado para de fato solicitar valores da console Essa biblioteca solicita os valores por intermédio das funções next e existem diversas implementações desta função para atender diversos cenários No caso da linha 10 está sendo solicitado um nome o qual será armazenado em uma variável do tipo String Para isso utilizamos a função nextLine Esta função obtém todos os valores digitados em uma linha e transforma em uma String Na linha 12 é solicitada a idade e esta será armazenada em uma variável do tipo int Para isso foi utilizada a função nextInt Esta função exige a inserção de um valor numérico que será convertido para um valor do tipo int Iniciando o Desenvolvimento em Java 69 Ao executar esse código será possível observar que será impresso na console o texto Informe o seu nome e na sequência a execução do código será pausada aguardando que o usuário entre com um valor na console e pressione Enter É somente após essa ação que a execução do código irá continuar solicitando desta vez a idade e por fim apresentando todas as informações digitadas em um último Systemoutprintln A outra opção existente para trabalhar com entrada e saída de dados é com a utilização do JOptionPane que consiste em um componente gráfico que apresenta uma caixa de diálogo na tela podendo solicitar que o usuário informe um valor ou simplesmente apresentar um valor No código a seguir é apresentando o mesmo exemplo de código para o qual foi utilizada a console anteriormente porém agora com as caixas de diálogo Iniciando o Desenvolvimento em Java 70 3 4 5 6 7 8 9 10 12 13 14 import javaxswingJOptionPane public class Exemplo public static void mainString args S t r i n g n o m e J O p t i o n P a n e showInputDialogInforme o seu nome int idade IntegerparseIntJOptionPane showInputDialogInforme sua idade JOptionPaneshowMessageDialognull Seu nome é nome e possui idade anos Na linha 8 referente ao código o JOptionPaneshowInputDialog é responsável por apresentar uma caixa de diálogo com uma caixa de texto para que o usuário possa informar um valor e clicar em OK O texto de descrição referente a essa caixa de diálogo com o objetivo de orientar o usuário referente a qual tipo de valor deve informar é enviado como um parâmetro para a função Por fim o valor digitado pelo usuário será armazenado na variável do tipo nome Na linha 9 também é utilizado um JOptionPaneshowInputDialog para solicitar um valor porém neste ponto o valor solicitado é do tipo numérico e não String Como o valor submetido a partir da caixa de diálogo é sempre considerado uma String foi preciso realizar uma conversão de um valor do tipo String para um valor do tipo int Essa conversão acontece a partir do código IntegerparseInt o qual recebe como parâmetro uma String e realiza a conversão para um valor do tipo int conseguindo assim armazenar esse valor na variável denominada idade Iniciando o Desenvolvimento em Java 71 Dica Você viu que existe uma função específica para converter um valor do tipo String para um valor do tipo int Seguindo o mesmo princípio também é possível converter um valor do tipo String para outros tipos de dados conforme demonstram os exemplos a seguir FloatparseFloat535 DoubleparseDouble535 LongparseLong2563 BooleanparseBooleantrue Iniciando o Desenvolvimento em Java 72 Por fim na linha 10 é feita uma concatenação de Strings para apresentar as informações digitadas utilizando uma caixa de diálogo Neste caso que consiste apenas em uma saída de dados foi utilizado o JOptionPaneshowMessageDialog que recebe dois valores por parâmetro sendo o primeiro valor referente ao componente gráfico ligado a esse JOptionPane que no nosso caso por enquanto será sempre null pois não temos nenhum outro componente gráfico em tela Já o segundo valor consiste no texto que deve ser apresentado na caixa de diálogo Assim como acontece com o Scanner também é necessário realizar o import do JOptionPane Para isso quando digitar a palavra JOptionPane no seu editor pressione na sequência as teclas de atalho CTRL Space Com isso irá abrir um menu de opções onde será possível realizar o import de forma automática Atenção Iniciando o Desenvolvimento em Java 73 Essas são as duas opções que iremos abordar para trabalhar com entrada e saída de dados no Java Não existe aqui uma opção melhor ou pior fica a critério do aluno escolher qual das duas formas prefere trabalhar Comandos de decisão Em algoritmos você aprendeu todos os conceitos referentes a comandos de decisão portanto aqui o objetivo será demonstrar um exemplo de comando de decisão utilizando a linguagem de programação Java No código a seguir é possível observar uma estrutura simples de decisão 7 8 9 10 11 12 13 14 15 public static void mainString args int idade IntegerparseIntJOptionPane showInputDialogDigite sua idade if idade 16 JOptionPaneshowMessageDialognull Você já pode votar else JOptionPaneshowMessageDialognull Você ainda não pode votar Neste código estamos solicitando que o usuário informe a sua idade e com base no valor informado iremos verificar se este tem direito ao voto ou não Para isso foi utilizado o comando de decisão IF descrito na linha 10 Em sua estrutura é preciso adicionar entre parênteses a verificação que deve obrigatoriamente gerar um valor booleano Neste exemplo caso o valor informado for maior ou igual a 16 irá entrar no bloco de código referente ao IF e imprimir o valor Você já pode votar Porém caso a idade informada for menor que 16 não entrará no bloco do IF e executará o bloco referente ao ELSE apresentando a mensagem Você ainda não pode votar Iniciando o Desenvolvimento em Java 74 No código a seguir é apresentada uma versão mais otimizada dessa implementação para a qual foi adicionada mais uma verificação apresentando agora para o usuário se com a idade informada o voto é obrigatório opcional ou se ainda não tem direito ao voto 7 8 9 10 11 12 13 14 15 16 17 public static void mainString args int idade IntegerparseIntJOptionPane showInputDialogDigite sua idade if idade 18 idade 70 JOptionPaneshowMessageDialognull O voto é obrigatório else if idade 16 JOptionPaneshowMessageDialognull O voto é opcional else JOptionPaneshowMessageDialognull Você ainda não pode votar Nesse código temos um conjunto de IFs porém apenas um deles será executado Na primeira condição verificase se a idade é maior ou igual a 18 anos e menor que 70 anos Caso esteja nesse intervalo irá imprimir o valor O voto é obrigatório e encerrará esse conjunto de IFs Caso a primeira condição retorne falso irá testar a segunda condição para saber então se a idade informada é maior ou igual a 16 anos Caso for irá apresentar o valor O voto é opcional Caso essa segunda condição também seja falsa então irá executar o código referente ao Else que imprimirá Você ainda não pode votar Iniciando o Desenvolvimento em Java 75 Comandos de Repetição Os comandos de repetição são responsáveis por repetir uma determinada estrutura de código enquanto uma operação de verificação for verdadeira Você verá como representar em Java as duas principais estruturas de repetição que consistem no While e no For Iniciando pelo While a seguir é apresentado um código que tem como objetivo ficar solicitando valores para o usuário até que este informe um valor positivo 7 8 9 10 11 12 13 public static void mainString args int numero 1 while numero 0 numero IntegerparseIntJOptionPane showInputDialogDigite um número Iniciando o Desenvolvimento em Java 76 Antes do comando de repetição foi criada uma variável para armazenar o valor informado pelo usuário e esta foi inicializada com o valor 1 pois como o objetivo é repetir um determinado bloco de código até que um valor positivo seja informado ao iniciar com um valor negativo estaremos forçando para que o código entre no comando de repetição O comando While possui uma verificação simples que consiste em verificar se a variável referente ao número digitado é menor ou igual a zero Caso for retornará verdadeiro e executará o bloco de código referente ao While no qual será solicitado que o usuário informe um novo valor Após informar esse valor o teste do While será realizado novamente para decidir se repete o bloco de código que solicita um valor para o usuário novamente ou se encerra a execução desse comando de repetição Simplificando o comando de repetição While ficará executando o seu bloco de código até que a sua condição de verificação retorne falso Portanto é de grande importância garantir que dentro do bloco de código referente à repetição o valor da variável utilizada como condição de saída seja alterado de uma forma caso contrário é possível que o código entre em loop infinito Vamos verificar agora a estrutura do comando de repetição For Para isso a seguir é apresentado um código que solicita um valor para o usuário e na sequência calcula a soma de todos os números inteiros positivos de um até o valor informado Iniciando o Desenvolvimento em Java 77 7 8 9 10 11 12 13 14 15 public static void mainString args int numero IntegerparseIntJOptionPane showInputDialogDigite um número int soma 0 forint i 1 i numero i soma soma i JOptionPaneshowMessageDialognull A soma é soma O comando For diferentemente do While possui três etapas dentro da sua declaração Na primeira etapa é criada a variável que será utilizada como controle da repetição Nesse caso foi criada uma variável denominada i que foi inicializada com o valor 1 A segunda etapa consiste na operação relacional para verificar se a repetição deve parar ou continuar Nesse exemplo estamos verificando se o valor referente à variável i que foi criada na etapa anterior é menor ou igual ao número Por fim a última etapa consiste no incremento ou decremento que deve ocorrer na variável de controle a cada repetição Nesse caso estamos dizendo que para cada vez que repetir o bloco de código deve incrementar o valor da variável i em 1 Simplificando a leitura desse exemplo estamos criando uma variável i para ser utilizada no nosso For que irá iniciar em 1 A cada repetição irá testar se o valor referente a essa variável é menor ou igual ao número informado pelo usuário Se for menor ou igual irá incrementar o valor da variável i em um e executar o bloco de código referente ao For novamente Se for maior irá finalizar a execução da repetição referente ao For e imprimir o valor calculado na variável soma Iniciando o Desenvolvimento em Java 78 Arrays Um array é um conjunto de dados homogêneos ou seja um conjunto de variáveis do mesmo tipo de dado armazenados em uma mesma estrutura DEITEL DEITEL 2016 No código a seguir é apresentada a criação de um array utilizando a linguagem de programação Java 5 6 7 public static void mainString args int valores new int5 Observe que a criação do array consiste no mesmo conceito da criação de uma variável é preciso informar o tipo de dado que será armazenado no array e um nome para identificar esse array criado A principal diferença até aqui está na utilização dos colchetes junto ao tipo de dado que é o que identifica essa variável como um array Iniciando o Desenvolvimento em Java 79 A etapa de atribuição de valor a esse array que muda bastante referente à criação de uma variável pois não adicionamos apenas um valor a variável Para os arrays é preciso criar a estrutura informando qual será o tamanho desse array ou seja qual a quantidade de valores que poderá ser inserida nessa estrutura Para isso utilizamos a palavra new seguida novamente do tipo de dado referente ao array que deve ser o mesmo definido junto ao nome da variável seguido de colchetes Porém dessa vez devese informar um valor numérico inteiro dentro dos colchetes o qual define o seu tamanho Agora que temos um array criado e inicializado o próximo passo é inserir e obter valores a partir desse array Como essa estrutura armazena mais de um valor utilizamos o conceito de índices para acessar os valores que devem ser armazenados em suas respectivas posições Por exemplo se crio um array de 5 posições estou criando uma estrutura que permite o armazenamento de 5 valores diferentes cada um em uma posição específica desse array Essas posições são identificadas por índices nos quais a primeira posição será sempre o índice 0 zero e a última posição será sempre n1 ou seja o tamanho do array menos 1 que neste caso seria 4 quatro O código a seguir demonstra a inserção de alguns dados no array criado assim como a obtenção de algumas informações para apresentar ao usuário 7 8 9 10 11 12 13 14 15 public static void mainString args int valores new int5 valores0 5 valores1 8 valores4 85 JOptionPaneshowMessageDialognull valores4 Nesse caso nas linhas 10 11 e 12 estamos atribuindo valores ao array em posições diferentes Na posição referente ao índice 0 zero estamos adicionando o valor 5 no índice 1 estamos adicionando o valor 8 e no índice 4 estamos adicionando o valor 85 Nesse cenário não definimos nenhum valor para os índices 2 e 3 Nesse caso será atribuído o valor padrão referente ao tipo de variável que no caso dos números inteiros é 0 zero Na linha 14 ao invés de atribuir um valor ao array estamos obtendo um valor dele Para isso basta informar o índice de onde deseja obter a informação no nosso caso o índice 4 Com isso o JOptionPane irá apresentar uma caixa de diálogo com o valor 85 referente ao índice 4 do nosso array Iniciando o Desenvolvimento em Java 80 Neste ebook você pôde conhecer a aplicação Eclipse que será utilizada para o desenvolvimento dos nossos códigos em Java e também pôde utilizar essa aplicação para relembrar conceitos de algoritmos como variáveis tipos de dados comandos de decisão comandos de repetição e arrays porém dessa vez aplicados à linguagem de programação Java Iniciando o Desenvolvimento em Java 81 REFERÊNCIAS Iniciando o Desenvolvimento em Java 82 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 ECLIPSE FOUNDATION Download Eclipse Technology that is right for you Eclipse Foundation c2023 Disponível em httpswwweclipseorgdownloads Acesso em 26 jan 2023 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 85 Videoflix Você acompanhou até agora os conceitos básicos de programação orientada a objetos assim como os passos para a instalação e configuração do software que será utilizado para o desenvolvimento de códigos Java O objetivo dos vídeos a seguir é demonstrar esses conceitos de forma prática iniciando pela realização de um novo exemplo referente à conversão de um objeto do mundo real para um objeto do mundo da programação Será apresentado na prática como realizar o download instalação e configuração do Eclipse para na sequência iniciarmos o desenvolvimento de códigos em Java Será demonstrado como criar uma classe Java para realizar o desenvolvimento como criar variáveis e quais os tipos de dados existentes no Java Também será demonstrado como solicitar a entrada e saída de dados para por fim relembrarmos conceitos básicos de algoritmos aplicados à linguagem de programação Java como comandos de decisão comandos de repetição e vetores httpsplayervimeocom video821386725hb9286c2b0d Estruturando um Objeto para uma Conta Bancária httpsplayervimeocom video821386752he2398dbe11 Conhecendo o Eclipse 86 httpsplayervimeocom video821386783hda941120a3 Primeiro código em Java httpsplayervimeocom video821386829ha6c3e9f01c Variáveis e Tipos de Dados httpsplayervimeocom video821386847hdb483b819a Solicitando e imprimindo valores httpsplayervimeocom video821386875h03d70098f4 Estruturas de controle e vetores 87 Vamos aprofundar agora alguns dos conceitos que foram abordados previamente Você terá uma melhor explicação sobre como são definidos os intervalos aceitos pelos tipos numéricos Outro ponto que será abordado é a diferença entre os paradigmas de programação Estruturado e Orientado a objetos Por fim iremos reforçar os conceitos e objetos realizando uma nova análise para converter um objeto do nosso mundo real para um objeto do mundo da programação Neste exemplo iremos analisar todos os atributos e todas as ações que devem estar presentes nesse objeto sempre respeitando os conceitos vistos como os quatro pilares da programação orientada a objetos Infocast 89 Intervalo dos tipos de dados numéricos Olá O que você conhece sobre intervalo dos tipos de dados numéricos Se você não possui muito conhecimento sobre esse tema não tem problema pois esse é o nosso assunto de hoje Acompanhe Os tipos numéricos inteiros no Java são definidos por quatro tipos de dados diferentes o byte o short o int e o long O que define a diferença entre eles é o tamanho de bytes que cada um utiliza para armazenar os valores sendo o byte o menor utilizando apenas um byte na sequência o short utilizando dois bytes seguido pelo int com 4 bytes e o long com 8 bytes Mas no que a quantidade de bytes impacta Além do espaço utilizado em memória também o intervalo numérico que é possível armazenar nesse tipo de variável Por exemplo o byte permite armazenar valores de 128 até 127 ou seja é possível armazenar 256 valores numéricos divididos entre negativos e positivos Nesse cenário uma pergunta muito comum é por que 128 até 127 e não 128 até 128 A resposta é que se fosse de 128 negativo até 128 positivo teríamos um intervalo de 257 valores numéricos e não de 256 Isso ocorre porque o número zero também é contado como um dos 256 valores com isso temos 128 valores negativos mais 127 valores positivos mais o número 0 Quando se trata de utilização de memória o número zero não significa que é um valor numérico e não ocupará espaço em memória muito pelo contrário ele terá o seu espaço sendo considerado um desses 256 valores que podem ser incluídos no intervalo do byte Para uma melhor compreensão vamos olhar também para o tipo de dado short que possui um tamanho de 2 bytes Nesse tipo de dado o intervalo de valores aceitos é de 32768 negativos até 32767 positivos Veja que o intervalo de números positivos também possui um valor a menos que o de negativos pelo mesmo motivo visto anteriormente pelo fato de o zero ser considerado um valor numérico Outro ponto interessante é que a quantidade de valores possíveis de armazenar no short é de 65536 valores o que corresponde a 256 ao quadrado 90 Lembrando que 256 equivale a um byte e 65536 equivalem a dois bytes ou seja o tipo de dado int que utiliza 4 bytes aceita a quantidade de valores referente a 256 elevados a 4 e o long que são 8 bytes equivale a 256 elevados a 8 Bons estudos e até a próxima 91 Diferença entre Programação Orientada a Objetos e Programação Estruturada Olá Você já se perguntou qual a melhor opção programação estruturada ou programação orientada a objetos Hoje vamos falar sobre isso a diferença entre programação orientada a objetos e programação estruturada É sempre importante reforçarmos a diferença entre os paradigmas de programação estruturada e o paradigma de programação orientada a objetos Na programação estruturada nós escrevemos e lemos o código de forma sequencial ou seja linha após linha sendo possível a criação de funções para uma melhor organização do código Com isso ao ler uma função digamos que é feito um desvio para executar o código dessa função para na sequência continuar a execução linha após linha do código principal A programação orientada a objetos parte do princípio de dividir o código em diversos arquivos separados permitindo a criação de classes que posteriormente serão utilizadas para instanciar objetos sendo que cada objeto terá a sua responsabilidade e característica Dessa forma um código desenvolvido com o paradigma de orientação a objetos não terá a sua leitura de uma forma sequencial tão nítida quanto na estruturada Nesse paradigma o código inicia em um ponto específico porém vão acontecendo inúmeros desvios entre todos os arquivos que compõem as partes do código para que cada um execute o código de sua responsabilidade É importante ressaltar que dentro de uma função na orientação a objetos o código também será executado de forma sequencial porém esse pode passar por diversos outros objetos implementados em diferentes arquivos até finalizar a sua execução Quando surge a famosa pergunta Qual a melhor opção estruturada ou orientada a objetos é importante ter ciência que a resposta irá depender da situação Existem cenários onde a programação estruturada é muito mais 92 indicada como o desenvolvimento para microcontroladores que geralmente demanda uma melhor performance e controle de memória Já para outros cenários como o desenvolvimento de APIs que demandam bastante do conceito de reutilização de código assim como de manutenção e melhorias constantes é grande a adesão do paradigma de orientação a objetos Portanto lembrese sempre é importante analisar o cenário e a necessidade antes de definir pela utilização de uma linguagem de programação que utilize o paradigma orientado a objetos ou estruturado Espero que tenha gostado do assunto Bons estudos e até a próxima 93 Analisando e definindo a estrutura de um objeto Olá Vamos falar agora sobre a estrutura de um objeto Você já viu nos ebooks apresentados neste estudo como analisar um objeto carro do mundo real para representálo no mundo da programação lembra Para reforçar esse conceito agora iremos analisar um objeto do tipo livro para representálo no mundo da programação É importante lembrar da importância de pensar em uma estrutura o mais genérica possível para a construção do modelo do objeto pois esse mesmo modelo será utilizado para construir diversos outros objetos do mesmo tipo com as mesmas ações porém com valores de suas características diferentes Vamos começar pensando nas características que um livro possa ter Teríamos o título do livro a edição o nome dos autores o nome da editora o número de páginas e o ano do lançamento Ao meu ver essas são características importantes para definir os diferentes livros que podem ser criados a partir dessa estrutura Para exemplificar vamos criar um objeto para representar um dos livros sugeridos na referência bibliográfica deste estudo o qual possui o título Java como programar na sua décima edição escrito pelos autores Paul Deitel e Harvey Deitel a editora é a Pearson possui 968 páginas e foi lançado no ano de 2016 Veja que conseguimos construir um objeto para representar qualquer tipo de livro pois todos os livros terão essas características que definimos apenas modificando os valores dessas características E quais ações um livro pode executar No caso desse objeto é um pouco mais difícil de pensarmos em ações mas uma ação possível de realizar com um livro é virar a página Esta é uma ação que tornaria necessário a criação de uma nova característica para o objeto que seria a página atual Essa seria a característica a ser modificada a cada virada de página deixando registrado em qual página estamos no momento 94 Com isso finalizamos a criação do objeto Livro Veja que foi um objeto simples com muito mais atributos do que ações Porém agora temos uma estrutura que nos permite criar um objeto referente a qualquer tipo de livro Espero que tenha gostado Bons estudos e até a próxima 95 Gostou do assunto Você pode aprender ainda mais sobre a linguagem de programação Java buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Programação Java e Programação Orientada a Objetos Paul Deitel e Harvey Deitel 2016 são uns dos autores mais conhecidos quando falamos em Programação Java e Programação Orientada a Objetos O seu livro traz excelentes explicações sobre os assuntos abordados neste estudo Caso queira aprender alguns novos conceitos sobre a linguagem de programação como outras opções de estrutura de decisão e repetição que não foram abordadas neste ebook seguem os conceitos e suas respectivas páginas para auxiliar no seu aprendizado Capítulo 2 Introdução a aplicativos Java entradasaída e operadores páginas 27 a 47 Capítulo 4 Instruções de controle parte I operadores de atribuições e páginas 79 a 105 Capítulo 5 Instruções de controle parte II operadores lógicos páginas 119 a 143 Capítulo 7 Arrays e ArrayLists páginas 191 a 200 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 97 Agora é o momento de conferir um resumo dos principais conhecimentos aprendidos ao longo de seus estudos até aqui Este resumo foi elaborado em formato de checklist para que você assinale os itens que considera já ter desenvolvido e caso sinta a necessidade retome os estudos Aproveite mais essa oportunidade de construção de saberes Resumindo Compreendi como reconhecer padrões e linguagem aplicada à programação orientada a objetos Entendi como realizar a entrada e saída de dados utilizando a linguagem de programação Java Aprendi a desenvolver as estruturas de controle básicas de programação utilizando a linguagem de programação Java Compreendi o conceito de objetos referente à Programação Orientada a Objetos 99 Você começará a trabalhar com o código e aprender os primeiros conceitos de programação orientada a objetos transformando os objetos que identificamos anteriormente em código Java ESTUDO E PRÁTICA II PRIMEIROS CONCEITOS DE ORIENTAÇÃO A OBJETOS Após compreender como converter um objeto do mundo real em um objeto do mundo da programação chegou o momento de transformar esse objeto em um código Java Para isso iniciaremos nossos estudos compreendendo os primeiros conceitos necessários da Orientação a Objetos que nos permitirão codificar a estrutura desses objetos conceitos estes que são Classes Objetos Atributos e Métodos Outro conceito que será abordado aqui é a sobrecarga de métodos o que nos permitirá criar métodos com o mesmo nome mas que irão realizar ações diferentes Na sequência serão abordados novos conceitos de orientação a objetos que serão voltados principalmente para o gerenciamento de acesso a informações de um objeto Para isso você verá os principais modificadores de acesso que podem ser utilizados para definir atributos e métodos Outro ponto importante para esse conceito é o encapsulamento o qual já vimos que é um dos pilares da programação orientada a objetos e que aqui iremos compreendêlo de forma mais aprofundada Por fim veremos como fazer o uso de construtores para definir informações necessárias para permitir a criação de um novo objeto Vamos começar a compreender os primeiros conceitos de Programação Orientada a Objetos Para isso iremos iniciar pelo conceito de Classe cujo objetivo será definir o template para um objeto conceito este que vimos com bastante Ebook 100 detalhes anteriormente Portanto você aprenderá a criar uma nova classe Java e definir seus atributos que consistem nas características do objeto e seus métodos que consistem nas ações do objeto Tudo isso será feito com exemplos práticos demonstrando como desenvolver o código com base nestes conceitos Por fim será abordado o conceito de sobrecarga de métodos o qual irá nos permitir definir métodos que possuam um mesmo nome mas que trabalhem com parâmetros diferentes Todos estes conceitos aqui abordados são considerados a base para que possamos iniciar no desenvolvimento de sistemas com o conceito de Orientação a Objetos Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 102 Vamos aprender todos os conceitos necessários para criar a nossa primeira estrutura para representar objetos no mundo da programação Para isso você irá passar por conceitos como classes atributos métodos e sobrecarga de métodos Todos esses são conceitos básicos da Orientação a Objetos que irão servir de base para evoluirmos no aprendizado posteriormente Você já aprendeu previamente como analisar um objeto do mundo real para realizar a conversão para o mundo da programação Neste ebook iremos começar a desenvolver o nosso código de forma orientada a objetos permitindo na prática a criação de objetos utilizando a linguagem de programação Java Neste primeiro momento iremos aprender os conceitos considerados mais básicos da orientação a objetos os quais são necessários para conseguirmos evoluir os conhecimentos referentes ao assunto posteriormente Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 103 Para exemplificar os conceitos que serão apresentados neste ebook iremos trabalhar na criação de uma estrutura para criar objetos que representem datas É importante ressaltar que a biblioteca Java já possui classes que nos auxiliam no trabalho com esse tipo de dado porém vamos criar a nossa própria estrutura de data que irá nos ajudar a compreender os conceitos a serem abordados Pensando na estrutura do nosso objeto vamos iniciar pensando nas características do nosso objeto ou seja quais informações o objeto precisará armazenar Inicialmente este nosso objeto terá apenas as informações de dia mês e ano que é o que precisamos para conseguir trabalhar com uma data Já as ações que este objeto poderá realizar irão consistir em gerar uma data que terá como objetivo definir os valores dos atributos e obter uma data que terá como objetivo obter uma String com a data já formatada Com isso temos a definição da estrutura que será necessário implementar para conseguirmos criar objetos do tipo Data Sabendo qual o tipo de objeto que queremos criar e entendendo como será o funcionamento desse objeto que consiste nas características e ações definidas o próximo passo será iniciar a criação da estrutura desse objeto Para isso iremos aprender o nosso primeiro conceito de orientação a objetos que consiste no conceito de Classe Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 104 CLASSE Sempre que quisermos realizar a instanciação de objetos que consiste em criar um objeto com seus valores específicos para as características é preciso definir qual a estrutura que será utilizada para criar esse objeto É nesse ponto que entra o conceito de Classe que na orientação a objetos consiste na definição da estrutura de um objeto ou vendo de outra forma pode ser considerado um template para nossos objetos É na criação da classe que iremos codificar quais as informações que o objeto deve armazenar momento em que também serão implementadas as ações que poderão ser executadas pelo nosso objeto Segundo Manzano e Costa Junior 2014 uma classe pode ser considerada um tipo de dado criado pelo desenvolvedor Para relembrar vimos anteriormente que ao criar variáveis em Java sempre precisamos definir qual o tipo de dado da variável e que esses tipos de dados podem ser do tipo primitivo como int float char boolean entre outros Ou ainda podem utilizar como base implementações presentes na biblioteca Java como é o caso da String Nesse cenário uma String é um tipo de dado que possui uma classe implementada com a definição de suas características e ações a qual é armazenada dentro da biblioteca padrão do Java Para se ter uma ideia esta classe permite a realização de diversas ações com o texto nela armazenado por exemplo transformar todos Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 105 os caracteres em letra maiúscula ou minúscula realizar uma comparação de igualdade com outra sequência de caracteres obter um caractere específico referente a um índice do texto entre inúmeras outras ações Existe um padrão para a definição de uma classe que consiste no seguinte código qualificador class Nome da Classe Implementação das características Implementação das ações Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 106 O qualificador inicialmente será sempre definido como public ou seja será permitido instanciar objetos a partir dessa classe a partir de qualquer local dentro do nosso projeto MANZANO COSTA JUNIOR 2014 Na sequência temos a definição da palavra reserva class a qual define que esta estrutura que estamos criando irá representar uma classe e poderá ser utilizada como um tipo de dado para instanciar objetos O nome da classe é criado pelo desenvolvedor do código e é considerada uma boa prática nomear uma classe de forma que torne fácil a compreensão do que os objetos criados a partir desta classe representam Por exemplo ao definir nomes de classes como Automovel Produto e ContaBancaria fica claro para quem estiver lendo o nome da classe compreender o que representa essa classe e inclusive já ter uma ideia de quais características e ações podem estar implementadas nela Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 107 Existe uma convenção definida para a nomenclatura de uma classe e seguir essa convenção é considerado uma boa prática de programação MARTIN 2009 A definição consiste que toda classe deve ter seu nome iniciando com letra maiúscula E caso o nome da classe seja composto por mais de uma palavra estas devem ser digitadas sem espaços grafando em maiúscula a letra inicial de cada palavra e as demais letras em minúscula Veja alguns exemplos a seguir Automovel ContaBancaria EstoqueProduto Atenção Após a definição do qualificador da palavra reservada class e do nome da classe observe que temos a abertura de chaves e no final da definição do código temos o fechamento da chave Em Java tudo o que está entre uma abertura e um fechamento de chaves é considerado um bloco de código portanto no caso de uma classe todo o código que representa a implementação dessa classe deve estar dentro desse bloco de código que abre logo após o nome da classe E dentro do bloco de código da classe teremos a implementação das características e ações referentes à classe as quais serão abordadas posteriormente Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 108 Lembrese de que o Eclipse nos auxilia na criação de uma classe Para isso é só clicar com o botão direito do mouse no projeto e selecionar a opção New seguida da opção Class Na sequência será aberta uma janela para configurar a classe na qual você precisará definir principalmente o nome da classe Por fim ao clicar em Finish a classe será criada com a estrutura que vimos em detalhe neste ebook Atenção Agora que você já conhece a estrutura de uma classe vamos então criar a classe que irá servir de estrutura para os nossos objetos do tipo Data Conforme pode ser observado no código a seguir utilizamos o qualificador public permitindo assim que os objetos referentes a essa classe sejam criados a partir de qualquer lugar do projeto e o nome da classe foi definido como Data public class Data Com a criação da classe Data na sequência iremos compreender como implementar as características da nossa classe Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 109 Observe que na criação desta classe não foi criada a função main Isto acontece porque aqui estamos apenas definindo a estrutura de um objeto que iremos utilizar posteriormente como tipo de dado para a instanciação desses objetos Portanto não faz sentido esta classe ser uma classe executável na qual podemos iniciar a execução da nossa aplicação Java Você verá posteriormente quando chegarmos na etapa de instanciação dos objetos que será criada uma classe exclusiva para a implementação da função main em que serão instanciados e manipulados os nossos objetos Curiosidade Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 110 ATRIBUTOS Os atributos de uma classe são o que chamamos até aqui de características ou informações que um objeto armazena De acordo com Deitel e Deitel 2016 a maior parte dos objetos possui atributos os quais são implementados como variáveis de instância e irão acompanhar um objeto durante toda a sua existência Um atributo existe desde antes que uma ação seja chamada durante a execução de uma ação e depois do término dessa execução ou seja um atributo é criado ao instanciar um objeto e ali permanecerá durante toda a existência desse objeto indiferente de quais e quantas ações esse objeto executar Cada objeto instanciado a partir de uma classe recebe a sua própria cópia dos atributos desta classe Com isso os valores atribuídos aos atributos de um objeto irão existir apenas para esse objeto Caso instancie um segundo objeto a partir dessa classe este também terá sua cópia dos atributos assim como os seus valores definidos para eles Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 111 As características de uma classe que agora aprendemos que são chamados de atributos na orientação a objetos consistem em armazenar informações sobre o objeto Essas informações podem ser características ou podem ser informações de estado do nosso objeto Por exemplo em um automóvel podemos ter um atributo para armazenar a quantidade de portas que ele possui que é em uma característica do automóvel Outro tipo de informação que podemos armazenar é se esse automóvel está ligado ou não o que indica um estado do objeto Atenção Para a classe Data que estamos desenvolvendo neste ebook nós já definimos que teremos três atributos para representar esse objeto os quais consistem em Dia Mês e Ano No código a seguir é possível verificar a implementação da classe Data junto aos seus atributos public class Data int dia int mes int ano Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 112 A estrutura para a criação de um atributo consiste em três informações modificador de acesso tipo de dado e nome da variável Ao observar o código apresentado é possível verificar que a criação do atributo consiste em apenas duas informações Isso ocorre porque neste momento não estamos nos preocupando com o modificador de acesso assunto que será abordado em mais detalhes posteriormente Ao deixar sem um modificador de acesso estamos indicando o uso do modificador default Com exceção do modificador de acesso o restante da declaração de um atributo é o mesmo princípio da declaração de uma variável É preciso indicar qual o tipo de dado referente a esse atributo e qual o nome que será dado para esse atributo Vale lembrar que é de grande importância que o nome do atributo descreva de forma clara qual a função desse atributo para assim melhorar a legibilidade do código Caso seja necessário também é possível inicializar o atributo diretamente na sua criação utilizando apenas o sinal de igualdade que indica atribuição e o valor a ser definido para o atributo na sequência Dica Assim como na nomenclatura de classes a nomenclatura de atributos também segue uma convenção Esta consiste em não haver espaços entre as palavras que definem o atributo e sempre a primeira palavra terá todos os seus caracteres minúsculos e a partir da segunda palavra a primeira letra de cada palavra terá o primeiro caractere maiúsculo Veja alguns exemplos dia quantidadeDePortas numeroConta Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 113 Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 114 MÉTODOS Os métodos de uma classe consistem na implementação das ações que essa classe pode realizar Segundo Deitel e Deitel 2016 um método tem o objetivo de armazenar as implementações que executam tarefas para o objeto Além disso também tem o objetivo de ocultar essas implementações do usuário de forma que ao chamar um método serão utilizados apenas o nome do método e os seus parâmetros não sendo preciso saber qual a implementação desse método A implementação de um método consiste na seguinte estrutura modificador de acesso tipo de retorno nome do método parâmetros Implementação do método O modificador de acesso tem o mesmo princípio daquele abordado quando falamos de classe e neste momento iremos tratálo sempre como public Relembramos que posteriormente serão abordados todos os tipos de modificadores de acesso existentes Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 115 No tipo de retorno do método é preciso informar qual o tipo de dado que esse método irá retornar Um método pode ou não retornar alguma informação Caso não retorne nada para quem o chamou utilizamos o void no lugar do tipo de dado que é a palavra reservada exclusivamente para indicar que não haverá retorno Caso exista algum retorno deve ser informado o tipo de dado que será retornado por exemplo int para um valor numérico inteiro String para um texto ou até Data caso seja retornado um objeto do tipo data É importante reforçar que o tipo de dado definido na assinatura do método obrigatoriamente deve ser o tipo de dado retornado pelo método posteriormente O nome do método é definido pelo desenvolvedor e apresenta a mesma convenção de nomenclatura de um atributo com a primeira palavra toda em letras minúsculas e a partir da segunda palavra sempre a primeira letra maiúscula e as demais minúsculas E lembrese da importância de definir um nome de método que indique exatamente o que esse método faz auxiliando assim no entendimento do código Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 116 Após o nome do método entre parênteses são definidos os parâmetros que serão esperados por este método Um parâmetro consiste em variáveis que irão existir apenas dentro do escopo do método as quais serão inicializadas com valores enviados na chamada de um método Esses parâmetros geralmente são parâmetros que serão utilizados na implementação do método seja para auxiliar na lógica do algoritmo ou para manipular os valores dos atributos Um método pode ter nenhum ou vários parâmetros Caso não tenha nenhum é preciso apenas abrir e fechar os parênteses na definição do método Caso tenha parâmetros para cada parâmetro deve ser informado o tipo de dado seguido do nome deste parâmetro Para os casos em que mais de um parâmetro são informados todos devem possuir a mesma estrutura de declaração sendo separados por vírgula Dentro da abertura e fechamento das chaves é onde fica a implementação do método onde será definida a lógica do método Para o desenvolvimento dessa implementação podem ser utilizados os parâmetros enviados assim como os atributos da classe É muito comum que os métodos trabalhem manipulando os valores dos atributos pois geralmente uma ação consiste em modificar o estado de um objeto alterando seus atributos ou obter informações de um objeto que muitas vezes irá utilizar dos atributos para gerar esse valor Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 117 Por fim caso tenha sido definido um tipo de retorno para o método que seja diferente de void este deverá obrigatoriamente retornar um valor ao final da sua implementação Para isso utilizase a palavra return seguida da informação que será retornada a qual pode ser uma variável um atributo ou até mesmo um valor literal desde que seja do mesmo tipo de dado definido na assinatura da classe Ao utilizar a palavra return para retornar um valor no método no momento de sua chamada a execução do método será finalizada ou seja devese tomar bastante cuidado com o momento que irá realizar esse retorno pois todo o código posterior ao retorno não será executado De acordo com Martin 2009 considerase uma boa prática de programação que o método receba apenas um return e que este esteja na última linha de execução do método Atenção Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 118 No código a seguir é possível verificar a implementação dos métodos que definimos anteriormente para a nossa classe Data que consistem em gerar e obter uma data public class Data int dia int mes int ano public void gerarDataint dia int mes int ano thisdia dia thismes mes thisano ano public String obterData String data thisdia thismes this ano return data Quanto ao método que será responsável por gerar uma data este não terá nenhum tipo de retorno por conta disso foi definido como void Além disso irá receber três parâmetros um para representar o dia um para o mês e um para o ano Referente ao código implementado para o método apenas é atribuído o valor do parâmetro enviado para o método para o atributo da classe Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 119 Um ponto importante a ser observado é que o parâmetro e os atributos possuem o mesmo nome porém na hora da execução do método ao chamar a variável dia por exemplo o compilador irá sempre buscar primeiro se existe um parâmetro ou variável local definida com esse nome para utilizar apenas se não encontrar nenhuma definição nesse cenário é que irá buscar nos atributos se existe algum com esse nome Por isso utilizamos a palavra reservada this para chamar os atributos a qual tem como objetivo referenciar a própria classe ou seja ao utilizar o this seguido de um ponto poderemos acessar qualquer atributo ou método da própria classe e com isso conseguimos deixar claro que desejamos chamar o atributo naquele momento Com base nesta explicação ficará mais fácil de ler o método de gerar data bem como de identificar que estamos atribuindo os valores dos parâmetros para os seus respectivos atributos Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 120 Dica Palavras reservadas consistem em palavras que são de uso exclusivo da linguagem de programação não sendo permitido criar classes métodos e variáveis utilizandoas Alguns exemplos de palavras reservadas são this class int public void new Referente ao método de obter uma data neste caso está sendo definido que deverá existir um retorno e que este será do tipo String Além disso também está sendo definido que esse método não receberá nenhum parâmetro portanto após o nome do método estamos apenas abrindo e fechando os parênteses Na implementação do método estamos criando uma variável local com nome data do tipo String para a qual estamos atribuindo uma concatenação dos valores dos atributos com o objetivo de montar em uma única String uma data com dia mês e ano separados por barra Ao término está sendo realizado o retorno dessa variável criada utilizando a palavra reservada return Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 121 OBJETOS Após criarmos a classe definirmos os atributos e implementarmos os métodos O próximo passo consiste em realizarmos a instanciação de objetos que utilizem a nossa classe Data como template Para isso iremos criar uma nova classe para a qual daremos o nome de DataTest e aqui será preciso marcar para criar o método main pois será esta a classe responsável por inicializar a execução do nosso código Após a criação da classe vamos fazer a instanciação de dois objetos do tipo Data que devem acontecer dentro do método main A instanciação de um objeto segue o mesmo conceito da criação de uma variável Será preciso definir o tipo de dado que neste caso será o nome da classe criada para representar as nossas datas ou seja Data Na sequência é preciso definir um nome para as variáveis que irão armazenar esse objeto Aqui iremos nomeálas de forma bem simples sendo dataUm e dataDois Como atribuição para as nossas variáveis quando o objetivo é instanciar um objeto é preciso sempre utilizar a palavra reservada new seguida novamente do nome da classe que estamos utilizando como tipo de dado que neste caso é Data porém no momento da atribuição é preciso abrir e fechar parênteses após o nome da classe A seguir é possível visualizar o código que realiza essas instanciações dos objetos public class DataTest public static void mainString args Data dataUm new Data Data dataDois new Data Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 122 Ambos os objetos criados utilizaram como base a classe Data que implementamos previamente Por conta disso ambos possuem os atributos dia mês e ano assim como os métodos para gerar uma data e para obter uma data É possível atribuir valores para os atributos a partir dos nossos objetos Para isso chamamos a variável criada para a instância do objeto seguida de um ponto e do atributo que desejamos utilizar Com isso temos total acesso aos atributos sendo possível atribuir um valor para o atributo utilizando o sinal de igualdade ou simplesmente acessar o seu valor A seguir é apresentado um código que atribui valores para os dois objetos assim como obtém esses valores posteriormente para apresentar para o usuário 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class DataTest public static void mainString args Data dataUm new Data Data dataDois new Data dataUmdia 20 dataUmmes 4 dataUmano 2002 dataDoisdia 10 dataDoismes 9 dataDoisano 1980 JOptionPaneshowMessageDialognull dataUmdia dataUmmes dataUmano JOptionPaneshowMessageDialognull dataDoisdia dataDois mes dataDoisano Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 123 Cada objeto armazena os seus valores exclusivos para os atributos e isso pode ser visualizado no exemplo apresentado O objeto dataUm está atribuindo o valor 20 para o dia 4 para o mês e 2002 para o ano e esses valores serão armazenados apenas para esse objeto Para o objeto dataDois outros valores foram atribuídos sendo 10 para o dia 9 para o mês e 1980 para o ano Tendo cada objeto os seus valores definidos na sequência foi utilizado um JOptionPane para apresentar a data armazenada em cada um e ao executar o código será possível visualizar que o primeiro JOptionPane que apresenta os dados referentes a dataUm irá imprimir 2042002 enquanto o segundo JOptionPane que apresenta a data referente ao objeto dataDois irá imprimir 1091980 Além dos atributos também é possível chamar os métodos implementados para serem utilizados pelo objeto utilizando a mesma estrutura A única diferença é que ao se chamar um método ele é chamado pelo nome seguido da ação de abrir e fechar parênteses entre os quais podem conter parâmetros ou não de acordo com a implementação realizada na classe A seguir é apresentada uma reestruturação do código realizado para exemplificar a utilização de atributos modificandoo para trabalharmos apenas com método Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 124 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class DataTest public static void mainString args Data dataUm new Data Data dataDois new Data dataUmgerarData20 4 2002 dataDoisgerarData10 9 1980 JOptionPaneshowMessageDialognull dataUmobterData JOptionPaneshowMessageDialognull dataDoisobterData A primeira coisa que é possível observar é que a implementação do método main ficou muito mais limpa Isto acontece porque em vez de chamar os três atributos de cada objeto para inicializar estamos fazendo uso do método denominado gerarData enviando por parâmetro o dia mês e ano que devem ser definidos nos atributos Ao executar esse método para o objeto serão executadas as linhas de código definidas na sua implementação sendo aplicada apenas ao objeto que está chamando o método Cabe lembrar que esse método não retorna nenhum valor Para apresentar as datas do JOptionPane o código também ficou mais limpo pois em vez de chamar atributo por atributo e concatenar com as barras para apresentar a data estamos apenas chamando o método obterData e é na implementação desse método que estão sendo realizadas as concatenações para no fim retornar a String já construída com a data para apresentação Como neste o método retorna uma informação o valor desse retorno está sendo enviado como parâmetro para o JOptionPane como valor a ser impresso para o usuário Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 125 Com isso você pode visualizar como acessar e atribuir valores aos atributos do objeto e também como chamar métodos que foram implementados para o objeto SOBRECARGA DE MÉTODOS Quando temos métodos com mesmo nome declarados em uma mesma classe mas que tenham diferentes conjuntos de parâmetros é aí que temos um conceito chamado de sobrecarga de métodos Esse conjunto de parâmetros citado pode ser uma quantidade diferente de parâmetros ou diferentes tipos de parâmetros em diferentes ordens DEITEL DEITEL 2016 Ao chamar um método o compilador irá buscar para execução dentro da classe em questão um método adequado de acordo com o nome o número de parâmetros os tipos de parâmetros e a ordem dos parâmetros DEITEL DEITEL 2016 Para exemplificar analise o código apresentado a seguir o qual não está no contexto da nossa classe de data mas apresenta um exemplo clássico de sobrecarga de métodos que realizam a soma de valores numéricos Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 126 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Calculadora public int somaint num1 int num2 int num3 return num1 num2 num3 public int somaint num1 int num2 return num1 num2 public float somafloat num1 int num2 return num1 num2 public float somaint num1 float num2 return num1 num2 Observe que todos os métodos possuem o nome soma o que é o primeiro princípio que representa a sobrecarga de métodos que consiste em os métodos terem o mesmo nome Porém não é possível termos mais de um método exatamente igual em uma classe por isso os quatro métodos apresentam diferenças em seus parâmetros O primeiro método recebe por parâmetro três valores inteiros enquanto o segundo método recebe apenas dois valores inteiros Com isso esses métodos têm uma quantidade de parâmetros diferente e o compilador irá saber qual deles chamar de acordo com a quantidade de valores informados nos parâmetros Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 127 O terceiro método recebe dois valores por parâmetro sendo o primeiro valor do tipo float e o segundo do tipo int enquanto o quarto método também recebe dois valores por parâmetros porém o primeiro é do tipo int e o segundo do tipo float Esses dois métodos junto ao segundo método recebem todos dois valores por parâmetros e o que os diferencia são os tipos e a ordem dos parâmetros Caso seja chamado o método soma enviando dois valores inteiros por parâmetro o segundo método será executado Ao chamar o método soma enviando como primeiro parâmetro um valor do tipo float e segundo parâmetro um do tipo int o terceiro método será chamado por conta da ordem de parâmetros Porém se for chamado o método soma enviando primeiro um valor do tipo int e depois um valor do tipo float aí o quarto método será executado também por causa da ordem dos parâmetros Com este exemplo da calculadora aplicando sobrecarga ao método de soma é possível visualizar todos os cenários possíveis Além disso podemos observar que todos os métodos implementam o mesmo objetivo que é somar os valores enviados o que muda entre eles é apenas o tipo de dado que está sendo utilizado para a soma Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 128 Para aplicarmos o conceito de sobrecarga de métodos na nossa classe Data iremos definir dois novos atributos um para armazenar as horas e outro para armazenar os minutos Com isso agora um objeto do tipo Data poderá trabalhar com data e hora e será permitido gerar uma data de duas formas considerando apenas os valores referentes à data ou considerando tanto os valores referentes à data quanto os valores referentes à hora A seguir é apresentada a implementação da classe com os novos atributos e o novo método Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 129 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class Data int dia int mes int ano int hora int minuto public void gerarDataint dia int mes int ano thisdia dia thismes mes thisano ano public void gerarDataint dia int mes int ano int hora int minuto thisgerarDatadia mes ano thishora hora thisminuto minuto public String obterData String data thisdia thismes thisano this hora thisminuto return data Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 130 O conceito que diferencia os dois métodos de geração de datas é a quantidade de parâmetros pois o primeiro método recebe apenas três parâmetros enquanto o segundo recebe cinco parâmetros Outro ponto a ser observado é que o segundo método de geração de data faz uso do primeiro método isso ocorre quando na primeira linha estamos chamando o método denominado gerarData que recebe apenas três parâmetros Podemos dizer que ao fazer isso estamos realizando o reaproveitamento de código evitando a duplicação dos códigos de atribuição dos valores de dia mês e ano em ambos os métodos Com a sobrecarga de métodos definida vamos verificar na classe DataTest como realizar a chamada a esses dois métodos A seguir é apresentado o código desta classe com o objeto denominado dataUm chamando o método gerarData com três parâmetros e o objeto dataDois chamando o método gerarData com cinco parâmetros demonstrando o uso da sobrecarga de métodos pelos objetos 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class DataTest public static void mainString args Data dataUm new Data Data dataDois new Data dataUmgerarData20 4 2002 dataDoisgerarData10 9 1980 20 15 JOptionPaneshowMessageDialognull dataUmobterData JOptionPaneshowMessageDialognull dataDoisobterData Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 131 Com isso finalizamos os conceitos que seriam abordados por este ebook e realizamos as nossas primeiras implementações em Java utilizando de Orientação a Objetos Para isso você criou a classe Data definiu seus atributos métodos e sobrecarga de métodos e criou instâncias de objetos a partir da classe criada Neste ebook você aprendeu a realizar a criação de uma classe definindo todos os atributos e métodos necessários para representar os nossos objetos Junto a isso você também viu como fazer para instanciar objetos em Java e percebeu que essas instanciações acontecem sempre com base em uma Classe considerada um template para os objetos Por fim também vimos sobre o conceito de sobrecarga de métodos que nos permite criar diversos métodos com mesma assinatura que na maioria das vezes executam uma mesma ação mas que definem a sua lógica com base em parâmetros diferentes REFERÊNCIAS Primeiros conceitos de orientação a objetos Classes Objetos Atributos Métodos e Sobrecarga de métodos 132 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 MARTIN R C Código limpo habilidades práticas do Agile Software Rio de Janeiro Alta Books 2009 SENAI 135 Até o momento você já aprendeu como criar classes definir atributos e métodos e instanciar objetos Sabemos que um objeto é criado a partir da instanciação de uma classe porém o que é executado quando realizamos o comando de new para criar esse objeto Esse é um dos conceitos que veremos neste ebook que consiste nos construtores uma implementação que é realizada com o objetivo único de definir o que a classe deve fazer ao inicializar um novo objeto a partir dela Além disso para definirmos os valores dos atributos o que fizemos até o momento foi chamar o nosso objeto e acessar diretamente o atributo a partir do comando objetoatributo Porém essa forma está longe de ser a mais indicada pelas convenções da programação orientada a objetos e principalmente pelo conceito de encapsulamento que é um dos pilares da orientação a objetos Por isso neste ebook você também irá aprender a restringir o acesso às informações do objeto abrindo para que sejam feitas apenas alterações permitidas e se necessário aplicando regras específicas para o cenário daquele objeto Ebook Definindo construtores e controlando o acesso às informações do objeto Definindo construtores e controlando o acesso às informações do objeto 138 Vamos evoluir nos conceitos de Orientação a Objetos compreendendo melhor o que são os construtores os quais são executados toda vez que um novo objeto é instanciado a partir de uma classe Também entenderemos aqui o conceito de encapsulamento garantindo um maior controle no acesso às informações de um objeto definindo regras explícitas de acesso a atributos e métodos de uma classe DEFININDO CONSTRUTORES E CONTROLANDO O ACESSO ÀS INFORMAÇÕES DO OBJETO No ebook anterior você aprendeu e aplicou os primeiros conceitos de orientação a objetos O objetivo agora é continuar evoluindo a nossa classe Data aplicando novos conceitos que iremos aprender no decorrer deste ebook mais especificamente construtores modificadores de acesso e encapsulamento Definindo construtores e controlando o acesso às informações do objeto 139 CONSTRUTORES O construtor é um método de uma classe e tem como objetivo principal inicializar os atributos dessa classe sempre que um objeto for instanciado garantindo assim o espaço de memória necessário para sua execução Como um método o construtor trabalha com alguns dos princípios vistos anteriormente como a passagem de parâmetros e a sobrecarga de métodos O diferencial fica no fato de o construtor não possuir um tipo de retorno em sua assinatura e que o nome do construtor sempre será igual ao nome da classe MANZANO COSTA JUNIOR 2014 Definindo construtores e controlando o acesso às informações do objeto 140 A seguinte estrutura é utilizada para definir um construtor Modificador de Acesso Nome da Classe parâmetros Implementação com a inicialização dos atributos O modificador de acesso iremos definilo sempre como public conforme temos trabalhado até o momento O nome do construtor deve ser exatamente igual ao da classe respeitando letras minúsculas e maiúsculas Os parâmetros são passados entre parênteses e seguem a mesma estrutura dos métodos sendo necessário informar o tipo de dado e na sequência o nome do parâmetro sempre separandoo por vírgula caso seja definido mais de um parâmetro Referente à implementação do construtor este consiste principalmente em atribuir valores aos atributos das classes os quais podem ser passados por parâmetro ou inicializados com valores padrões já definidos Definindo construtores e controlando o acesso às informações do objeto 141 Toda classe deve possuir pelo menos um construtor Caso este não seja implementado o compilador irá atribuir um construtor padrão à classe o qual consiste em um construtor sem parâmetros e que inicializa os atributos com os seus valores padrões definidos pela linguagem de programação Esses valores padrões são o zero para valores numéricos false para valores booleanos e null para os demais tipos de dados DEITEL DEITEL 2016 A partir do momento em que você implementar um construtor para a classe de forma explícita este passará a ser o construtor principal da classe e a partir desse momento o compilador não criará mais o construtor padrão de forma automática Portanto se você criar um construtor que receba parâmetros para a inicialização dos atributos não será mais possível utilizar o construtor sem parâmetros a menos que você implemente a sobrecarga desse construtor criando de forma explícita um construtor sem parâmetros DEITEL DEITEL 2016 Definindo construtores e controlando o acesso às informações do objeto 142 Agora você já sabe como criar um construtor para a sua classe porém como chamamos esse método construtor É muito simples e você já fez isso nos exemplos anteriores sempre que instanciou um novo objeto Ao criar um objeto utilizando a palavra reservada new seguida do nome da classe com abertura e fechamento de parênteses no final estamos chamando o construtor padrão da classe ou seja a partir do momento em que for definido um construtor com parâmetros podemos enviar entre parênteses na instanciação do objeto os valores para inicializar os atributos MANZANO COSTA JUNIOR 2014 Um dos grandes objetivos ao utilizar um método construtor é quando queremos garantir ao instanciar um objeto referente à classe que esse objeto inicialize com todos os atributos necessários inicializados Então ao criar um construtor com parâmetros podemos dizer que estamos definindo que para que um objeto seja instanciado a partir desta classe os valores exigidos por parâmetro devem ser informados caso contrário não será permitido instanciar o objeto A seguir temos a classe Data que criamos no ebook anterior na qual aplicamos os conceitos de atributos e métodos Nessa classe foram definidos dois métodos para gerar a data um que leva em consideração apenas o dia mês e ano e outro que considera também a hora e o minuto Esses métodos fazem o Definindo construtores e controlando o acesso às informações do objeto 143 processo de definir valores para os atributos porém não no momento da criação do objeto é preciso primeiro instanciar um objeto do tipo Data que irá utilizar um construtor padrão e como não definimos nenhum específico para a classe neste caso irá inicializar todos os atributos com o valor zero Apenas após essa inicialização é que podemos chamar um dos métodos para gerar a data modificando o valor dos atributos 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class Data int dia int mes int ano int hora int minuto public void gerarDataint dia int mes int ano thisdia dia thismes mes thisano ano public void gerarDataint dia int mes int ano int hora int minuto thisgerarDatadia mes ano thishora hora thisminuto minuto public String obterData String data thisdia thismes thisano this hora thisminuto return data Definindo construtores e controlando o acesso às informações do objeto 144 Vamos modificar esses dois métodos de geração de data para que sejam métodos construtores garantindo assim que ao instanciar um novo objeto a partir da classe Data o construtor padrão não esteja mais disponível sendo necessário informar no mínimo o dia mês e ano referentes à data que estamos criando A seguir é apresentado o código atualizado referente à classe para fazer uso do conceito de construtores 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class Data int dia int mes int ano int hora int minuto public Dataint dia int mes int ano thisdia dia thismes mes thisano ano public Dataint dia int mes int ano int hora int minuto thisdia mes ano thishora hora thisminuto minuto public String obterData String data thisdia thismes thisano this hora thisminuto return data Definindo construtores e controlando o acesso às informações do objeto 145 Os métodos denominados gerarData não existem mais na nossa classe eles foram substituídos para serem construtores dessa classe Observe que os construtores não possuem um tipo de retorno e o nome do método construtor é exatamente o mesmo nome da classe Além disso no segundo construtor no qual é definida também a hora e o minuto na primeira linha é apresentado o código thisdia mes ano Essa linha está chamando o outro construtor da classe o qual é responsável por inicializar os atributos de dia mês e ano ou seja sempre que quiser invocar uma sobrecarga de um construtor dentro da própria classe é possível utilizar a palavra reservada this como uma chamada de método Mas atenção isso é possível apenas dentro de construtores A seguir é apresentada a implementação referente à classe denominada DataTest na qual realizamos a criação e manipulação dos objetos do tipo Data Observe que o código está apresentando diversos erros os quais estão sublinhados de vermelho No caso da instanciação dos objetos o erro está acontecendo porque não existe mais um construtor padrão definido na classe Data portanto agora será necessário enviar os parâmetros de acordo com um dos construtores definidos na classe Quanto aos erros nas linhas 12 e 13 na chamada do método gerarData eles estão acontecendo pelo fato de esses métodos não existirem mais na classe pois os substituímos por construtores Definindo construtores e controlando o acesso às informações do objeto 146 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class DataTest public static void mainString args Data dataUm new Data Data dataDois new Data dataUmgerarData20 4 2002 dataDoisgerarData10 9 1980 20 15 JOptionPaneshowMessageDialognull dataUmobterData JOptionPaneshowMessageDialognull dataDoisobterData Para corrigir esses erros primeiramente iremos enviar os parâmetros na construção dos objetos informando três valores inteiros na criação do objeto denominado dataUm e cinco valores inteiros na criação do objeto denominado dataDois Dessa forma estamos garantindo que esses objetos já serão criados com seus valores de atributos inicializados corretamente Além disso também devemos remover os códigos referentes às chamadas dos métodos de geração de data pois estamos inicializando os atributos diretamente nos construtores A seguir é apresentado o código atualizado referente à classe DataTest Definindo construtores e controlando o acesso às informações do objeto 147 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class DataTest public static void mainString args Data dataUm new Data20 4 2002 Data dataDois new Data10 9 1980 20 15 JOptionPaneshowMessageDialognull dataUmobterData JOptionPaneshowMessageDialognull dataDoisobterData Dessa forma temos agora construtores definidos para a nossa classe Data O próximo passo será restringir o acesso a informações referentes à classe buscando garantir a consistência dos dados MODIFICADORES DE ACESSO Segundo Manzano e Costa Junior 2014 os modificadores de acesso são responsáveis por determinar o nível de visibilidade de atributos e métodos esse é um conceito que é utilizado em conjunto com o encapsulamento que será visto no próximo tópico Existem quatro tipos de modificadores de acesso os quais são definidos da seguinte forma public este modificador de acesso permite que o atributo método ou classe seja acessado a partir de qualquer local private este é o mais restritivo de todos os modificadores de acesso tornando possível o acesso ao atributo ou método apenas de dentro da própria classe protected permite o acesso ao atributo ou método marcado com este modificador apenas de dentro da própria classe ou a partir de classes derivadas da classe principal conceito este relacionado a herança o qual será visto posteriormente default é utilizado sempre que não definimos um modificador de acesso e permite o acesso aos atributos ou métodos a partir de classes criadas dentro do mesmo pacote do projeto Para garantir que nenhuma outra classe tenha acesso direto aos atributos da classe Data iremos modificar a declaração dos atributos para tornálos privados Dessa forma apenas a própria classe Data poderá ter acesso aos valores desses atributos A seguir é apresentado o código atualizado referente aos atributos Definindo construtores e controlando o acesso às informações do objeto 148 private int dia private int mes private int ano private int hora private int minuto Também iremos aplicar o conceito de modificador de acesso a métodos dentro da classe Data Para isso será feita a separação da implementação da classe denominada obterData de forma que será criado um segundo método que será responsável apenas pelo processo de concatenar a data para apresentação O objetivo é que este método que realiza a concatenação da data não seja visível de fora da classe pois é uma implementação que define um comportamento específico para ser utilizado apenas dentro dessa classe Para isso iremos criar este método com o modificador de acesso private Referente ao método obterData este continuará sendo um método público porém agora será responsável apenas por retornar o valor da data formatada não sendo mais o responsável pela regra de concatenação Portanto esse método irá simplesmente chamar o método privado responsável por concatenar a data e irá retornar o seu valor A seguir são apresentadas as implementações referentes a esses métodos Definindo construtores e controlando o acesso às informações do objeto 149 Definindo construtores e controlando o acesso às informações do objeto 150 public String obterData return thisconcatenarData private String concatenarData String data thisdia thismes thisano thishora thisminuto return data ENCAPSULAMENTO O encapsulamento consiste em restringir o acesso aos atributos de uma classe Para isso utilizase dos conceitos vistos em modificadores de acesso tornando privados os atributos de uma classe utilizando o modificador private e permitindo que outras classes acessem ou manipulem os valores referentes a essa classe apenas por intermédio de métodos públicos os quais utilizam o modificador public ARAÚJO 2008 Ao aplicar esse conceito somos capazes de garantir a consistência referente aos valores dos atributos pois ao permitir o acesso aos valores dos atributos apenas por intermédio de um método podemos definir na implementação desse método como esse valor será apresentado e caso necessário não retornamos todas as informações referentes a esse valor apenas as que julgarmos necessárias Da mesma forma ao permitir que a alteração dos valores dos atributos aconteça apenas por intermédio de um método podemos garantir nesse método a consistência do dado realizando validações para garantir que não seja atribuído um valor inválido ARAÚJO 2008 Definindo construtores e controlando o acesso às informações do objeto 151 Existe uma convenção para a nomenclatura desses métodos que controlam o acesso aos atributos os quais chamamos de métodos get e set O método get também chamado de método de acesso é o responsável por obter o valor do atributo E o método set que também é chamado de método modificador é o responsável por modificar os valores dos atributos DEITEL DEITEL 2016 Portanto por convenção o método de acesso sempre irá retornar um valor e o seu nome será get seguido do nome do atributo Quanto ao método modificador este sempre terá void como tipo de retorno e seu nome será set seguido do nome do atributo Além disso o método set recebe por parâmetro o valor que deverá ser definido para o atributo caso passe pelas validações do método garantindo a consistência do dado Definindo construtores e controlando o acesso às informações do objeto 152 Não é obrigatório criar os métodos get e set para todos os atributos da classe O método de acesso deve ser criado apenas para os atributos que podem ter o seu valor acessado por outras classes assim como o método modificador deve ser criado apenas para os atributos que podem ter os seus valores alterados por outras classes O Eclipse traz uma facilidade para a criação dos métodos get e set realizando a sua geração de forma automática Para isso clique com o botão da direita no editor de código referente à classe na qual deseja criar os métodos e selecione Source Na sequência irá abrir um segundo menu no qual você deve selecionar Generate Getters and Setters Feito isso abrirá uma janela na qual você seleciona os atributos para os quais deseja gerar os métodos e ao clicar em Generate o código será gerado Dica Definindo construtores e controlando o acesso às informações do objeto 153 Para a classe Data que estamos criando iremos criar os métodos get e set para encapsular os três atributos referentes à data garantindo assim que não seja possível informar valores inválidos para o dia mês e ano Iniciando pelo atributo ano a única regra na definição de um valor para esse atributo é que deve ser maior do que zero Para isso inicialmente foi criado um método privado responsável por implementar a regra de validação o qual foi denominado isAnoValido e em sua implementação apenas retorna o resultado da verificação se o valor referente ao ano enviado por parâmetro for maior que zero Para o método setAno que é responsável por atribuir um novo valor a variável de instância é feita uma verificação referente a esse valor utilizando o método isAnoValido Caso o retorno do método seja verdadeiro então irá atribuir o valor do parâmetro ao atributo caso contrário irá definir um como valor do atributo garantindo assim que o valor de ano sempre seja válido No que se refere ao método getAno para obter o valor referente ao ano foi mantida a implementação padrão a qual simplesmente retorna o valor da variável ano para quem estiver chamando A seguir são apresentados os três métodos utilizados para o encapsulamento do atributo ano public int getAno return thisano public void setAnoint ano if isAnoValidoano thisano ano else thisano 1 private boolean isAnoValidoint ano return ano 0 Definindo construtores e controlando o acesso às informações do objeto 154 O próximo atributo para o qual iremos criar os métodos get e set é o atributo referente ao mês Vamos iniciar também pela implementação do método de validação do mês o qual chamamos de isMesValido e que irá retornar o resultado da verificação se o valor do parâmetro for maior ou igual a um e menor ou igual a doze garantindo assim que o mês informado seja um mês válido Para o método setMes este terá uma implementação semelhante a que foi definida para o método setDia a qual irá verificar se o valor enviado para atribuir a variável de instância mês é um valor válido utilizando o método de validação que criamos e caso seja esse valor é atribuído ao atributo caso contrário atribuise o valor um como padrão Para o método get referente a esse atributo também foi mantida a implementação padrão a qual simplesmente retorna o valor do atributo A seguir é apresentada a implementação dos métodos mencionados public int getMes return thismes public void setMesint mes if isMesValidomes thismes mes else thismes 1 private boolean isMesValidoint mes return mes 1 mes 12 Definindo construtores e controlando o acesso às informações do objeto 155 Definindo construtores e controlando o acesso às informações do objeto 156 Os últimos métodos de encapsulamento que iremos implementar neste exemplo serão referentes ao atributo dia O método de validação implementado para o dia possui uma lógica um pouco maior pois precisamos garantir que o dia informado esteja dentro do número de dias possíveis para o mês informado Para isso foi definido um comando de decisão encadeado o qual fará diversas verificações em sequência conforme descritas a seguir I Verifica se o dia informado é menor ou igual a zero caso seja retorna que é inválido II Caso o dia informado seja maior que zero verifica se o mês já atribuído ao atributo é menor ou igual a sete e se ao dividir o valor desse mês por dois o resto dessa divisão é diferente de zero o que garante que o valor referente ao mês não seja par Caso atenda a essas duas condições quer dizer que o mês existe é Janeiro Março Maio ou Julho e portanto a validação consistirá em verificar se o dia é melhor ou igual a trinta e um Definindo construtores e controlando o acesso às informações do objeto 157 III Caso não entre na condição anterior irá testar uma nova condição verificando então se o valor referente ao atributo mês é dois caso seja significa que o mês é Fevereiro e portanto a validação consistirá em verificar se o valor referente ao dia é menor ou igual a vinte e nove IV Caso não entre na condição anterior irá verificar se o valor referente ao atributo mês é menor do que seis e se o resto da sua divisão por dois é igual a zero garantindo assim que o valor referente ao mês é par Caso seja significa que o mês é Abril ou Junho e a verificação consistirá em verificar se o valor referente ao dia é menor ou igual a trinta V Caso também não tenha entrado no caso anterior irá iniciar os testes para a segunda metade do ano Para isso irá verificar se o valor referente ao atributo mês é menor ou igual a onze e se o resto da divisão deste valor por dois é diferente de zero garantindo assim que o valor referente ao mês seja ímpar Caso seja significa que o mês atribuído consiste em Setembro ou Novembro e portanto a validação consistirá em verificar se o valor do atributo dia é menor ou igual a trinta VI Como última verificação caso não tenha entrado em nenhuma das anteriores verifica se o valor referente ao atributo mês é menor ou igual a doze e se o resto da divisão deste valor por dois é igual a zero garantindo assim que o valor referente ao mês seja par Caso for significa que o mês atribuído consiste em Agosto Outubro ou Dezembro portanto a validação consistirá em verificar se o valor do atributo dia é menor ou igual a trinta VII Para um cenário no qual por alguma razão não entre em nenhuma dessas validações será retornado ao término do método o valor false indicando que não será um valor válido O método setDia consiste em utilizar esse método isDiaValido criado para verificar se o dia recebido por parâmetro é válido ou não Caso seja válido então irá atribuir o valor do parâmetro ao atributo caso contrário irá atribuir o valor um como valor padrão para o atributo O método get irá manter a sua Definindo construtores e controlando o acesso às informações do objeto 158 implementação base que consiste em apenas retornar o valor do atributo dia A seguir é apresentada a implementação dos métodos de encapsulamento para o atributo dia public int getDia return thisdia public void setDiaint dia if isDiaValidodia thisdia dia else thisdia 1 private boolean isDiaValidoint dia if dia 0 return false else if thismes 7 thismes 2 0 return dia 31 else if thismes 2 return dia 29 else if thismes 6 thismes 2 0 return dia 30 else if thismes 11 thismes 2 0 return dia 30 else if thismes 12 thismes 2 0 return dia 31 return false Definindo construtores e controlando o acesso às informações do objeto 159 Com essas implementações conseguimos garantir que os valores dos atributos dia mês e ano sejam valores que consideramos válidos ou seja consistentes Ao definir que esses atributos são privados impedimos que qualquer classe que instancie um objeto do tipo Data possa atribuir qualquer tipo de valor a esses atributos e por meio do conceito de encapsulamento definimos métodos públicos com a responsabilidade de obter e atribuir valores referentes aos atributos E principalmente nos métodos set responsáveis pela atribuição de valores implementamos regras de validação garantindo que os valores estejam dentro de um intervalo válido para as datas Um cuidado que precisamos ter é que ao definirmos regras para a atribuição dos valores dos atributos dentro do método set é preciso garantir que os construtores caso inicializem valores de atributos de forma que não seja a padrão também sigam essas mesmas regras definidas para manter a consistência Para isso em vez de atribuirmos o valor diretamente para o atributo no construtor podemos fazer essa atribuição utilizando os métodos set garantindo assim que as mesmas regras sejam aplicadas A seguir é apresentado o código do construtor da classe atualizado para utilizar os métodos set na atribuição public Dataint dia int mes int ano setAnoano setMesmes setDiadia Mão na massa Realizamos o encapsulamento dos atributos referentes ao dia mês e ano mas está faltando criar os métodos de encapsulamento para os atributos hora e minuto Realize a implementação desses métodos com base nas seguintes regras a O atributo hora pode receber apenas valores entre zero e vinte e três b O atributo minuto pode receber apenas valores entre zero e cinquenta e nove Definindo construtores e controlando o acesso às informações do objeto 161 Para finalizar o assunto sobre encapsulamento vamos modificar a classe DataTest para forçar o uso de algumas destas validações e essas modificações podem ser visualizadas a seguir Inicialmente foi criado um novo objeto denominado dataTres o qual inicializamos com um dia inválido pois no mês quatro que corresponde a Abril o último dia consiste no dia 30 portanto ao setar os valores no construtor essa validação se realizará e por ser um dia inválido para o mês inicializará o atributo dia desse objeto como sendo um que é o valor padrão public class DataTest public static void mainString args Data dataUm new Data20 4 2002 Data dataDois new Data10 9 1980 20 15 Data dataTres new Data31 4 2005 dataUmsetDia35 dataDoissetMes52 JOptionPaneshowMessageDialognull dataUmobterData JOptionPaneshowMessageDialognull dataDoisobterData JOptionPaneshowMessageDialognull dataTresgetDia Definindo construtores e controlando o acesso às informações do objeto 162 Na sequência foi adicionada nessa classe de teste uma alteração dos valores dos atributos dos objetos dataUm e dataDois Para o objeto dataUm estamos modificando o dia para trinta e cinco que é um dia inválido portanto o método fará a validação e atribuirá o valor um para o atributo dia desse objeto por ser o valor definido como padrão Para o objeto dataDois estamos modificando o mês para cinquenta e dois o qual o método irá verificar que consiste em um mês inválido e irá atribuir para esse atributo desse objeto o valor que definimos como padrão que é um Por fim apenas são apresentados os valores atualizados para as datas Após todas as validações e definições de valores o primeiro JOptionPane irá apresentar a data 142002 0000 o segundo JOptionPane irá apresentar a data 1011980 2015 e o último JOptionPane está apresentando apenas o valor obtido a partir do método getDia referente ao objeto dataTres portanto irá apresentar o valor 1 Com isso finalizamos os conteúdos referentes a este ebook que abordaram conceitos como construtores modificadores de acesso e encapsulamento Definindo construtores e controlando o acesso às informações do objeto 163 Você aprendeu aqui mais um importante conceito da Orientação a Objetos que foi o encapsulamento o qual consiste em um dos pilares desse paradigma Com ele você viu como é possível restringir o acesso a informações de uma classe liberando acesso apenas ao que for necessário garantindo assim uma maior confiabilidade nas informações existentes para cada objeto Junto a isso você compreendeu o conceito de construtores que são implementações executadas todas as vezes que um objeto é instanciado Podemos dizer que o construtor define o que é necessário definir na criação de um objeto garantindo que este seja criado com o mínimo de informações necessárias REFERÊNCIAS Definindo construtores e controlando o acesso às informações do objeto 164 ARAÚJO E C de Orientação a Objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 167 Videoflix Nesta sequência de vídeos será possível aprender com exemplos práticos todos os conceitos que foram abordados de forma mais teórica neste estudo Para isso você irá compreender qual o cenário iremos desenvolver como exemplo iniciando por compreender qual estrutura precisamos desenvolver e quais características e ações esse tipo de objeto precisa conter Na sequência iremos iniciar o desenvolvimento do código para permitir a instanciação desses objetos Para isso vamos trabalhar os conceitos de classes objetos atributos métodos sobrecarga de métodos construtores e encapsulamento São vários conceitos básicos de orientação a objetos que serão abordados nesta sequência de vídeos e o mais importante sempre aplicados a um exemplo que será desenvolvido no decorrer do conteúdo httpsplayervimeocom video821386909h0eb025cd37 Conhecendo o exemplo que será desenvolvido httpsplayervimeocom video821386957h6aba18a47b Criando a classe com seus atributos 168 httpsplayervimeocom video821386987h70691bef38 httpsplayervimeocom video821387947h285a2286ab Criando objetos Inserindo os métodos a classe httpsplayervimeocom video821387987hbd32f3fc0f httpsplayervimeocom video821387915h351576b5f0 Criando os construtores para a classe Adicionando modificadores de acesso e encapsulamento 169 Nestes infocasts você terá a chance de reforçar alguns dos conceitos de orientação a objetos que foram abordados Para isso foram elaborados conteúdos com o objetivo de responder constantes perguntas que costumam surgir sobre os temas em questão Serão abordados temas como a diferença entre classe e objeto e como esses dois conceitos estão diretamente ligados Outro ponto são as regras que são utilizadas para definir uma sobrecarga de métodos pois muitas vezes acreditamos estar realizando uma sobrecarga mas na verdade estamos apenas criando um método novo Por fim iremos reforçar o motivo de o encapsulamento ser tão importante para a programação orientada a objetos Infocast 171 Qual a diferença entre classes e objetos Olá Ao iniciar os estudos é muito comum que os primeiros conceitos sejam sobre classes com seus atributos e métodos e objetos Mas uma coisa que muitas vezes gera confusão é a diferença entre uma classe e um objeto pois muitas vezes falamos em criar um objeto e efetivamente a implementação consiste em criar uma classe para representar esse objeto Por isso o intuito deste Infocast é tentar esclarecer ainda mais essa diferença É importante você entender que classe e objeto são conceitos que andam juntos Sempre que eu quiser instanciar um novo objeto o qual fazemos com o uso da palavra reservada new eu preciso instanciar este objeto com base em uma classe ou seja para ser possível criar um objeto eu preciso ter a implementação de uma classe Um pouco confuso ainda Vou explicar de outra forma Veja a implementação de uma classe como a estrutura de um objeto ou como muitas literaturas abordam como um template de um objeto O objetivo da classe é trazer todos os atributos e métodos necessários para representar um objeto que será criado a partir dessa classe Com isso ao instanciar um novo objeto a partir de uma classe esse objeto é criado com base na estrutura definida na classe tendo os atributos e os métodos ali definidos Graças à implementação feita na classe o objeto é instanciado com características que são os atributos e com a possibilidade de realizar ações que são os métodos Então lembrese para instanciar um objeto preciso de uma classe E o objeto irá ter como base as implementações definidas na classe que serão os atributos e os métodos Agora cada objeto criado terá os seus valores para os atributos e executará as ações dos métodos apenas para o seu contexto ou seja vários objetos podem ser instanciados a partir de uma classe mas cada 172 objeto possui o seu contexto próprio não interferindo um no contexto do outro sendo cada objeto independente Espero que tenha ficado clara a diferença entre classes e objetos Bons estudos e até a próxima 173 Quais as regras que definem uma sobrecarga de métodos Olá A sobrecarga de métodos é um recurso da programação orientada a objetos que quando utilizado pode simplificar muito o processo de desenvolvimento e interpretação do código Antes de qualquer coisa é importante lembrar que não é permitido criar em uma mesma classe dois métodos com a assinatura exatamente igual Ao tentar realizar isso o próprio Eclipse já indicará erro no código antes mesmo de tentarmos executálo Mas o que é uma assinatura de método O ponto validado que não permite duplicação em uma assinatura é o nome do método seguido dos parâmetros A junção dessas duas informações consiste no ponto principal da assinatura do método lembrando que quando falamos de parâmetros estamos falando diretamente do tipo de dado do parâmetro e não do nome pois ao chamar um método o compilador irá considerar apenas o nome do método e a sequência de tipos de dados dos parâmetros para realizar a chamada Tendo esse cenário em mente agora podemos voltar a falar da sobrecarga de métodos Esta nos permite ter métodos com mesmo nome porém com parâmetros diferentes Isto é muito útil quando temos métodos que realizam a mesma ação porém permitindo informar valores diferentes que irão influenciar nessa ação Um exemplo muito clássico é quando criamos um método para a soma em uma classe para representar uma calculadora Podemos ter um método com dois parâmetros para representar o número um e o número dois a serem somados assim como podemos ter outro método que também se chame soma mas que tenha três parâmetros permitindo enviar três números diferentes para a soma ou ainda mais um método chamado soma que permite apenas um parâmetro sendo este um array de números Veja que em todos estes cenários os métodos possuem o mesmo nome no caso soma mas cada um deles tem uma quantidade de parâmetros diferentes o que caracteriza a sobrecarga de métodos 174 É importante ressaltar que não é apenas a quantidade de parâmetros diferentes que é válida Como o que é considerado é o tipo de dado posso ter dois métodos chamados soma um com dois parâmetros do tipo int e outro com dois parâmetros do tipo float Isso também caracteriza uma sobrecarga de métodos pois são definições diferentes por causa dos tipos de dados Bons estudos e até a próxima 175 Por que o encapsulamento é tão importante Olá Ao longo deste estudo já vimos que o encapsulamento é um dos quatro pilares da orientação a objetos você lembra Mas por que ele é considerado tão importante Para entender isso precisamos pensar em um dos principais diferenciais da programação orientada a objetos que consiste muito no conceito de reutilização de código No decorrer destes estudos você verá que vários dos conceitos que serão abordados nos permitirão reaproveitar códigos que foram criados em outras classes Porém junto a esse reaproveitamento é preciso garantir que não será permitido modificar comportamentos definidos em uma classe de forma a descaracterizar o objetivo daquela implementação É nesse cenário que entra muito fortemente o conceito de encapsulamento Como dito nos ebooks o encapsulamento tem como objetivo ao permitir que outras classes acessem a estrutura da classe criada permitir que estas façam uso apenas do que julgarmos relevante para o contexto do desenvolvimento Citando aqui um exemplo diferente dos ebooks se criarmos uma classe que irá representar um computador e tivermos um método de ligar para quem chamar esse método não interessa saber quais as etapas que são necessárias internamente para ligar esse computador apenas interessa que ao chamar esse método o computador ligue Por conta disso toda a lógica necessária para ligar todos os itens necessários para inicializar o computador fica encapsulada dentro da classe sem permitir que seja acessada ou modificada externamente Vimos recentemente que uma prática muito comum de encapsulamento é tornar privados os atributos da classe e permitir o acesso apenas por métodos getters e setters certo Por que isso é considerado um encapsulamento Porque eu estou limitando o acesso aos atributos abrindo para acesso externo apenas os atributos necessários podendo decidir ainda se permitirei apenas acessar ou também alterar Além disso ao ter um método set eu 176 posso garantir regras para a definição de valores ao atributo garantindo por exemplo se for necessário que não seja permitido adicionar um valor numérico negativo Para isso faço uma validação no set e caso seja negativo atributo por padrão o valor zero ou qualquer outro valor que faça sentido Enfim esses foram alguns dos exemplos que demonstraram a importância do encapsulamento na orientação a objetos Bons estudos e até a aproxima 177 Gostou do assunto Você pode aprender ainda mais sobre estes conceitos básicos de orientação a objetos buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Programação Java e Programação Orientada a Objetos Deitel e Deitel 2016 estão entre os autores mais conhecidos quando falamos em Programação Java e Programação Orientada a Objetos O seu livro traz excelentes explicações sobre os assuntos abordados neste estudo Caso queira aprofundar os seus conhecimentos sobre classes atributos métodos objetos sobrecarga de métodos construtores modificadores de acesso e encapsulamento seguem os capítulos para auxiliar no seu aprendizado Capítulo 3 Introdução a classes objetos métodos e strings Capítulo 6 Métodos um exame mais profundo Capítulo 8 Classes e objetos um exame mais profundo DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 179 Neste módulo você pôde iniciar de fato no desenvolvimento orientado a objetos começando pelos primeiros conceitos necessários sobre esse paradigma como a declaração de classes definição de atributos e métodos e instanciação de objetos Com esses conceitos já foi possível criar uma estrutura de um objeto para em outra classe instanciar diferentes objetos que utilizam uma mesma estrutura como base porém cada objeto possui seu conjunto próprio de valores Na sequência começamos a avançar um pouco mais nos conceitos aprendendo sobrecarga de métodos para quando for preciso criar métodos que executem a mesma ação porém com implementações e quantidade ou tipo de parâmetros diferentes Vimos também o que são os construtores e como utilizálos para obrigar que na instanciação de um objeto sejam enviados valores para inicializar alguns atributos quando necessário Por fim trabalhamos o conceito de encapsulamento que é um dos pilares da programação orientada a objetos Resumindo Apliquei princípios de programação orientada a objetos Reconheci processo de desenvolvimento orientado a objeto Modelei linguagem de programação orientada a objetos para resolução de problemas de pequena complexidade Compreendi os conceitos iniciais de Orientação a Objetos como Classes Atributos Métodos e Objetos 181 Parabéns Você chegou ao final destes estudos A seguir explore o infográfico que preparamos para você Ele traz os principais conceitos e definições que foram abordadas no decorrer de toda essa importante jornada de construção de conhecimentos Esse é um breve resumo para você consultar sempre que sentir necessidade PARA CONCLUIR 183 Abstração Um dos pilares da orientação a objetos consiste em definirmos estruturas de classes da forma mais abstrata possível a fim de utilizar para a instanciação de todos os objetos que se enquadram nessa definição Encapsulamento Um dos pilares da orientação a objetos consiste em restringir o acesso aos atributos de uma classe com o objetivo de garantir a consistência dos valores atribuídos ao atributo Para isso criamse os métodos get e set que serão responsáveis por retornar o valor do atributo e modificar o valor do atributo respectivamente Classe Estrutura criada para definir os atributos e métodos que um objeto terá ao ser instanciado Atributo Representam as características de um objeto as quais podem ser informações sobre o objeto ou até representar o estado do objeto Método Representam as ações que um objeto pode realizar são implementações que muitas vezes realizam a utilização ou manipulação dos atributos da classe Podem retornar ou não um valor e podem ou não receber parâmetros Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Iniciando no mundo da Orientação a Objetos 183 183 184 Parâmetro São informações enviadas para um método que normalmente são utilizadas para auxiliar na implementação da lógica referente a esse método Objeto É uma instanciação realizada com base na estrutura de uma classe Todo objeto terá seus valores únicos para os atributos assim como realizará as ações referentes aos métodos apenas para a sua estrutura Tipo de Dado São os tipos de informações que uma variável pode armazenar Existem os tipos primitivos que são os numéricos com e sem casas decimais caractere e lógico Além disso quando um objeto é instanciado podemos dizer que o seu tipo de dado é representado pela classe utilizada na sua instanciação Sobrecarga de Método Conceito que define a criação de métodos com o mesmo nome porém com quantidade tipo de dado ou ordem dos parâmetros diferentes Esse é o único cenário no qual é possível ter dois métodos com o mesmo nome caso contrário será considerado um erro de compilação Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Iniciando no mundo da Orientação a Objetos 184 184 185 Construtor É um método especial responsável por inicializar um objeto Por padrão caso não seja definido um construtor o Java cria o construtor default o qual não recebe parâmetros Porém a partir do momento em que é definido um construtor com parâmetros o default deixa de existir a menos que seja criado de forma explícita pelo desenvolvedor O construtor é chamado sempre na instanciação do objeto junto à palavra reservada new e é utilizado principalmente para inicializar os valores dos atributos Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Iniciando no mundo da Orientação a Objetos 185 Parâmetro São informações enviadas para um método que normalmente são utilizadas para auxiliar na implementação da lógica referente a esse método Objeto É uma instanciação realizada com base na estrutura de uma classe Todo objeto terá seus valores únicos para os atributos assim como realizará as ações referentes aos métodos apenas para a sua estrutura Tipo de Dado São os tipos de informações que uma variável pode armazenar Existem os tipos primitivos que são os numéricos com e sem casas decimais caractere e lógico Além disso quando um objeto é instanciado podemos dizer que o seu tipo de dado é representado pela classe utilizada na sua instanciação Sobrecarga de Método Conceito que define a criação de métodos com o mesmo nome porém com quantidade tipo de dado ou ordem dos parâmetros diferentes Esse é o único cenário no qual é possível ter dois métodos com o mesmo nome caso contrário será considerado um erro de compilação Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Iniciando no mundo da Orientação a Objetos SENAIO Aprofundando os conceitos de Orientação a Objetos 189 Olá estudante Seja bemvindo aos seus estudos Aprofundando os conceitos de Orientação a Objetos Você já conhece os conceitos básicos de Programação Orientada a Objetos POO desde a evolução das linguagens de programação até a criação das primeiras classes seguindo os conceitos do paradigma em questão Portanto a partir de agora você irá aprender conceitos mais avançados de POO ao mesmo tempo em que irá continuar a realizar o uso dos conceitos aprendidos no módulo passado Serão abordados conceitos como Relacionamento entre classes que consiste no fato de que classes também podem se utilizar de objetos para definir as suas características Para esse conceito existem definições como composição e agregação que serão abordadas mais à frente Herança que como foi visto anteriormente consiste em um dos pilares da Orientação a Objetos Interfaces que não são as interfaces gráficas mas sim um conceito de orientação a objetos Polimorfismo que também consiste em um dos pilares da Orientação a Objetos e que será abordado junto aos vários dos conceitos que você vai conferir em seguida E tratamentos de Exceção em que é possível disparar um erro a partir da aplicação quando por algum motivo precisamos que a execução da aplicação seja interrompida Esses são os elementos principais que você confere a seguir iniciando seus estudos e que irão lhe apresentar uma nova forma de realizar o desenvolvimento de código aplicando os principais conceitos de Orientação a Objetos Até mais PARA INICIAR 191 Confira a seguir uma situação prática relacionada aos conteúdos que você estudará a partir de agora Esta é uma importante etapa de seu processo avaliativo Então dediquese ao máximo e busque em sua trajetória de estudos aqui fundamentar os resultados esperados no desafio que está proposto a seguir Aproveite pois essa é uma grande oportunidade de praticar novos conhecimentos Desafio Criando um sistema para gestão imobiliária Como utilizar a Programação Orientada a Objetos no dia a dia Neste desafio você irá criar uma aplicação pensando em uma gestão imobiliária na qual poderá inserir todos os conceitos de Orientação a Objetos que serão pertinentes à sua resolução Lembrese esteja atento a todos os detalhes indicados no Desafio e na Agenda pois tratase de uma parte importante de seu processo avaliativo nestes estudos DESAFIO 193 Comunicação Oral e Escrita 193 Desafio Criando um sistema para gestão imobiliária Você trabalha para uma empresa que foi contratada para desenvolver uma aplicação para o gerenciamento de uma imobiliária Uma equipe de arquitetos já projetou o diagrama de classes referente a essa aplicação o qual é possível ver na imagem apresentada em seguida Comunicação Oral e Escrita 194 194 Pessoa abstract nome String telefone String endereco String cpf String Locatario email String salario String Locacao dataInicio Date dataTermino Date dataPagamento Date enviarCobranca void pagarProprietario void Casa qtdadeAndares int calcularAluguel double Imovel abstract codigo int endereco String valorLocacao double vagasGaragem int quartos int banheiros int calcularAluguel double Apartamento andar int numero int condominio double fundoReserva double investimentos double calcularAluguel double Proprietario conta String agencia String recebervalor double void ReceberValor interface recebervalor double void Corretor registro String dataAdmissao Date comissao double totalComissaoAcumulada double sacarComissoesvalor double void recebervalor double void 1 1 1 1 1 1 1 1 195 Comunicação Oral e Escrita 195 Junto ao diagrama de classes foram entregues alguns requisitos que devem ser seguidos durante a implementação do código os quais são descritos a seguir O cálculo do aluguel deverá ser feito por cada subclasse de acordo com as regras do tipo de imóvel Para a casa o aluguel será apenas o valor definido no imóvel porém no apartamento o aluguel será a soma do valor do aluguel com o valor do condomínio subtraindose desse valor o fundo de reserva e os investimentos A implementação do método receber para o Corretor e o Proprietário devem imprimir uma linha na console indicando que O proprietário nome está recebendo o valor de Rvalor ou O corretor nome está recebendo o valor de Rvalor Além disso para o corretor também deve adicionar o valor da comissão ao atributo totalComissaoAcumulada A implementação do método sacarComissao referente ao corretor deve decrementar do valor de totalComissaoAcumulada o valor que foi sacado A implementação do método enviarCobranca referente à classe Locacao deve imprimir o seguinte texto na console Email email do locatário O valor referente ao seu aluguel neste mês foi de Rvalor calculado do aluguel A implementação do método pagarProprietario referente à classe Locacao deve chamar o método receber da classe proprietário enviando o valor líquido que este deve receber e o método receber da classe corretor enviando o valor da comissão que deve receber Seu objetivo agora é realizar o desenvolvimento dessa aplicação levando em consideração o diagrama de classes junto aos requisitos apresentados e entregar um códigofonte contendo todos os itens Comunicação Oral e Escrita 196 196 Lembrese de consultar a agenda e conferir os detalhes do desafio como resultado esperado forma de desenvolvimento critérios de avaliação e forma de entrega 197 AGENDA Desafio Desenvolvendo uma classe para gestão de notas Resultado esperado Códigofonte referente à implementação do código da aplicação Desenvolvimento Individual Confirmar com o professortutor Critérios de avaliação Implementar a classe Pessoa com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Corretor com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Proprietário com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Locatário com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Imóvel com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Casa com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Apartamento com todos os atributos e métodos definidos no diagrama de classes Implementar a classe Locação com todos os atributos e métodos definidos no diagrama de classes Implementar a interface RecebeValor com a definição dos métodos apresentados no diagrama de classes Definir a classe Pessoa como abstrata Definir a classe Imóvel como abstrata Definir o método abstrato calcularAluguel na classe Imóvel 198 Aplicar o conceito de herança na classe Corretor Locatário Proprietário Casa e Apartamento Implementar a interface na classe Corretor e Proprietário Realizar a associação entre Locação e Corretor Locação e Proprietário e Locação e Imóvel Realizar a sobrescrita de método na classe Casa Implementar o método calcularAluguel na classe Casa conforme as especificações apresentadas nos requisitos Implementar o método calcularAluguel na classe Imóvel conforme as especificações apresentadas nos requisitos Implementar o método receber na classe Proprietário conforme as especificações apresentadas nos requisitos Implementar o método receber na classe Corretor conforme as especificações apresentadas nos requisitos Implementar o método sacarComissoes na classe Corretor conforme as especificações apresentadas nos requisitos Implementar o método enviarCobranca na classe Locação conforme as especificações apresentadas nos requisitos Implementar o método pagarProprietario na classe Locação conforme as especificações apresentadas nos requisitos Apresentar o projeto sem erros de compilação Forma de entrega Arquivo do projeto completo compactado em formato zip a ser entregue em ferramenta do Ambiente Virtual de Aprendizagem AVA 199 Agora você irá começar o processo de realizar o relacionamento entre classes e heranças Junto a isso você também aprenderá sobre o conceito de Sobrescrita de Métodos que é possível aplicar apenas junto ao conceito de Herança ESTUDO E PRÁTICA I RELACIONANDO AS CLASSES E APLICANDO HERANÇA Agora você irá expandir os seus conhecimentos em Orientação a Objetos aprendendo conceitos sobre Relacionamento entre classes podendo ser tanto por agregação quanto por composição Também serão abordados conceitos de Herança a qual permite que uma classe mais especializada herde informações de uma classe mais generalizada Junto a isso será visto o conceito de Sobrescrita de métodos o qual permite que uma classe mais especializada reescreva a implementação de um método criado na classe mais generalizada Neste ebook será abordado o conceito de relacionamento entre classes o qual permite que uma classe utilize objetos criados a partir de outra classe para compor as suas características A respeito do relacionamento entre classes existem dois conceitos básicos os quais também serão abordados a agregação e a composição Você aprenderá a diferença entre esses dois conceitos e saberá quando é melhor utilizar cada um deles Para isso serão demonstrados exemplos que apontam visualmente o relacionamento entre as classes assim como o código que irá gerar esses relacionamentos Ebook Relacionamento entre Classes Relacionamento entre Classes 202 RELACIONAR CLASSES COM OS CONCEITOS DE ORIENTAÇÃO A OBJETOS A partir de agora começaremos a relacionar as nossas classes com base nos conceitos de Orientação a Objetos Com isso iremos permitir que uma classe utilize como característica uma instância de um objeto que seja representado por outra classe ou seja poderemos utilizar um conjunto de classes para separar o nosso código de uma forma mais organizada e fazer com que esse conjunto de classes se relacione para formar um objeto Agora chegou o momento de realizarmos o relacionamento entre classes em que poderemos utilizar classes com um escopo menor para representar características de um objeto com um escopo maior ARAÚJO 2008 Iniciando com um exemplo vamos pensar em um objeto do tipo carro Pense que um carro terá motor pneus e diversas outras características Para representar isso é possível criarmos apenas um grande objeto que contenha todas essas informações referentes a um carro como atributos ou então podemos separar esses componentes que formam o carro em diferentes classes cada uma com sua característica Nesse caso seria possível termos as classes Motor e Pneu considerando que a classe Motor pode ser responsável por armazenar o tipo de combustível necessário e a potência enquanto a classe Pneu pode armazenar informações como o tamanho do aro e a vida útil Tendo essas duas classes criadas seria possível realizar um relacionamento entre a classe Carro e as classes Motor e Pneu criando atributos na classe Carro que sejam instâncias de objetos do tipo Motor e Pneu Na figura a seguir é apresentado um diagrama de classes com base na estrutura descrita Relacionamento entre Classes 203 Carro modelo String marca String ano int acelerar void frear void Motor tipoCombustivel String potencia int Pneu aro int vidaUtil int 1 0 0 1 Figura 10 Diagrama de classes para representar um carro Fonte Do autor 2023 Para ler este diagrama vamos iniciar pela classe Carro a qual é representada por um Retângulo setorizado em três partes Na primeira parte temos o nome da classe no caso Carro Na segunda parte temos os atributos da classe os quais são modelo marca e ano Observe que todos os atributos possuem na sequência do seu nome o sinal de doispontos seguido do tipo de dado referente ao atributo Além disso outro ponto importante é o sinal de subtração na frente do nome do atributo o qual representa que esse atributo será privado caso deseje que seja público é preciso utilizar o sinal de adição Na terceira e última parte temos a definição dos métodos para os quais iniciamos informando a visibilidade que neste caso serão atributos públicos seguida do nome do método e caso existam os parâmetros que vêm dentro dos parênteses sempre indicando o tipo de dado referente a cada parâmetro Ao final usando os doispontos como separador temos o tipo de retorno desse método que neste exemplo serão ambos os métodos do tipo void O mesmo processo acontece para a definição das classes Motor e Pneu com uma pequena diferença de que para essas classes não definimos nenhum método neste exemplo Por conta disso a seção referente aos métodos ficou vazia Referente aos relacionamentos observe que foram criados dois relacionamentos um entre Carro e Motor e outro entre Carro e Pneu Relacionamento entre Classes 204 Para os relacionamentos a flecha indica o sentido do relacionamento indicando neste caso que o Carro é que terá os atributos referente às classes com as quais está realizando a associação Por fim temos as cardinalidades que possuem as seguintes características ARAÚJO 2008 01 zero ou um Indica que a classe que recebe o relacionamento pode estar associada a nenhuma ou uma e somente uma instância da outra classe 1 um Indica que a classe que recebe o relacionamento deve estar associada a uma e somente uma instância da outra classe 0 zero ou muitos Indica que a classe que recebe o relacionamento pode ter uma lista de instâncias referentes a outra classe podendo essa lista ser vazia ou conter qualquer outra quantidade de objetos 1 um ou muitos Indica que a classe que recebe o relacionamento deve ter uma lista de instâncias referentes a outra classe porém essa lista não pode ser vazia ela deve conter no mínimo um objeto inserido nela ou conter qualquer outra quantidade de objetos que não seja zero No nosso exemplo um Carro terá uma e somente uma instância de um motor enquanto um motor pode estar associado a diversos carros diferentes Além disso um Carro deverá ter um ou vários Pneus lembrando que neste caso não podemos especificar a quantidade exata porém para tal cenário sabemos que deve haver pelo menos quatro pneus ou no máximo cinco caso consideremos o estepe Com isso foi apresentada a estrutura do nosso código a partir de um diagrama de classes demonstrando as classes com seus atributos e métodos assim como os seus relacionamentos entre as classes A próxima etapa será vermos em código como ficam essas implementações Relacionamento entre Classes 205 Para isso iremos iniciar pela implementação das classes referentes ao Motor e ao Pneu as quais serão apresentadas nos códigos respectivamente public class Motor private String tipoCombustivel private int potencia public Motor public MotorString tipoCombustivel int potencia thistipoCombustivel tipoCombustivel thispotencia potencia public String getTipoCombustivel return tipoCombustivel public void setTipoCombustivelString tipoCombustivel thistipoCombustivel tipoCombustivel public int getPotencia return potencia public void setPotenciaint potencia thispotencia potencia Relacionamento entre Classes 206 public class Pneu private int aro private int vidaUtil public Pneu public Pneuint aro int vidaUtil thisaro aro thisvidaUtil vidaUtil public int getAro return aro public void setAroint aro thisaro aro public int getVidaUtil return vidaUtil public void setVidaUtilint vidaUtil thisvidaUtil vidaUtil Essas duas classes possuem uma estrutura bem simples com a definição dos seus atributos utilizando o modificador de acesso privado e os métodos de acesso get e set garantindo assim a aplicação do encapsulamento Além disso foram definidos dois construtores um solicitando o envio de todos os valores para inicialização dos atributos e outro sendo o construtor padrão Relacionamento entre Classes 207 Agora que temos essas duas classes definidas o próximo passo será implementar a classe Carro a qual terá uma associação com essas duas classes já criadas definindo com base nessas classes como atributos da classe Carro No exemplo a seguir é possível verificar a codificação referente à classe public class Carro private String modelo private String marca private int ano private Motor motor private ArrayListPneu pneus public CarroString modelo String marca int ano Motor motor ArrayListPneu pneus thismodelo modelo thismarca marca thisano ano thismotor motor thispneus pneus public String getModelo return modelo public void setModeloString modelo thismodelo modelo 208 Relacionamento entre Classes public String getMarca return marca public void setMarcaString marca thismarca marca public int getAno return ano public void setAnoint ano thisano ano public Motor getMotor return motor public void setMotorMotor motor thismotor motor public ListPneu getPneus return pneus public void setPneusArrayListPneu pneus thispneus pneus 209 Relacionamento entre Classes Na classe Carro além da definição dos atributos e seus métodos get e set conforme representado no diagrama de classes também foram adicionados dois atributos com base nos relacionamentos sendo um atributo do tipo Motor e o outro representado por uma lista de objetos do tipo Pneu Um outro ponto de atenção na implementação da classe Carro é referente ao construtor Observe que não existe construtor padrão apenas um construtor que recebe todos os parâmetros inclusive o Motor e a lista de Pneus Isso ocorre porque no diagrama de classes foi definido que um Carro deve conter obrigatoriamente um motor assim como deve conter obrigatoriamente um conjunto de Pneus Não iremos validar aqui a quantidade de Pneus que deve existir no carro este será um assunto para um pouco mais adiante nos nossos estudos Para representar a lista de Pneus utilizamos o tipo ArrayList como base que é uma implementação de lista presente na biblioteca padrão do Java a qual nos fornece algumas facilidades para o trabalho com listas de objetos como crescimento dinâmico adicionar e remover itens a partir de métodos já implementados pela classe em questão entre outras facilidades A classe ArrayList é apenas uma das várias implementações de lista presentes na biblioteca padrão do Java pertencentes ao conceito de Collections Para conhecer esta e outras implementações você pode ler o Capítulo 7 do livro Java Como Programar DEITEL DEITEL 2016 o Capítulo 8 do livro Java 8 Programação de Computadores MANZANO COSTA JÚNIOR 2014 e o Capítulo 10 do livro Orientação a Objetos com Java Simples Fácil e Eficiente ARAÚJO 2008 Curiosidade Vimos até aqui o que chamamos de associação simples que consiste nesse relacionamento entre classes conforme apresentado Porém existem outros conceitos referentes à associação que precisamos compreender chamados de Agregação e Composição os quais serão mais bem explicados na sequência Relacionamento entre Classes 210 Composição Em uma associação sempre temos uma classe que irá receber a associação e a classe com a qual irá se associar A composição define que não faz sentido existir o objeto com o qual a classe irá se associar se a associação não existir Nesse cenário geralmente a classe que recebe a associação é a responsável por criar e destruir o objeto com o qual está se associando garantindo assim que o objeto não permaneça existindo depois que o objeto referente à classe que recebe a associação deixar de existir ARAÚJO 2008 Iremos utilizar um exemplo diferente para demonstrar a composição no qual teremos uma classe que irá representar um Banco e uma classe que irá representar uma Conta Bancária Nesse cenário apenas faz sentido existir um objeto referente à conta bancária caso exista um Banco pois não deve existir uma Conta sem que esta esteja associada a um Banco A figura a seguir apresenta o diagrama de classes referente a essa estrutura nome String numero int criarContanumero String titular String void numero String saldo double titular String 0 1 Conta Banco Figura 11 Diagrama de classes referente à composição Fonte Do autor 2023 No caso da composição a diferença que temos é que no relacionamento utilizamos um losango preenchido na cor preta indicando que essa associação é uma composição Outro ponto a ser observado é na definição da classe Banco onde foi definido um método denominado criarConta o qual recebe por parâmetro os valores necessários para inicializar uma classe do tipo Conta Por termos aqui uma composição a classe Banco será a responsável por criar e gerenciar as contas bancárias situação em que caso seja removido o objeto referente ao Banco todas as contas criadas a partir desse Banco também serão removidas Relacionamento entre Classes 211 No código seguinte podemos analisar a implementação da classe Conta a qual possui seus atributos privados os métodos de acesso get e set e apenas um construtor que recebe o número da conta e o nome do titular para inicializar o objeto sendo o saldo sempre inicializado em zero public class Conta private String numero private double saldo private String titular public ContaString numero String titular thisnumero numero thistitular titular thissaldo 0 public String getNumero return numero public void setNumeroString numero thisnumero numero public double getSaldo return saldo public void setSaldodouble saldo thissaldo saldo Relacionamento entre Classes 212 public String getTitular return titular public void setTitularString titular thistitular titular O código seguinte apresenta a codificação referente à classe Banco Nessa codificação é possível observar que por ser a classe Banco a responsável por criar as contas bancárias não foram criados métodos de acesso para a lista de contas sendo preciso criar uma nova conta sempre por intermédio do método criarConta public class Banco private String nome private int numero private ArrayListConta contas public BancoString nome int numero thisnome nome thisnumero numero thiscontas new ArrayListConta 213 Relacionamento entre Classes public void criarContaString numero String titular Conta conta new Contanumero titular contasaddconta public String getNome return nome public void setNomeString nome thisnome nome public int getNumero return numero public void setNumeroint numero thisnumero numero Para a classe Banco temos uma lista de contas criadas a partir da composição definida para a associação entre Banco e Conta e essa lista é inicializada como uma lista vazia no construtor da classe junto à definição do número e do nome do banco Para a criação das contas foi implementado um método na classe Banco que cria um objeto referente à classe Conta e adiciona esse objeto à lista de contas pertencentes ao Banco Cabe reforçar que não foram criados os métodos de acesso get e set para a lista de contas pois a criação de uma conta sempre deverá ser realizada por intermédio da classe Banco garantindo assim que estaremos atendendo ao conceito de composição Relacionamento entre Classes 214 Agregação No sentido contrário da composição a agregação segue o conceito em que ambas as classes podem existir sozinhas mesmo que não exista uma associação entre elas ARAÚJO 2008 Nesse caso não é necessário que a classe principal seja a responsável pela criação de objetos para a classe com a qual se relaciona podendo esses objetos ser criados separadamente e atribuídos pelos modificadores de acesso get e set Para exemplificar vamos trabalhar com as classes Pessoa e Endereço de forma que a classe Pessoa tenha uma associação de agregação com a classe Endereço Com isso caso seja preciso remover uma Pessoa o objeto Endereço deve ser mantido para que possa ser utilizado para relacionar com outros objetos posteriormente Na figura a seguir é apresentado o diagrama de classes referente a essa estrutura nome String cpf String rua String bairro String cidade String 0 1 Endereço Pessoa Figura 12 Diagrama de classes referente à agregação Fonte Do autor 2023 A agregação também é representada por um losango porém nesse caso o losango não possui o preenchimento na cor preta O diagrama está indicando uma associação de agregação entre Pessoa e Endereço em que uma pessoa deverá ter um e somente um endereço enquanto um endereço pode pertencer a nenhuma ou várias pessoas Neste caso como a classe Pessoa terá o atributo referente a uma instância da classe Endereço esse atributo não será uma lista pois cada Pessoa poderá ter apenas um endereço No código a seguir é possível observar a implementação da classe Endereço para a qual foi definida uma estrutura simples para exemplificação contendo apenas os atributos denominados rua bairro e cidade Relacionamento entre Classes 215 public class Endereco private String rua private String bairro private String cidade public String getRua return rua public void setRuaString rua thisrua rua public String getBairro return bairro public void setBairroString bairro thisbairro bairro public String getCidade return cidade public void setCidadeString cidade thiscidade cidade Relacionamento entre Classes 216 Na sequência é apresentado o código referente à classe Pessoa em que temos os atributos denominados nome e cpf além do atributo gerado pela agregação o qual foi denominado endereço Neste caso como o diagrama de classes indica que nesta agregação uma Pessoa deve conter obrigatoriamente um endereço foi criado apenas um construtor que obriga que se informem os valores de todos os atributos na construção do objeto public class Pessoa private String nome private String cpf private Endereco endereco public PessoaString nome String cpf Endereco endereco thisnome nome thiscpf cpf thisendereco endereco public String getNome return nome public void setNomeString nome thisnome nome public String getCpf return cpf Relacionamento entre Classes 217 public void setCpfString cpf thiscpf cpf public Endereco getEndereco return endereco public void setEnderecoEndereco endereco thisendereco endereco Outro ponto importante a ser observado é que a classe Pessoa possui os modificadores de acesso getEndereco e setEndereco lembrando que isso ocorre porque na agregação os objetos podem existir de forma independente não sendo necessário que o objeto referente à classe principal exista para que o objeto com o qual tem a associação também exista Para todos os exemplos apresentados não foi criada a classe com o método main para inicializar os objetos e testar a implementação Realize a implementação dessa classe para todos os três cenários apresentados analisando a diferença na instanciação e atribuição de valores entre eles Mão na massa Foram apresentados três tipos de associação a associação simples a composição e a agregação A diferença entre eles está na forma como é implementado o código sendo que a associação simples e a agregação possuem o mesmo conceito mudando apenas a representação gráfica no diagrama de classes Já a composição possui regras mais específicas para o relacionamento entre as classes tornando responsabilidade da classe que esteja recebendo a associação a criação e destruição do objeto com o qual está se associando pois nesse cenário não deve existir um objeto que não esteja associado a nenhum outro Atenção Neste ebook você aprendeu os diferentes conceitos para a realização do relacionamento entre classes passando pela associação simples pela composição e pela agregação Para cada um desses tipos de relacionamentos você aprendeu como é a representação do diagrama de classes e como deve ser realizada a implementação das classes para realizar o relacionamento entre as classes respeitando as regras de acordo com o tipo de associação utilizado Siga com seus estudos e continue aprofundando seus conhecimentos acerca da Programação Orientada a Objetos Relacionamento entre Classes 218 REFERÊNCIAS Relacionamento entre Classes 219 ARAÚJO E C de Orientação a Objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 221 Em muitas situações criamos classes para representar objetos que possuam características semelhantes sendo necessário definir diversas vezes um tipo de atributo para diversas classes diferentes Com o objetivo de otimizar esse pro cesso você irá conhecer neste ebook o conceito de herança dentro da Orien tação a Objetos que nos permite trabalhar com classes mais generalizadas e classes mais especializadas realizando uma reutilização de código para cenários em que classes possuam um contexto similar Junto ao conceito de herança você irá compreender sobre a sobrescrita de métodos conceito este que permite que as classes mais especializadas reaproveitem ou até mesmo reescrevam os métodos definidos na classe mais generalizada Ebook Herança e Sobrescrita de Métodos Herança e Sobrescrita de Métodos 224 HERANÇAS EM PROGRAMAÇÃO ORIENTADA A OBJETOS A partir de agora você conhecerá o conceito de Herança que nos permite criar classes mais generalizadas com atributos e métodos comuns para diversos cenários e também classes mais especializadas as quais poderão aproveitar as definições realizadas nas classes mais generalizadas além de incluir novos atributos e métodos específicos para esse objeto Com isso você verá que será possível trabalhar ainda mais com o conceito de reaproveitamento de código algo que é de grande relevância para a Orientação a Objetos Na Orientação a Objetos o conceito de herança consiste no fato de uma classe herdar de outra classe todas as características e métodos definidos com os modificadores public ou protected Com isso é possível que uma classe reutilize o código que já foi implementado e testado em uma classe hierarquicamente maior e quando bem aplicado proporciona um ganho de tempo no desenvolvimento do código pois não é preciso ficar reescrevendo códigos já implementados MANZANO COSTA JÚNIOR 2014 Ao trabalhar com herança é comum dizermos que temos classes mais generalizadas as quais vão implementar os atributos e métodos que poderão ser herdados por outras classes que geralmente chamamos de superclasse Além disso temos as classes mais especializadas as quais irão herdar os atributos e métodos porém por serem mais especializadas também podem definir atributos e métodos específicos para o seu contexto e essas classes geralmente são chamadas de subclasses Dessa forma o sentido da herança sempre será uma subclasse herdando atributos e métodos de uma superclasse DEITEL DEITEL 2016 Um ponto importante de ressaltar é que no Java não é permitida a herança múltipla como em algumas outras linguagens de programação sendo permitido que uma subclasse herde de apenas uma superclasse Herança e Sobrescrita de Métodos 225 Porém é permitido o conceito de herança indireta que consiste em uma hierarquia de heranças quando uma subclasse herda de uma superclasse porém essa superclasse é uma subclasse de outra superclasse e nesse cenário a subclasse mais inferior na hierarquia irá herdar todos os atributos e métodos da sua superclasse e também da superclasse acima dela MANZANO COSTA JÚNIOR 2014 Para exemplificar esta situação vamos considerar um exemplo clássico de herança que consiste em representar toda uma hierarquia de animais a qual está estruturada no diagrama de classes apresentado na figura a seguir Animal Mamífero Cachorro Gato Pato Arara Ave Figura 13 Diagrama de classes de uma hierarquia de animais Fonte Do autor 2023 Neste diagrama temos uma hierarquia de três níveis de herança na qual a superclasse principal é a classe Animal que está no topo desta hierarquia e todas as classes abaixo dela estão herdando seus atributos e métodos No segundo nível temos as classes Mamífero e Ave as quais estão herdando os atributos e métodos da classe Animal Por fim no terceiro nível temos as classes Gato e Cachorro que herdam diretamente da classe Mamífero mas também herdam indiretamente da classe Animal pois a classe Mamífero está herdando de Animal Neste cenário se analisarmos a classe Gato esta irá herdar todos os atributos e métodos de Mamífero através de uma herança direta bem como todos os atributos e métodos de Animal através de uma herança indireta O mesmo conceito se aplica às classes Cachorro Arara e Pato Herança e Sobrescrita de Métodos 226 Um outro ponto importante a ser observado neste diagrama é o desenho do relacionamento o qual possui uma ligação que lembra uma associação simples porém com a diferença de que a flecha que indica a direção da herança não é preenchida na cor preta É comum existirem dúvidas referentes a quando devemos criar uma herança ou a quando devemos criar uma associação Para auxiliar nesta análise Deitel e Deitel 2016 sugerem a utilização dos termos é um e tem um para identificar quando é herança e quando é associação sendo que o termo é um indica herança enquanto o termo tem um indica associação Veja alguns exemplos Cachorro é um Animal Essa frase faz sentido portanto uma herança pode ser aplicada aqui pois um cachorro é um animal Ao testar o outro cenário se tentarmos aplicar o termo Cachorro tem um Animal não faria sentido Pessoa tem um Endereço Nesse cenário uma associação pode ser aplicada pois a leitura da frase faz sentido sendo que uma pessoa tem um endereço Se testarmos o outro cenário veremos que a frase não faz muito sentido pois uma Pessoa não é um Endereço Dica Vamos verificar agora como é feita a implementação de herança no Java Para isso iremos primeiramente utilizar a estrutura do diagrama de classes de animais demonstrado previamente implementando as classes Animal Mamífero e Cachorro com suas respectivas heranças Neste exemplo não iremos definir atributos e métodos apenas a definição das classes para entendermos como implementar o conceito iniciando pela classe Animal que é a superclasse principal para a qual será feita uma implementação de classe padrão conforme já estamos acostumados O código a seguir apresenta a estrutura dessa classe Herança e Sobrescrita de Métodos 227 public class Animal Nesta classe não foi adicionado nenhum código que já não tenhamos aprendido anteriormente apenas é feita a definição da classe Animal No código a seguir é apresentada a implementação da classe Mamífero e agora sim temos uma diferença na assinatura da classe onde surgiu a palavra reservada extends o que indica que essa classe irá herdar informações de outra classe Portanto para a definição da herança utilizamos após o nome da classe a palavra extends e o nome da superclasse de onde herdará as informações que neste caso é Animal public class Mamifero extends Animal Por fim o próximo código apresenta a implementação da classe Cachorro a qual herda de Mamífero portanto a assinatura da classe contém a palavra reservada extends seguida do nome da classe Mamífero lembrando que ao herdar de Mamífero a classe Cachorro também irá herdar as informações da superclasse de Mamífero que neste caso é Animal Portanto podemos ler que um Cachorro é um Mamífero que é um Animal sendo possível afirmar que um Cachorro é um Mamífero e que é um Animal Herança e Sobrescrita de Métodos 228 public class Cachorro extends Mamifero Até aqui você aprendeu a representar uma estrutura de herança em um diagrama de classes e a implementar essas classes em Java realizando as heranças entre subclasses e superclasses utilizando a palavra reservada extends O próximo passo consiste em vermos um exemplo mais completo de Herança no qual iremos definir atributos e métodos Será utilizada a título de exemplo uma estrutura bem tradicional para a explicação de herança que consiste em uma superclasse denominada Pessoa com duas subclasses as quais serão denominadas PessoaFisica e PessoaJuridica A figura a seguir apresenta o diagrama de classes referente a essa estrutura Pessoa nome String idade int endereco String telefone String fazerAniversario void PessoaJuridica cnpj String inscricaoEstadual String validarCnpj boolean PessoaFisica rg String cpf String validarCpf boolean Figura 14 Estrutura de classes referente à estrutura de Pessoa Fonte Do autor 2023 Herança e Sobrescrita de Métodos 229 A superclasse Pessoa que é a classe mais generalizada possui todos os atributos que são comuns entre todos os tipos de Pessoa Neste caso temos o nome a idade o endereço e o telefone Estes são atributos que tanto Pessoa Física quanto Pessoa Jurídica terão inclusive a idade pois toda Pessoa Jurídica possui uma data de fundação Além disso a classe Pessoa terá um método denominado fazerAniversario o qual será comum para todas as classes que herdam dela As subclasses PessoaFisica e PessoaJuridica são as classes mais especializadas e elas irão herdar as informações da superclasse Pessoa e junto a isso terão suas informações específicas No caso da Pessoa Física esta terá atributos para armazenar o RG e o CPF da pessoa enquanto a Pessoa Jurídica terá atributos para armazenar o CNPJ e a Inscrição Estadual Outras características específicas poderiam ser armazenadas aqui porém a ideia é mantermos o exemplo simples para demonstrar a implementação dessa estrutura Essas classes também terão uma implementação específica de métodos com a classe Pessoa Física tendo um método para validar o CPF e a classe pessoa jurídica um método para validar o CNPJ A primeira classe que será implementada é a superclasse Pessoa cuja implementação é demonstrada no código a seguir public class Pessoa private String nome private int idade private String endereco private String telefone public PessoaString nome thisnome nome Herança e Sobrescrita de Métodos 230 public PessoaString nome String endereco String telefone thisnome nome thisendereco endereco thistelefone telefone public void fazerAniversario thisidade thisidade 1 public String getNome return nome public void setNomeString nome thisnome nome public int getIdade return idade public String getEndereco return endereco public void setEnderecoString endereco thisendereco endereco public String getTelefone return telefone Herança e Sobrescrita de Métodos 231 public void setTelefoneString telefone thistelefone telefone Para esta classe foram definidos os atributos referentes a nome idade endereço e telefone assim como o método fazerAniversario que será responsável por adicionar 1 um ao valor do atributo idade Também foram definidos dois construtores para esta classe um exigindo pelo menos a inicialização no nome da pessoa e outro solicitando o nome endereço e telefone Agora que a classe Pessoa já está definida o próximo passo é implementar as subclasses e iremos iniciar pela classe PessoaFisica cuja implementação é demonstrada no próximo código Para esta classe além da implementação da herança utilizando o extends também foram definidos dois novos atributos o RG e o CPF além do método validarCPF que neste caso adicionamos apenas uma implementação de um Systemoutprintln informando que o CPF está sendo validado public class PessoaFisica extends Pessoa private String rg private String cpf public PessoaFisicaString nome String rg String cpf supernome thisrg rg thiscpf cpf Herança e Sobrescrita de Métodos 232 public PessoaFisicaString nome String endereco String telefone String rg String cpf supernome endereco telefone thiscpf cpf thisrg rg public boolean validarCpf SystemoutprintlnValidando CPF return true public String getRg return rg public String getCpf return cpf A última classe que iremos implementar neste exemplo é a classe PessoaJuridica a qual também irá utilizar o extends para herdar as informações da classe Pessoa além de implementar suas características mais específicas que são os atributos CPNJ e Inscrição Estadual e também o método validarCnpj Para a implementação do método também iremos apenas adicionar um System outprintln informando que o CNPJ está sendo validado A implementação da classe PessoaJuridica é apresentada no código a seguir Herança e Sobrescrita de Métodos 233 public class PessoaJuridica extends Pessoa private String cnpj private String inscricaoEstadual public PessoaJuridicaString nome String cnpj String inscricaoEstadual supernome thiscnpj cnpj thisinscricaoEstadual inscricaoEstadual public PessoaJuridicaString nome String endereco String telefone String cnpj String inscricaoEstadual supernome endereco telefone thiscnpj cnpj thisinscricaoEstadual inscricaoEstadual public boolean validarCnpj SystemoutprintlnValidando CNPJ return true public String getCnpj return cnpj public String getInscricaoEstadual return inscricaoEstadual Herança e Sobrescrita de Métodos 234 public void setInscricaoEstadualString inscricaoEstadual thisinscricaoEstadual inscricaoEstadual Um ponto importante para destacar é que ambas as classes precisaram implementar os construtores que atendem ao construtor da superclasse Isso ocorre porque ao herdar da classe Pessoa a subclasse deve obrigatoriamente chamar o construtor da superclasse caso contrário não será possível realizar uma instanciação da subclasse com base na superclasse Em ambos os casos criamos dois construtores um que recebe apenas o nome da pessoa junto aos atributos específicos e outro que recebe o nome endereço e telefone da pessoa junto aos atributos específicos da classe Dessa forma garantimos que a subclasse conseguirá fornecer a superclasse os dados necessários para a sua inicialização e isto é feito a partir da chamada do super no início do construtor da subclasse palavra reservada essa que é responsável por referenciar a superclasse No exemplo apresentado não realizamos uma implementação para os métodos CPF e CNPJ Para essas validações existem cálculos específicos que verificam se o CPF ou o CNPJ são válidos Pesquise como realizar esses cálculos e realize a implementação desses métodos para que realizem as validações corretamente Mão na massa Herança e Sobrescrita de Métodos 235 Em alguns casos não foram criados os métodos de acesso para determinados atributos a fim de garantir o encapsulamento Na classe Pessoa não foi implementado o setIdade pois a idade sempre deverá ser alterada por intermédio do método fazerAniversario Na classe PessoaFisica não foram criados o setCpf e o setRg pois esses valores deverão ser informados na hora da criação do objeto e não poderão mais ser alterados Referente à classe PessoaJuridica não foi criado o método setCnpj pois o CNPJ deverá ser informado na criação do objeto e também não poderá mais ser alterado posteriormente Atenção Vamos criar uma classe com a implementação do método main para testarmos o nosso código e analisarmos no código o funcionamento do conceito de herança A seguir você confere a implementação desse código no qual estamos instanciando três objetos um do tipo Pessoa um do tipo PessoaFisica e um do tipo PessoaJuridica public class Principal public static void mainString args Pessoa pessoa new PessoaPessoa 1 PessoaFisica pessoaFisica new PessoaFisicaPessoa 2 12345 12345678900 PessoaJuridica pessoaJuridica new PessoaJuridica Pessoa 3 12345678000190 123 Herança e Sobrescrita de Métodos 236 pessoaFisicafazerAniversario pessoaJuridicavalidarCnpj pessoaFisicavalidarCpf pessoaFisicasetTelefone00000000000 Na instanciação dos objetos estamos utilizando os construtores definidos em cada uma das classes mas é importante ressaltar a instanciação dos objetos PessoaFisica e PessoaJuridica que estão enviando informações tanto para a classe em questão quanto para a superclasse ao construir o objeto Na sequência demonstrase que algumas chamadas de métodos são feitas sendo possível a partir do objeto pessoaFisica acessar o método fazerAniversario que foi implementado na classe Pessoa e herdado pela classe PessoaFisica Referente aos métodos de validação como foi uma implementação específica de cada classe apenas o objeto pessoaFisica consegue acessar o método validarCpf e apenas o objeto do tipo pessoaJuridica consegue acessar o método validarCnpj Por fim é apresentado um exemplo do objeto de tipo pessoaFisica definindo um valor para o atributo telefone criado na classe Pessoa da qual esse objeto herda as informações Com isso temos uma estrutura completa de herança criada com o objetivo de exemplificar esse conceito trabalhando com informações mais generalizadas que são criadas na superclasse e herdadas pelas subclasses e com informações mais especializadas que são criadas por cada subclasse especificamente para o seu contexto Herança e Sobrescrita de Métodos 237 Sobrescrita de métodos Você já viu anteriormente como funciona o conceito de sobrecarga de métodos que é quando podemos ter em uma mesma classe métodos com mesmo nome porém com quantidade ou tipo de parâmetros diferentes A sobrescrita de métodos é um conceito muito relacionado à herança e consiste em reescrever um método definido na superclasse dentro das subclasses Para demonstrar este conceito no exemplo das classes referentes a Pessoa que utilizamos anteriormente podemos modificar a estrutura para definirmos um método denominado validar na superclasse Pessoa e reescrever esse método nas subclasses PessoaFisica e PessoaJuridica com o objetivo de implementar a validação específica para cada um destes cenários Para isso a figura a seguir apresenta o diagrama de classes modificado para realizar a sobrescrita de método Pessoa nome String idade int endereco String telefone String fazerAniversario void validar boolean PessoaJuridica cnpj String inscricaoEstadual String validar boolean PessoaFisica rg String cpf String validar boolean Figura 15 Diagrama de classes referente à estrutura de Pessoa contendo sobrescrita de método Fonte Do autor 2023 Herança e Sobrescrita de Métodos 238 Herança e Sobrescrita de Métodos Na implementação das classes iremos focar aqui em apresentar as modificações necessárias no código desenvolvido anteriormente para aplicar o conceito de sobrescrita de métodos Para isso você confere a seguir o código referente à classe Pessoa com uma implementação simples do método validar contendo um Systemoutprintln informando que está validando na superclasse public class Pessoa private String nome private int idade private String endereco private String telefone public PessoaString nome thisnome nome public PessoaString nome String endereco String telefone thisnome nome thisendereco endereco thistelefone telefone public void fazerAniversario thisidade thisidade 1 public boolean validar SystemoutprintlnValidando na superclasse return true Herança e Sobrescrita de Métodos 239 Herança e Sobrescrita de Métodos public String getNome return nome public void setNomeString nome thisnome nome public int getIdade return idade public String getEndereco return endereco public void setEnderecoString endereco thisendereco endereco public String getTelefone return telefone public void setTelefoneString telefone thistelefone telefone Em seguida você confere a implementação da subclasse PessoaFisica na qual é realizada uma sobrescrita no método validar modificando o seu conteúdo para imprimir usando um Systemoutprintln o texto Validando CPF Herança e Sobrescrita de Métodos 240 public class PessoaFisica extends Pessoa private String rg private String cpf public PessoaFisicaString nome String rg String cpf supernome thisrg rg thiscpf cpf public PessoaFisicaString nome String endereco String telefoneString rg String cpf supernome endereco telefone thiscpf cpf thisrg rg Override public boolean validar supervalidar SystemoutprintlnValidando CPF return true public String getRg return rg public String getCpf return cpf Herança e Sobrescrita de Métodos 241 No método validar que está sendo sobrescrito na classe PessoaFisica é possível verificar a existência de um Override acima da assinatura do método Essa anotação foi adicionada automaticamente pelo eclipse e ela tem o objetivo de indicar que este é um método sobrescrito Em seguida é apresentada a implementação da classe PessoaJuridica a qual segue o mesmo princípio da classe PessoaFisica modificando apenas o conteúdo do Systemoutprintln para Validando CNPJ public class PessoaJuridica extends Pessoa private String cnpj private String inscricaoEstadual public PessoaJuridicaString nome String cnpj String inscricaoEstadual supernome thiscnpj cnpj thisinscricaoEstadual inscricaoEstadual public PessoaJuridicaString nome String endereco String telefone String cnpj String inscricaoEstadual supernome endereco telefone thiscnpj cnpj thisinscricaoEstadual inscricaoEstadual Override public boolean validar SystemoutprintlnValidando CNPJ return true Herança e Sobrescrita de Métodos 242 public String getCnpj return cnpj public String getInscricaoEstadual return inscricaoEstadual public void setInscricaoEstadualString inscricaoEstadual thisinscricaoEstadual inscricaoEstadual Por fim é possível verificar na figura seguinte que as alterações feitas na classe que contém o método main Para este cenário apenas foram instanciados três objetos um referente a cada classe e foram chamados para cada um dos objetos o método validar Para o objeto do tipo Pessoa o método irá imprimir na console o texto Validando na superclasse para o objeto do tipo PessoaFisica irá imprimir na console o texto Validando CPF e por fim para o objeto do tipo PessoaJuridica irá imprimir na console o texto Validando CNPJ Em outras palavras o método validar será chamado de acordo com a classe que foi utilizada para instanciar o objeto Dica Referente à sobrescrita de métodos é possível chamar a implementação do método da superclasse durante a implementação do método na superclasse Para isso utilizamos a palavra reservada super seguida do nome do método Para exemplificar considere que o método apresentado a seguir diz respeito à classe PessoaFisica Herança e Sobrescrita de Métodos 243 Override public boolean validar supervalidar SystemoutprintlnValidando CPF return true Neste cenário ao chamar esse método a partir de uma instância de PessoaFisica será primeiro executado o método da superclasse imprimindo na console o texto Validando na superclasse para posteriormente continuar a execução da classe na subclasse imprimindo o texto Validando CPF Com isso todos os conceitos referentes à herança na Programação Orientada a Objetos foram abordados neste ebook desde a estrutura de diagrama de classes até a implementação em código utilizando a palavra reservada extends Além disso também foi demonstrada a implementação de construtores em superclasses e subclasses e vimos como se implementa o conceito de sobrescrita de métodos REFERÊNCIAS Herança e Sobrescrita de Métodos 244 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENA 247 Videoflix Na sequência de vídeos apresentada a seguir será desenvolvido um projeto utilizando todos os elementos que você já estudou demonstrando os conceitos de associação composição e agregação e a utilização de herança junto à sobrescrita de métodos O projeto que será desenvolvido consiste em um sistema bancário no qual será possível ter diferentes tipos de contas além de ser necessário armazenar todas as transações realizadas a partir dessa conta Explore esse recurso ao máximo httpsplayervimeocom video823803730h547e570619 Apresentando a estrutura do projeto httpsplayervimeocom video823803797h65e381397f Criando as classes Pessoa e Transação httpsplayervimeocom video823803825h1835ae1b98 Criando as classes que herdam de Pessoa 248 httpsplayervimeocom video823803767hd2baaf0c60 Iniciando a criação da classe conta httpsplayervimeocom video823803860h1551deb26b Finalizando a implementação da classe Conta httpsplayervimeocom video823803889hd42ccc05fa Finalizando a implementação do projeto 249 Vamos rever a partir de agora os conceitos de Orientação a Objetos mais importantes para seu aprendizado trazendo mais explicações e exemplos para que você possa compreender ainda mais o assunto Será abordado o conceito de herança realizando uma analogia com o conceito de herança que conhecemos do nosso dia a dia assim como serão abordados novos exemplos sobre composição e agregação para auxiliar em uma melhor compreensão sobre esses conceitos Infocast 251 Explicando herança Olá estudante Vamos falar um pouco mais sobre Herança Foi apresentado para você o funcionamento deste conceito porém agora vamos fazer uma analogia com o conceito de herança que estamos acostumados no nosso dia a dia Quando falamos em herança existem dois tipos de pensamento que podem vir primeiro na cabeça das pessoas aquela herança que consiste em dinheiro quando herdamos os bens de nossos ascendentes ou então a herança genética onde herdamos DNA cor dos olhos entre diversas outras características possíveis Para uma comparação com o conceito de Herança da Orientação a Objetos o mais correto é compararmos com o conceito da herança genética pois podemos pensar que na orientação a objetos ao criar uma herança estamos dizendo que uma subclasse está herdando características e ações da superclasse da mesma forma que acontece na herança genética onde um filho irá herdar características de seus ascendentes Com isso vamos aproveitar para relembrar os principais conceitos de Herança Toda herança demanda uma Superclasse e uma Subclasse sendo que a superclasse é considerada a classe Pai e a subclasse é considerada a classe Filha com isso podemos ler que a subclasse que é a classe Filha irá herdar as características da classe Pai Uma subclasse consegue acessar os atributos e métodos definidos na superclasse apenas se estes forem definidos com o modificador de acesso Protected ou Public Para os casos do modificador de acesso Private a subclasse permanece tendo a característica porém não irá conseguir acessar essa informação por ela ser visível apenas a partir da superclasse 252 Um outro ponto relevante é na definição de construtores Se definirmos um construtor específico para a superclasse todas as subclasses devem obrigatoriamente chamar este construtor Portanto se definirmos um construtor com dois parâmetros na superclasse a subclasse deve chamar este construtor por intermédio do super a partir do seu construtor Para o super poderão ser enviados valores recebidos por parâmetro no construtor da subclasse ou valores literais Siga com seus estudos e até o próximo podcast 253 Diferença entre agregação e composição Olá estudante Nós vimos que a agregação e a composição são tipos de associação existentes ao diagramar uma classe O objetivo aqui é reforçarmos estes conceitos trazendo a explicação de em quais situações devem ser utilizadas Uma associação entre classes se caracteriza quando temos um conceito de tem um ou seja podemos dizer que uma Pessoa tem um Endereço ou que uma Matéria tem um Professor ou ainda que uma Matrícula tem um Aluno Estes são exemplos nos quais existirá um relacionamento entre classes Mas agora nestes exemplos quando devo utilizar Agregação e Composição É simples a agregação se caracteriza pelo fato de ambas as classes do relacionamento poderem existir de forma independente ou seja caso eu remova o objeto pertencente a um dos lados do relacionamento o outro lado pode continuar existindo sozinho Já a composição é um processo mais rigoroso pois nesse cenário sempre um dos lados do relacionamento será o responsável por gerenciar o ciclo de vida do objeto referente ao outro lado do relacionamento de forma que caso o objeto que gerencia o outro seja removido a instância do outro objeto vinculado a esse objeto em questão também deverá ser destruída Pensando nos exemplos citados anteriormente Uma Pessoa tem um Endereço neste caso faz sentido termos um objeto de Pessoa sem um Endereço ou um objeto de Endereço sem uma Pessoa Aqui a interpretação pode ser diferente dependendo do contexto mas para o nosso cenário vamos dizer que sim pois eu posso ter um conjunto de endereços pré cadastrados que não estejam vinculados a nenhuma Pessoa Assim como eu posso ter objetos do tipo Pessoa que não tenham as informações de Endereço armazenadas 254 Agora o contexto em que uma Matéria tem um Professor aqui é outro cenário em que precisamos pensar no contexto Mas para este caso vamos dizer que é uma agregação também pois eu posso ter Matérias criadas sem um Professor vinculado pensando que lancei a matéria mas ainda não contratei o Professor E o inverso também é válido pois posso ter Professores que neste momento não estão ministrando nenhuma Matéria podendo estar de licença ou trabalhando em outros segmentos do sistema educacional portanto a agregação seria a melhor opção aqui Por fim temos o contexto de que uma Matrícula tem um Aluno que neste caso podemos ver como uma composição pois se analisarmos bem não faz sentido a existência de uma Matrícula sem que um aluno esteja vinculado a ela Um aluno até pode existir sem uma matrícula mas o inverso não seria válido Com isso fizemos uma nova análise sobre os conceitos de Composição e Agregação os quais são definidos para os relacionamentos entre classes Interessante não é mesmo Siga com seus estudos e até mais 255 Gostou do assunto Você pode aprender ainda mais sobre Relacionamento entre Classes e Herança buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Programação Java e Programação Orientada a Objetos Associação Deitel e Deitel 2016 é um dos autores mais conhecidos quando falamos em Programação Java e Programação Orientada a Objetos O seu livro traz excelentes explicações sobre o conceito de Herança Para auxiliar no seu aprendizado seguem os assuntos e suas respectivas páginas para estudo Capítulo 4 Programação Orientada a Objetos Herança páginas 283 a 310 Capítulo 7 Arrays e ArrayLists páginas 191 a 246 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 Referente ao conceito de associação um excelente autor que aborda esses assuntos é Araújo 2008 que traz um capítulo que aborda exclusivamente esse conceito além de um capítulo que pode trazer mais conhecimento so bre o conceito de listas em Java Para auxiliar no seu aprendizado seguem os assuntos e suas respectivas páginas para estudo Capítulo 10 Associando Coleções páginas 91 a 110 Capítulo 11 Associações páginas 111 a 123 ARAÚJO E C de Orientação a objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 257 Agora chegou o momento de conferir um resumo dos principais conhecimentos apresentados ao longo de seus estudos até aqui Este resumo foi elaborado em formato de checklist para que você possa assinalar os itens que considera já ter desenvolvido e caso sinta a necessidade retome os estudos Aproveite mais esta oportunidade de construção de saberes Resumindo Apliquei princípios de programação orientada a objetos Reconheci processo de desenvolvimento orientado a objeto Interpretei artefatos UML para implementação de códigos Aprendi e apliquei o conceito de herança Aprendi e apliquei o conceito de sobrescrita de métodos Modelei linguagem de programação orientada a objetos para resolução de problemas de pequena complexidade 259 Agora você seguirá aprendendo conceitos de Abstração e Interface que não é interface gráfica e verá também como realizar o tratamento de erros dentro do código Vamos nessa ESTUDO E PRÁTICA II POLIMORFISMO E TRATAMENTO DE EXCEÇÃO Inicialmente você irá continuar os seus estudos sobre conceitos de herança aplicando o conceito de abstração a sua superclasse Na sequência iremos trabalhar o conceito de Interface Java que de forma simples são contratos que podemos definir para indicar o que as classes que assinam este contrato devem implementar A para juntar todos estes conceitos iremos aprender sobre Polimorfismo o que nos permitirá realizar maiores abstrações no envio de objetos Para finalizar nós iremos compreender os conceitos de Tratamento de Exceções os quais nos permitem criar exceções customizadas ou até mesmo utilizar exceções já definidas pela biblioteca do Java para quando necessário dispararmos um erro que indique o que aconteceu e onde aconteceu o problema Neste ebook você aprenderá a adicionar um pouco mais de abstração ao seu código pois iremos trabalhar com conceitos como abstract e interface os quais irão no permitir realizar implementações seguindo muito um conceito de templates para que nossas subclasses se preocupem com as implementações de fato Outro ponto que será abordado é o de Polimorfismo em que você aprenderá a manipular objetos que tenham algum tipo de herança de forma mais genérica Por fim você verá como realizar o tratamento de exceções no seu código muito útil para os cenários de validação Ebook Abstração Interface e Polimorfismo Abstração Interface e Polimorfismo 262 ABSTRAÇÃO INTERFACE E POLIMORFISMO CONCEITOS INICIAIS Agora você verá como trabalhar com superclasses abstratas e também como implementar uma Interface Ao término do aprendizado destes conceitos você irá aprender sobre Polimorfismo conceito este que faz sentido ao ser utilizado junto a conceitos como Herança Classes Abstratas e Interface Você já conheceu o conceito de herança e aprendeu a modelar e implementar uma aplicação que faça uso deste conceito Foi possível observar que ao utilizar herança estamos atuando diretamente no reaproveitamento de código pois definimos uma classe base a qual chamamos de superclasse e permitimos que outras classes mais específicas possam herdar essas informações da superclasse implementando apenas as suas especificidades Com o objetivo de continuar os nossos estudos vamos aprender a trabalhar com classes abstratas dentro da nossa hierarquia de herança Até o momento sempre que projetamos uma classe foi pensando em criar instâncias a partir desta classe porém com as classes abstratas podemos começar a projetar superclasses com o objetivo de serem templates para a criação de classes mais específicas o que também podemos chamar de classes concretas Porém é importante ressaltar que ao definir uma classe abstrata precisamos ter a certeza de que jamais será necessário criar uma nova instância a partir desta classe e que todas as instâncias serão criadas a partir das subclasses DEITEL DEITEL 2016 263 Abstração Interface e Polimorfismo Ao definir uma superclasse como abstrata não será possível criar instâncias de objetos a partir desta classe apenas a partir das classes concretas ou seja das classes que herdam da superclasse abstrata Isto ocorre porque estamos definindo a superclasse abstrata apenas como um template que servirá como base para as subclasses definindo todos os atributos e métodos que terão em comum DEITEL DEITEL 2016 Mais um ponto específico das classes abstratas é que podemos definir métodos abstratos para esta classe Um método abstrato consiste na definição da assinatura de um método na superclasse Porém esse método não poderá ser implementado na superclasse Dessa forma todas as subclasses que herdam desta superclasse abstrata além de herdar todos os atributos e os métodos implementados deverão obrigatoriamente realizar uma implementação para os métodos abstratos ou seja ao criar um método abstrato na superclasse estamos garantindo que todas as subclasses que herdam dela realizem uma implementação deste método SANTOS 2003 Todas as classes que possuem métodos abstratos devem ser obrigatoriamente classes abstratas Por outro lado uma classe definida como abstrata não precisa ter métodos abstratos definidos Atenção 264 Abstração Interface e Polimorfismo Dica Lembrese de que não são todas as superclasses que devem ser abstratas É preciso fazer uma análise do código para identificar as superclasses que fazem sentido ser abstratas Uma superclasse abstrata é uma superclasse que não pode ser instanciada portanto analise e tenha a certeza de que não será necessário instanciar essa classe antes de qualquer coisa Vamos agora analisar um exemplo para compreender como funciona a implementação de uma classe abstrata Neste exemplo teremos uma hierarquia de herança que pode ser visualizada na figura a seguir na qual teremos uma superclasse abstrata denominada Figura e duas subclasses concretas denominadas Círculo e Quadrado Figura abstract corBorda String corPreenchimento String area double Quadrado lado double area double Circulo raio double area double Figura 16 Diagrama de classes referente à estrutura de figuras Fonte Do autor 2023 265 Abstração Interface e Polimorfismo Neste diagrama temos algumas características novas a serem observadas Iniciando pelo nome da classe Figura a qual está em itálico o que indica que esta é uma classe abstrata Além disso caso julgue necessário também é possível adicionar o termo abstract ao lado do nome da classe com o mesmo objetivo O mesmo vale para o método area definido na superclasse abstrata este foi definido como itálico indicando que será um método abstrato portanto todas as subclasses que herdam de figura deverão implementar o seu cálculo de área O código a seguir apresenta a implementação da classe abstrata denominada Figura Lembrese de que por essa classe ser abstrata não será possível criar instâncias a partir dela pois ela serve apenas como um template para a criação de classes do tipo Figura public abstract class Figura private String corBorda private String corPreenchimento public String getCorBorda return corBorda public void setCorBordaString corBorda thiscorBorda corBorda public String getCorPreenchimento return corPreenchimento Abstração Interface e Polimorfismo 266 public void setCorPreenchimentoString corPreenchimento thiscorPreenchimento corPreenchimento public abstract double area Nesta implementação uma nova palavra reservada do Java surge no caso a palavra abstract Para definir que esta classe será abstrata foi utilizada a palavra reservada na assinatura da classe ficando public abstract class Figura e a partir do momento que modificamos a assinatura da classe para este contexto esta classe passa a ser abstrata e não será mais permitido criar instâncias a partir dela Além da classe abstrata também foi definido um método abstrato e aqui temos uma diferença bem grande em consideração ao formato que vínhamos implementando os nossos métodos Para definir o método como abstrato também foi utilizada a palavra reservada abstract na assinatura do método Além disso o método não possui implementação a sua definição é finalizada com um simples ponto e vírgula Isto ocorre porque nenhum método abstrato é implementado na superclasse apenas nas subclasses e este é um dos motivos pelo qual não é possível instanciar uma classe abstrata pois se criarmos uma instância do tipo Figura qual implementação seria utilizada para executar uma chamada ao método área Agora que a superclasse abstrata está implementada chegou o momento de visualizar a implementação das subclasses Vamos iniciar pela subclasse Quadrado a qual tem a sua implementação demonstrada no código Abstração Interface e Polimorfismo 267 public class Quadrado extends Figura private double lado Override public double area return thislado thislado public double getLado return lado public void setLadodouble lado thislado lado Nesta implementação estamos fazendo com que a classe Quadrado herde da classe Figura utilizando o extends e por conta desta herança a classe Quadrado irá exigir que o método referente à área seja sobrescrito Lembrando que isso ocorre porque na superclasse definimos que o método denominado área é abstrato portanto qualquer classe que herdar de Figura deverá implementar este método Neste caso a implementação do cálculo da área para a classe retângulo foi feita considerando o cálculo lado lado No mais apenas definimos o atributo específico desta classe e os seus métodos de acesso Em seguida no código será possível visualizarmos a implementação da classe Círculo a qual será muito semelhante a classe Quadrado tendo como diferença apenas o atributo específico e o cálculo realizado dentro do método área Abstração Interface e Polimorfismo 268 public class Circulo extends Figura private double raio Override public double area return MathPI thisraio thisraio public double getRaio return raio public void setRaiodouble raio thisraio raio Para a classe Círculo definimos o atributo raio com seus métodos de acesso e também tivemos que sobrescrever o método abstrato definido na superclasse Figura que é o método de cálculo da área Para o círculo este cálculo consiste na fórmula PI raio raio A utilização do PI é um ponto novo aqui neste código também pois em vez de criar uma variável com o valor de PI estamos utilizando uma constante já definida na classe Math pertencente à biblioteca do Java Com isso finalizamos a implementação do exemplo da hierarquia de herança das classes de figuras geométricas Importante lembrar que neste contexto será possível criar instâncias apenas para as classes concretas que no caso são as classes Quadrado e Círculo Outro ponto aqui é o conceito de reutilização de código pois com essa estrutura definida temos agora um template para representar boa parte das figuras geométricas e caso seja necessário adicionar uma nova figura ao código como por exemplo um triângulo ou um polígono Abstração Interface e Polimorfismo 269 podemos criar a classe e herdar o código presente na classe Figura e ao fazer isso já seremos obrigados a implementar o cálculo da área destas figuras Interfaces Após compreendermos o funcionamento das classes abstratas a próxima etapa consiste em compreender um outro tipo de abstração denominado Interface Importante reforçar que esta interface em questão não é uma interface gráfica mas sim um conceito de orientação a objetos Uma interface consiste em padronizar a forma como as coisas interagem entre si DEITEL DEITEL 2016 Vamos utilizar como exemplo um controle remoto de uma televisão este controle remoto é como se fosse uma interface entre a pessoa e a televisão pois é o controle quem define o que a pessoa pode realizar na televisão Ele define que pode ser aumentado e diminuído o volume alterado o canal acessar o menu de configurações porém a forma como serão implementadas essas ações são definidas pela televisão Uma interface permite apenas a definição de métodos sem implementação e não permite a criação de atributos para classe apenas constantes Por conta disso uma interface é vista como um contrato para o qual todas as classes que implementam esta interface estão se comprometendo a implementar os métodos nela definidos DEITEL DEITEL 2016 Abstração Interface e Polimorfismo 270 Mesmo com esta explicação deve ficar a dúvida sobre qual a diferença entre Classe Abstrata e Interface A principal diferença está no fato de que a classe abstrata permite a definição de atributos para serem herdados assim como a definição de métodos implementados não abstratos e não implementados abstratos já a interface não permite a definição de atributos e permite apenas a criação de métodos não implementados abstratos Com esta explicação acredito que fique claro o fato de que a classe abstrata é utilizada quando temos implementações ou definições de atributos na superclasse e a interface é utilizada quando temos apenas a definição de métodos a serem implementados pelas classes que utilizam dessa interface como a definição de um contrato SANTOS 2003 Para uma primeira demonstração da aplicação de interfaces irei apresentar a estrutura das Collections do Java A figura a seguir apresenta toda a hierarquia de classes referente às Collections Collection Interface Queue Interface Set Interface HashSet SortedSet Interface LinkedHashSet NavigableSet Interface TreeSet Map Interface HashMap SortedMap Interface LinkedHashMap NavigableMap Interface TreeMap List Interface PriorityQueue LinkedList ArrayList Figura 17 Hierarquia de classes das Collections do Java Fonte Do autor 2023 Esta hierarquia de interfaces e classes demonstram alguns pontos interessantes referente a Interfaces Temos no topo a interface principal denominada Collection aqui não conseguimos visualizar os métodos definidos nesta interface porém são definidos os métodos que são comuns entre todas as estruturas de lista como por exemplo o método addAll Abstração Interface e Polimorfismo 271 Na sequência temos diversas interfaces que herdam da interface Collection ou seja ao utilizar interfaces é permitido realizar a herança entre interfaces porém uma interface apenas pode herdar de outra interface não é possível uma interface herdar de uma classe Nestas interfaces abaixo de Collections temos as coleções divididas em estruturas mais especializadas como por exemplo o List que irá ser o contrato para todas as classes que implementam algum tipo de lista e a estrutura Queue que será o contrato para todas as classes que implementam alguma estrutura de fila Por fim nos níveis mais baixos da hierarquia nós temos as classes que implementam as interfaces Vou utilizar como exemplo a classe ArrayList a qual já utilizamos em outros exemplos Esta classe implementa a interface List portanto ela obrigatoriamente deverá implementar todos os métodos definidos nesta interface Porém além da interface List a classe ArrayList também deverá implementar os métodos da interface Collection pois a interface List está herdando os métodos desta interface Com este exemplo de hierarquia de classes e interfaces das Collections do Java acredito que seja possível ter uma ideia do funcionamento das interfaces e da sua diferença para as classes abstratas pois neste cenário fica claro que as interfaces Collection e List não possuem nenhum tipo de implementação apenas definições de métodos fazendo com que todas as classes que queiram ser consideradas uma lista com base nesse contrato devam realizar a implementação de todos os métodos ali definidos 272 Abstração Interface e Polimorfismo Agora vamos fazer um exemplo simples de implementação de interfaces para podermos visualizar como são codificados utilizando a linguagem de programação Java Para isso vamos modificar o exemplo visto anteriormente referente a Figura Quadrado e Círculo para em vez de utilizarmos classes abstratas utilizar interface A estrutura de hierarquia de classes e interfaces é demonstrado na figura seguinte Figura interface area double Quadrado lado double area double Circulo raio double area double Figura 18 Diagrama de classes com hierarquia de classes e interfaces Fonte Do autor 2023 A diferença deste diagrama em relação ao diagrama com as classes abstratas consiste em em vez de termos uma superclasse abstract temos na verdade uma interface denominada Figura Além disso para representar a implementação da interface a linha que liga as classes Quadrado e Círculo a interface Figura é uma linha tracejada indicando que será uma implementação O código a seguir apresenta a implementação da interface Figura na qual estamos definindo a assinatura de apenas um método o qual é denominado area A criação de uma interface tem uma diferença na assinatura principal que em vez de utilizar public class utilizamos public interface Lembrando que neste cenário da interface todos os métodos são considerados abstratos de forma implícita portanto não é preciso adicionar o termo abstract na assinatura do método 273 Abstração Interface e Polimorfismo public interface Figura public double area O próximo código apresenta a implementação da classe Quadrado a qual irá implementar a interface Figura Neste caso diferente da herança a palavra reservada que utilizamos para implementar uma interface é implements seguido do nome da interface Com isso a classe irá apresentar erro de compilação pois passará a exigir que todos os métodos da interface sejam implementados Portanto será preciso realizar a implementação do método área que foi definido na interface public class Quadrado implements Figura private double lado Override public double area return thislado thislado 274 public double getLado return lado public void setLadodouble lado thislado lado Quando trabalhamos com interfaces outro ponto que é diferente da herança é que podemos realizar a implementação de mais de uma interface Para isso após a palavra reservada implements você pode adicionar o nome de todas as interfaces que deseja implementar separados por vírgula Para finalizar a implementação do exemplo de interfaces o código a seguir apresenta a criação da classe Círculo a qual também irá realizar a implementação da interface Figura sendo obrigatória a implementação do método área public class Circulo implements Figura private double raio Override public double area return MathPI thisraio thisraio Abstração Interface e Polimorfismo Abstração Interface e Polimorfismo 275 public double getRaio return raio public void setRaiodouble raio thisraio raio Quando uma classe implementa uma interface esta é obrigada a implementar todos os métodos desta interface Porém caso a classe que esteja implementando a interface seja uma classe abstrata não existe a necessidade de realizar a implementação dos métodos ficando esta responsabilidade para a classe concreta que herdar dessa classe abstrata Atenção Com isso finalizamos o aprendizado sobre interfaces lembrando que uma interface não pode ter atributos e nem métodos implementados e para que uma classe faça uso de uma interface devese utilizar a palavra reservada implements o que irá obrigar que a classe implemente todos os métodos definidos na interface Abstração Interface e Polimorfismo 276 Polimorfismo Agora que você já conhece o conceito de Herança Classes Abstratas e Interface chegou o momento de abordarmos o conceito de Polimorfismo o qual é um dos principais pontos das linguagens de programação Orientadas a Objetos e que nos possibilita trabalhar com uma maior abstração além de auxiliar no conceito de reutilização de código O termo polimorfismo é composto pela junção de dois conceitos poly muitos e morphic formas ou seja de forma literal o significado da palavra polimorfismo é muitas formas MANZANO COSTA JÚNIOR 2014 De acordo com Deitel e Deitel 2016 o polimorfismo permite programar no geral em vez de programar no específico o que significa que o polimorfismo permite escrever códigos que processam objetos que compartilham a mesma superclasse direta ou indiretamente Dessa forma é possível processar estes objetos como se todos fossem objetos da superclasse mesmo que seja instanciado de forma mais específica Explicando de uma forma diferente o polimorfismo consiste em termos uma superclasse ou interface que implemente toda a estrutura da sua hierarquia de objetos definindo o que os seus objetos devem fazer porém devem possibilitar que cada subclasse realize a sua implementação para essa estrutura definindo então como devem fazer Dessa forma é possível instanciar um objeto com base em uma subclasse mas armazenar esta instância em uma variável do tipo da superclasse ARAÚJO 2008 Para exemplificar o polimorfismo utilizando código vamos realizar uma adaptação em um exemplo que já utilizamos previamente quando falamos de herança A figura seguinte apresenta o diagrama de classes que será desenvolvido no qual temos a estrutura de Pessoa Pessoa Física e Pessoa Jurídica porém Abstração Interface e Polimorfismo 277 neste cenário a classe Pessoa será abstrata Além disso também iremos adicionar uma nova classe denominada ListaEspera para a qual existe uma associação de agregação com Pessoa sendo possível adicionar pessoas na lista de espera sendo esta pessoa física ou jurídica Pessoa abstract nome String idade int endereco String telefone String fazerAniversario void validar boolean PessoaJuridica cnpj String inscricaoEstadual String validar boolean ListaEspera motivo String adicionarPessoapessoa Pessoa void PessoaFisica rg String cpf String validar boolean 0 0 Figura 19 Diagrama de classes para demonstrar Polimorfismo Fonte Do autor 2023 Para iniciar a análise da implementação do código confira a seguir o código referente à classe abstrata Pessoa na qual utilizamos a palavra reservada abstract na assinatura da classe e criamos um método implementado denominado fazerAniversario e um método abstrato denominado validar Os motivos por optarmos por classe abstrata em vez de interface é que a classe pessoa possui seus atributos que serão herdados e também um método implementado Caso tivéssemos utilizado interface teríamos que definir os atributos de forma repetida nas subclasses e o método fazerAniversario teria que ser implementado em todas as subclasses mesmo que o código seja exatamente o mesmo Abstração Interface e Polimorfismo 278 Abstração Interface e Polimorfismo 278 public abstract class Pessoa private String nome private int idade private String endereco private String telefone public PessoaString nome thisnome nome public void fazerAniversario thisidade thisidade 1 public abstract boolean validar public String getNome return nome public void setNomeString nome thisnome nome public String getEndereco return endereco public void setEnderecoString endereco thisendereco endereco Abstração Interface e Polimorfismo 279 Abstração Interface e Polimorfismo 279 public String getTelefone return telefone public void setTelefoneString telefone thistelefone telefone public int getIdade return idade Na sequência vamos verificar a implementação das subclasses Pessoa Física e Pessoa Jurídica os quais são apresentados nos códigos a seguir respectivamente Ambas possuem uma implementação semelhante com a diferença nos atributos específicos de cada classe e também na implementação do método validar que ambas foram obrigadas a implementar por ser um método abstrato definido na superclasse public class PessoaFisica extends Pessoa private String cpf private String rg public PessoaFisicaString nome String cpf String rg supernome thiscpf cpf thisrg rg Abstração Interface e Polimorfismo 280 Override public boolean validar SystemoutprintlnValidando CPF return true public String getCpf return cpf public String getRg return rg public class PessoaJuridica extends Pessoa private String cnpj private String inscricaoEstadual public PessoaJuridicaString nome String cnpj supernome thiscnpj cnpj Override public boolean validar SystemoutprintlnValidando CNPJ return true 281 Abstração Interface e Polimorfismo public String getInscricaoEstadual return inscricaoEstadual public void setInscricaoEstadualString inscricaoEstadual thisinscricaoEstadual inscricaoEstadual public String getCnpj return cnpj Por fim o código a seguir apresenta a implementação da classe ListaEspera a qual precisa possuir o atributo denominado motivo para representar o motivo pelo qual essa lista de espera foi criada e um segundo atributo que é uma lista de objetos do tipo Pessoa para representar a associação de agregação definida no diagrama de classes public class ListaEspera private String motivo private ListPessoa pessoas public ListaEsperaString motivo thismotivo motivo thispessoas new ArrayListPessoa Abstração Interface e Polimorfismo 282 public void adicionarPessoaPessoa pessoa if pessoavalidar thispessoasaddpessoa public String getMotivo return motivo public void setMotivoString motivo thismotivo motivo Nesta classe é possível visualizar o conceito de Polimorfismo sendo aplicado em dois cenários diferentes O primeiro consiste na criação da lista de pessoas para o qual definimos um atributo do tipo List o qual vimos previamente que é uma interface implementada por todas as classes que desejam seguir o padrão de uma lista da Collections do Java E para instanciar este objeto foi utilizada a classe ArrayList a qual implementa esta interface List O polimorfismo aqui está no fato de estarmos armazenando um objeto do tipo ArrayList em uma instância do tipo List ou seja uma instância da superclasse Mesmo realizando esta ação a partir do atributo pessoas será possível chamar todos os métodos implementados na classe ArrayList que foram definidos pela interface List Portanto ao chamar o método add a partir do atributo pessoas o Java buscará a implementação do método realizada pela subclasse utilizada para instanciar o objeto no caso o ArrayList O segundo ponto no qual foi utilizado o polimorfismo é no tipo de dado que armazenamos as pessoas na fila pois utilizamos a superclasse Pessoa para inicializar a lista e também para enviar por parâmetro para o método adicionarPessoa na classe ListaEspera Abstração Interface e Polimorfismo 283 Neste caso independente de instanciar um objeto como PessoaFisica ou PessoaJuridica como ambos herdam da classe Pessoa podemos enviar instâncias destes objetos por parâmetro para o método adicionarPessoa pois esse método está esperando um objeto do tipo Pessoa e novamente tanto PessoaFisica quanto PessoaJuridica são também um objeto do tipo Pessoa Outro ponto para ser observado é que na implementação do método que adiciona uma pessoa realizamos um IF para verificar se a pessoa é válida lembrando que este método validar que estamos chamando é um método abstrato definido na pessoa e implementado por cada uma das suas subclasses Mesmo tendo o parâmetro definido como Pessoa ao chamar o método validar o compilador irá buscar a implementação do método referente à classe que foi utilizada para instanciar o objeto enviado por parâmetro que neste caso será uma instância de PessoaFisica ou PessoaJuridica Este é um dos principais usos do conceito de Polimorfismo pois ele torna o nosso código mais abstrato Pense na situação de que foram adicionadas duas novas classes representando novos tipos de Pessoa que também herdam da classe Pessoa após a criação destas classes o código não precisaria de nenhuma manutenção pois a classe ListaEspera continuará funcionando normalmente por estar utilizando a superclasse na passagem de parâmetro e na definição da Lista em vez dos tipos específicos Para demonstrar o funcionamento do código no todo confira a seguir a implementação da classe Principal contendo o método main Neste código é possível observar que criamos uma instância de PessoaFisica e uma instância de PessoaJuridica e enviamos estas instâncias por parâmetro para o método adicionarPessoa no formato de sua superclasse no caso Pessoa 284 Abstração Interface e Polimorfismo public class Principal public static void mainString args ListaEspera listaEspera new ListaEsperanotebook PessoaFisica pessoaFisica new PessoaFisicaPessoa Física 1 12345678901 123456 PessoaJuridica pessoaJuridica new PessoaJuridicaPessoa Jurídica 1 123456780001 58 listaEsperaadicionarPessoapessoaFisica listaEsperaadicionarPessoapessoaJuridica Ao executar este código você poderá observar que na console serão apresentados os textos Validando CPF e na sequência Validando CNPJ pois na classe ListaEspera no método adicionarPessoa ao chamar o método validar será executado o método utilizado para instanciar o objeto O Polimorfismo nos permite trabalhar com objetos instanciados como uma subclasse armazenandoos em uma superclasse Porém um ponto de atenção é que ao armazenar um objeto em uma instância de tipo referente à superclasse será possível acessar apenas os atributos e métodos que a superclasse define não sendo possível acessar os atributos e métodos específicos criados para a subclasse Atenção Abstração Interface e Polimorfismo 285 Neste estudo você finalizou os conceitos mais relacionados à abstração do nosso código passando por Classes Abstratas Interfaces e Polimorfismo Foi demonstrado com realizar a criação de classes e interfaces de acordo com estes conceitos e também como trabalhar com Polimorfismo em nosso código demonstrando as facilidades que este conceito traz para a manutenção de código REFERÊNCIAS Abstração Interface e Polimorfismo 286 ARAÚJO E Cde Orientação a objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 MANZANO J A N G COSTA JUNIOR R A da Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SANTOS R Introdução à programação orientada a objetos usando Java Rio de Janeiro Campus 2003 SENAI 289 Em vários momentos durante as implementações de códigos de exemplo realizados até aqui nós nos deparamos com a necessidade de realizar algum tipo de validação no nosso código para sabermos se uma determinada operação podia ser realizada ou não Neste ebook você aprenderá sobre tratamento de exceções um conceito que existe justamente para tratar erros que podem acontecer durante a execução da nossa aplicação Ebook Tratamentos de Exceções Tratamentos de Exceções 292 Tratamentos de Exceções TRATAMENTOS DE EXCEÇÕES CONCEITO INICIAIS De acordo com Deitel e Deitel 2016 uma exceção consiste na indicação de um erro que ocorre durante a execução de um programa A linguagem de programação Java traz algumas implementações de exceções as quais são comuns nos depararmos durante a execução dos nossos códigos Alguns exemplos de exceções já existentes são ArrayIndexOutOfBoundsException Exceção disparada quando tentamos acessar uma posição inexistente em um array Por exemplo se temos um array de 10 posições e tentamos acessar a posição 15 a execução da aplicação será interrompida e essa exceção será apresentada NullPointerException Exceção disparada quando tentamos acessar uma informação a partir de um objeto não instanciado NumberFormatException Exceção disparada quando tentamos converter um valor por exemplo de String para Int e a String em questão não é um valor numérico válido Esses foram alguns exemplos de exceções que podem ser disparadas em tempo de execução e neste ebook você irá aprender como realizar o tratamento destas exceções O tratamento de exceções consiste em capturar uma exceção e realizar algum tratamento sobre ela para evitar que a aplicação finalize por esse erro Por exemplo se você solicitou um número para o usuário utilizando o JOptionPane e na hora da conversão de String para Int acontecer um NumberFormatException é possível adicionar um tratamento para neste caso informar que o número não é válido e seguir com a execução do código normalmente podendo inclusive solicitar um novo valor DEITEL DEITEL 2016 293 Tratamentos de Exceções No código a seguir é apresentada a implementação da situação definida acima em que um usuário digita um número e na sequência fazemos a conversão desse número Porém neste primeiro cenário não estamos realizando nenhum tipo de tratamento de exceção public class ExemploExcecao1 public static void mainString args String valor JOptionPaneshowInputDialog Digite um número int numero IntegerparseIntvalor JOptionPaneshowMessageDialognull O número digitado foi numero Para este código se você digitar no JOptionPane um valor inteiro o código continuará a sua execução normalmente realizando a conversão de String para Int e apresentando o número informado Porém se for informado um valor não numérico no JOptionPane por exemplo o valor abc será disparada uma exceção na linha referente à conversão de String para Int finalizando a execução do código naquele ponto Em seguida confira a exceção que é apresentada na console no caso de erro na conversão Figura 20 Exceção NumberFormatException apresentada na console Fonte Do autor 2023 Tratamentos de Exceções 294 Para resolver esse problema que pode acontecer em tempo de execução e gerar o que chamamos de tratamento de exceção podemos utilizar o bloco de código trycatch Traduzindo esse comando de forma simplificada temos um bloco denominado try onde a aplicação tentará realizar a operação que pode dar erro neste caso a conversão de String para Int Caso a conversão aconteça sem erros o código continuará a sua execução ignorando o bloco catch Porém caso ocorra algum erro nesta conversão será interrompida a execução do bloco try e será iniciada a execução do bloco catch Portanto este é o bloco que podemos chamar de tratamento do erro pois ele será executado apenas em caso de problemas na execução do código do try Com isso o código do catch é executado e a aplicação continua a sua execução normalmente sem que seja interrompida a execução da aplicação A seguir confira o mesmo código de conversão do valor numérico porém com o tratamento de erro public class ExemploExcecao1 public static void mainString args String valor JOptionPaneshowInputDialogDigite um número try int numero IntegerparseIntvalor JOptionPaneshowMessageDialognull O número digitado foi numero catch NumberFormatException exception JOptionPaneshowMessageDialognull O valor que você digitou não é um valor numérico Neste caso irá executar o catch apenas se no try disparar um erro de NumberFormatException pois é o erro que estamos esperando de forma explícita para a execução deste bloco de código Dessa forma estamos garantindo que a nossa aplicação não irá finalizar inesperadamente pois estamos tratando o único problema que este código poderia gerar Tratamentos de Exceções 295 É possível realizar mais de um tratamento de exceção para com base em um mesmo bloco try conceito este que é chamado de multicatch DEITEL DEITEL 2016 Para implementar esse conceito existem duas formas sendo possível tratar as exceções em blocos catch separados ou em um único bloco catch Para exemplificar ambos os cenários iremos utilizar um código que solicita dois valores para o usuário e realiza a divisão entre estes valores Para este caso duas exceções podem acontecer o NumberFormatException para o caso de não ser informado um número no JOptionPane ou um AritchmaticException para o caso de tentar realizar uma divisão por zero Em seguida é apresentada a implementação de um código que utiliza um único bloco catch para realizar o tratamento de todas as exceções possíveis Neste caso apresentamos um JOptionPane com um texto mais genérico apenas informando que houve um erro ao realizar a operação Para isso as exceções que podem ser capturadas pelo bloco catch são separadas pelo símbolo pipe public class ExemploExcecao2 public static void mainString args try int num1 IntegerparseInt JOptionPaneshowInputDialogDigite o primeiro número int num2 IntegerparseInt JOptionPaneshowInputDialogDigite o segundo número float resultado num1 num2 JOptionPaneshowMessageDialognull O resultado é resultado catch ArithmeticException NumberFormatException e JOptionPaneshowMessageDialognull Não foi possível realizar a operação Tratamentos de Exceções 296 No código a seguir é apresentado um exemplo no qual o tratamento das exceções é feito de forma separada Neste caso temos dois blocos catch para um mesmo bloco try sendo realizado um tratamento específico para cada exceção public class ExemploExcecao3 public static void mainString args try int num1 IntegerparseInt JOptionPaneshowInputDialogDigite o primeiro número int num2 IntegerparseInt JOptionPaneshowInputDialogDigite o segundo número float resultado num1 num2 JOptionPaneshowMessageDialognull O resultado é resultado catch ArithmeticException arithmecticException JOptionPaneshowMessageDialognull Não é possível realizar a divisão por zero catch NumberFormatException numberFormatException JOptionPaneshowMessageDialognull Os valores informados devem ser numéricos Além do bloco try e do bloco catch temos mais um bloco que pode ser adicionado ao tratamento de exceções o qual é denominado finally Este bloco é executado sempre ao término da execução do trycatch e sempre será executado independentemente de ter entrado no bloco catch ou não O bloco finally é geralmente utilizado para realizar a liberação de recursos como o fechamento de um arquivo que está sendo processado ou o fechamento de uma conexão com o banco de dados Tratamentos de Exceções 297 Com isso utilizando o exemplo do banco de dados independentemente de a operação ser executada com sucesso ou não ao término o recurso será liberado não gerando bloqueios desnecessários Para exemplificar a sintaxe confira o código a seguir que apenas adiciona o bloco finally com o JOptionPane indicando que está sendo executado posteriormente quando trabalharmos a conexão com banco de dados iremos fazer um melhor uso deste recurso public class ExemploExcecao2 public static void mainString args try int num1 IntegerparseInt JOptionPaneshowInputDialogDigite o primeiro número int num2 IntegerparseInt JOptionPaneshowInputDialogDigite o segundo número float resultado num1 num2 JOptionPaneshowMessageDialognull O resultado é resultado catch ArithmeticException NumberFormatException e JOptionPaneshowMessageDialognull Não foi possível realizar a operação finally JOptionPaneshowMessageDialognull Executando o Finally Com isso você aprendeu como realizar o tratamento de exceção utilizando os blocos try catch e finally Compreendendo principalmente os diferentes tipos de tratamentos que podem ser realizados a partir do bloco catch Tratamentos de Exceções 298 Vamos começar a compreender agora como funciona o lançamento de exceções no código seja uma exceção que criamos para uma validação ou uma exceção padrão do Java gerada a partir de um erro de execução Até o momento utilizamos apenas o método main onde a exceção era disparada diretamente ali dentro e com isso já fazíamos diretamente o tratamento da exceção Porém é possível que essa exceção seja gerada por um método que estamos chamando e que não desejamos realizar o tratamento da exceção dentro dele mas sim a partir de quem está chamando esse método Para isso podemos utilizar a palavra reservada throws para indicar que aquele método pode disparar uma exceção DEITEL DEITEL 2016 Para exemplificar iremos utilizar o código referente à Lista de Espera que desenvolvemos ao trabalhar com Polimorfismo no ebook anterior Na classe ListaEspera ao adicionar uma pessoa a lista estamos enviando esta pessoa por parâmetro e a primeira ação que fazemos é chamar o método validar referente ao objeto pessoa Essa ação pode gerar um nullPointerException pois o objeto pessoa enviado por parâmetro pode não ter sido instanciado Neste caso não realizamos nenhum tratamento então uma opção para deixar mais explícita a possibilidade de acontecer esta exceção é adicionarmos a assinatura do método a palavra reservada throws junto ao tipo de exceção que pode ser gerado Em seguida confira a implementação desse método com a utilização do throws public void adicionarPessoaPessoa pessoa throws NullPointerException if pessoavalidar thispessoasaddpessoa Este caso é apenas um exemplo para demonstrar a utilização deste recurso Porém para o caso de exceções não verificadas que são exceções que podem vir a ocorrer em tempo de execução não é necessário adicionar o throws pois não é obrigatório fazer o tratamento da exceção Tratamentos de Exceções 299 Entretanto para os casos de exceções verificadas que são as exceções que o compilador exige um tratamento por exemplo em manipulação de arquivos caso o tratamento não seja feito no método que implementou o código é preciso passar a obrigatoriedade do tratamento para quem chamar este método e para isso utilizamos o throws na assinatura do método DEITEL DEITEL 2016 Além das exceções geradas pelo compilador também é possível lançar uma exceção a partir do nosso código o que é bastante comum em validações A seguir é apresentado um exemplo simples no qual iremos validar se a pessoa enviada por parâmetro para o método adicionarPessoa é nulo ou não Caso seja iremos chamar a exceção NullPointerException de forma explícita public void adicionarPessoaPessoa pessoa if pessoa null throw new NullPointerExceptionÉ obrigatório enviar uma instância válida de pessoa if pessoavalidar thispessoasaddpessoa Para lançar esta exceção utilizamos o comando throw new e o tipo de exceção que queremos gerar a qual pode ser uma das exceções disponibilizadas pela biblioteca do Java ou até uma exceção customizada a qual veremos um pouco mais para frente Observe também que neste caso estamos gerando a mesma exceção que já seria gerada automaticamente pelo compilador caso tente acessar o método validar de um objeto nulo porém a diferença aqui está na mensagem que estamos enviando para a exceção Neste cenário ao imprimir a exceção na console ou nos logs irá imprimir o texto que estamos enviando por parâmetro no construtor da exceção Tratamentos de Exceções 300 Tratamentos de Exceções 300 Caso você queira criar uma exceção personalizada será preciso criar uma classe para representar a exceção a qual deverá obrigatoriamente herdar de uma classe de exceção já existente no Java Fazendo isso você irá garantir que a sua exceção possa ser utilizada pelo sistema de tratamento de exceções do Java DEITEL DEITEL 2016 Segundo Deitel e Deitel 2016 uma nova classe de exceção pode conter quatro construtores os quais possuem as seguintes características Um construtor que não possua parâmetros e envia uma mensagem String padrão para o construtor da superclasse Um construtor que receba por parâmetro a mensagem de erro String e envia para o construtor da superclasse Um construtor que receba dois parâmetros sendo o primeiro uma mensagem de erro String e o segundo um objeto Throwable para encadear a outra exceção Um construtor que receba por parâmetro um objeto Throwable para permitir o encadeamento com outra exceção Para exemplificar a criação de uma classe de exceção personalizada vamos criar uma exceção para o caso de a pessoa enviada por parâmetro ser nula a qual iremos chamar de PessoaInexistenteException e iremos herdar da classe de exceção RuntimeException do Java pois este é um erro que irá acontecer em tempo de execução Para o construtor iremos criar apenas um construtor sem parâmetros o qual irá enviar um texto padrão para o construtor da superclasse A seguir confira o código referente à implementação dessa classe Tratamentos de Exceções 301 Tratamentos de Exceções 301 public class PessoaInexistenteException extends RuntimeException public PessoaInexistenteException superA pessoa que você deseja adicionar a fila de espera não existe Para utilizar esta exceção que criamos vamos modificar o nosso código referente ao método adicionarPessoa na classe ListaEspera para que dispare a exceção PessoaInexistenteException em vez da exceção NullPointerException O código a seguir apresenta a implementação referente a essa modificação public void adicionarPessoaPessoa pessoa if pessoa null throw new PessoaInexistenteException if pessoavalidar thispessoasaddpessoa Dessa forma criamos uma classe que represente um tipo de exceção personalizado e disparamos esta exceção para realizar a validação em um método que criamos Para demonstrar como é gerada a exceção caso seja disparada a figura apresenta a console com o erro gerado ao tentar adicionar a fila uma pessoa não instanciada Tratamentos de Exceções 302 Figura 21 Erro apresentado na console pela exceção personalizada Fonte Do autor 2023 Observe que todas as características desta exceção são representadas pela classe PessoaInexistenteException sendo apresentado o nome da classe e o texto que definimos como padrão no construtor dessa classe Dessa forma você aprendeu sobre tratamento de exceções no Java Esse é um conceito de grande importância pois ao utilizálo é possível evitar que a sua aplicação encerre inesperadamente e para isso é preciso identificar os pontos nos quais podem acontecer erros em tempo de execução para adicionarmos o tratamento adequado Além disso você também aprendeu a criar novas exceções com o objetivo de otimizar o processo de validação no código REFERÊNCIAS Tratamentos de Exceções 303 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 SENAI 305 Videoflix Nesta sequência de vídeos você irá dar continuidade a implementação do sistema de contas bancárias que iniciou no bloco anterior Para isso agora serão aplicados os novos os conceitos de Orientação a Objetos que foram aprendidos durante os estudos deste bloco Iremos buscar melhorar o nosso código aplicando os conceitos de classes abstratas interfaces e polimorfismo Ao final iremos identificar os pontos do nosso código nos quais será válido aplicar tratamentos de exceção tanto para validação quanto para evitar problemas em tempo de execução httpsplayervimeocom video823803924h03834c7239 Diagrama da conta bancária atualizado httpsplayervimeocom video823803960hb0326c59e7 Modificando as estruturas de herança httpsplayervimeocom video823803994h22e4c57b8b Implementando a estrutura de empréstimo 306 httpsplayervimeocom video823804018h13048e2568 Permitindo adquirir um empréstimo httpsplayervimeocom video823804045h2c24670228 Tratando exceções 307 A partir de agora você confere os principais conceitos que foram abordados neste bloco Para isso vamos falar novamente sobre tratamento de exceções e qual a sua importância para uma aplicação O polimorfismo é outro ponto de grande importância e que muitas vezes gera dúvidas portanto vamos falar novamente sobre este conceito e qual a sua relação com os conceitos de Herança Classes Abstratas e Interface Com o objetivo de tentar esclarecer uma das principais dúvidas que surgem referente aos conceitos de Programação Orientada a Objetos vamos falar sobre as diferenças entre uma Classe Abstrata e uma Interface e quais cenários devemos fazer a utilização de cada um destes conceitos Confira Infocast 309 Qual a relação entre Polimorfismo e HerançaClasses AbstratasInterface Olá estudante Você aprendeu diversos conceitos novos como Herança Classes Abstratas e Interfaces e também que todos estes conceitos são a base para a definição do Polimorfismo Portanto vamos reforçar aqui qual a relação entre estes conceitos e o porquê desses três conceitos citados serem a base para o polimorfismo Polimorfismo tem como um significado literal muitas formas que na Orientação a Objetos significa que é possível enviar objetos criados a partir de subclasses no formado de uma instância da superclasse Por isso a relação entre estes conceitos eu não consigo trabalhar com polimorfismo se eu não tiver uma Interface ou uma Superclasse Lembrese de que ao definirmos uma Superclasse ou uma Interface estamos definindo uma estrutura que poderá ser reaproveitada por todas as subclasses no caso de herança ou por todas as classes que implementam as interfaces ou seja toda classe que herdar de uma classe ou que implementar uma interface terá obrigatoriamente a estrutura definida nas classes e interfaces mais genéricas Por isso conseguimos enviar um tipo mais específico como um tipo mais genérico Além disso o compilador é capaz de identificar que mesmo recebendo um objeto como uma instância mais genérica ele foi instanciado com um tipo mais específico garantindo que caso um método tenha sido sobrescrito na subclasse a implementação que será executada é a da subclasse e não a da superclasse Com isso podemos trabalhar com uma enorme abstração permitindo reaproveitar códigos e simplificando o processo de adicionar novos recursos que utilizem como base uma classe mais genérica 310 Para finalizar apenas gostaria de reforçar também um ponto importante que quando enviamos uma instância mais específica em um formato de um objeto mais genérico será possível acessar a partir deste objeto apenas os atributos e métodos que foram definidos no objeto mais genérico sendo necessário converter o objeto para o tipo mais específico novamente para conseguir acessar as informações específicas da subclasse Até mais 311 Por que é importante realizar o tratamento de exceções Olá estudante Nós vimos que a linguagem de programação Java traz por padrão diversos tipos de exceções que podem ser disparadas durante a execução do código e que estas exceções consistem em erros durante a execução do programa que em sua maioria irá simplesmente finalizar a execução da aplicação Por conta disso existe o conceito de tratamento de exceções para o qual é possível ao chamar um código uma sequência de códigos definir uma ação a ser executada caso uma exceção seja disparada garantindo assim que seja possível tratar o erro disparado pelo código não encerrando assim a execução da aplicação Para isso utilizamos o bloco de código try e catch sendo que dentro do try irá o código que deve ser executado mas que pode gerar um erro e dentro do catch irá o código a ser executado caso um erro aconteça Lembrando que podem ser tratados diversos tipos de exceção em um mesmo bloco try Mas afinal por que é importante tratar as exceções Bom o primeiro ponto é que não queremos que nossa aplicação encerre inesperadamente impedindo que o cliente realize as ações dele E outro contexto é que em muitos pontos do nosso código sabemos que um erro pode acontecer inclusive sabemos por que tal erro pode acontecer então por que não tratar esse erro garantindo uma maior resiliência no nosso código Por exemplo se eu tentar realizar um saque em um valor maior do que tenho disponível é preciso fechar a aplicação do sistema bancário sem me dar nenhum feedback de por que isso aconteceu Ou é melhor apresentarmos uma mensagem dizendo que não existe saldo o suficiente permitindome assim realizar um saque em valor menor Pense sempre que quanto mais resiliente estiver o seu código menos problemas inesperados poderão acontecer garantindo assim a melhor experiência para o usuário que estiver utilizando a aplicação que você desenvolve Até mais 313 Classes Abstratas X Interfaces Olá estudante Durante seus estudos você aprendeu sobre classes abstratas e interfaces e aqui vamos reforçar as diferenças entre elas e também quando devemos utilizar cada uma A classe abstrata é uma classe comum na qual adicionamos a palavra reservada abstract em sua assinatura e ao fazer isso estamos dizendo que esta classe poderá ser utilizada para herança e polimorfismo porém ninguém será capaz de criar uma instância a partir desta classe apenas a partir das suas subclasses Isto ocorre porque uma classe abstrata pode ter métodos abstratos ou seja métodos sem implementação os quais as subclasses que herdam desta classe abstrata serão obrigadas a implementar a menos que essa subclasse também seja abstrata Portanto como temos métodos não implementados não faz sentido permitir instanciar um objeto da classe abstrata pois caso este método não implementado seja chamado o que será executado Já a interface é uma estrutura do Java que não é uma classe e que permite a definição de métodos para que as classes que implementarem esta interface sejam obrigadas a implementar Todos os métodos definidos em uma interface serão considerados abstratos e outro ponto importante é que a interface não permite a criação de atributos apenas de constantes E qual a diferença entre eles Bom a classe abstrata permite a definição de atributos e a implementação de métodos já a interface não permitindo apenas a definição de assinaturas de métodos a serem implementadas pelas classes que o implementam Outro ponto importante é que uma subclasse pode herdar apenas uma classe abstrata diretamente enquanto do outro lado é possível implementar quantas interfaces forem necessárias 314 Portanto se você precisa de uma superclasse com atributos e métodos implementados apenas e que possa ser instanciada crie uma classe comum para herança Se você precisa de uma superclasse que não possa ser instanciada ou que precise ter atributos ou que precise ter métodos concretos e abstratos crie uma classe abstrata para herança Agora se você precisa definir apenas um contrato de métodos que uma classe deve implementar caso implemente aquela funcionalidade específica mas não precisa que essa estrutura genérica tenha atributos ou métodos concretos então crie uma interface Interessante não é mesmo Siga com seus estudos e continue aprimorando seus conhecimentos 315 Gostou do assunto Você pode aprender ainda mais sobre classes abstratas interfaces polimorfismo e tratamento de exceções buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Programação Java e Programação Orientada a Objetos Deitel e Deitel 2016 é um dos autores mais conhecidos quando falamos em Programação Java e Programação Orientada a Objetos O seu livro traz ex celentes explicações sobre os conceitos de Polimorfismo e Interface Além disso também traz um capítulo onde realiza um exame mais profundo sobre o conceito de tratamento de exceções Para auxiliar no seu aprendizado seguem os assuntos e suas respectivas páginas para estudo Capítulo 10 Programação Orientada a Objetos Polimorfismo e Interfaces páginas 311 a 346 Capítulo 11 Tratamento de Exceção um exame mais profundo páginas 347 a 372 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 317 Agora é o momento de conferir um resumo dos principais conhecimentos aprendidos ao longo de seus estudos até aqui Este resumo foi elaborado em formato de checklist para que você assinale os itens que considera já ter desenvolvido e caso sinta a necessidade retome os estudos Aproveite mais esta oportunidade de construção de saberes Resumindo Apliquei princípios de programação orientada a objetos Reconheci processo de desenvolvimento orientado a objeto Modelei linguagem de programação orientada a objetos para resolução de problemas de pequena complexidade Interpretei artefatos UML para implementação de códigos 319 Parabéns Você chegou ao final destes estudos Clique no recurso a seguir e explore o infográfico que preparamos para você Ele traz os principais conceitos e definições que foram abordadas no decorrer de toda essa importante jornada de construção de conhecimentos Esse é um breve resumo para você consultar sempre que sentir necessidade PARA CONCLUIR 321 321 321 Associação Consiste no relacionamento entre classes quando uma classe possui uma referência para outra classe em formato de atributo Agregação Quando o relacionamento entre as duas classes não possui uma dependência total ou seja quando faz sentido que as duas classes que estão se associando continuem existindo caso essa associação seja desfeita Herança Ocorre quando uma classe herda os atributos e métodos de outra classe Neste caso a subclasse que é quem está herdado as informações da superclasse passa a possuir todos os atributos e métodos definidos na superclasse Composição Quando o relacionamento entre as duas classes é de dependência total ou seja não faz sentido uma classe existir se ela não estiver relacionada à outra classe Neste cenário geralmente os objetos da classe que possui a dependência para existir são criados e excluídos a partir da classe principal do relacionamento Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Aprofundando os conceitos de Orientação a Objetos 322 322 322 Sobrescrita de métodos É quando uma subclasse reescreve a implementação de um método definido na superclasse Classes Abstratas São classes que não podem ser instanciadas e que geralmente são utilizadas junto ao conceito de herança Métodos Abstratos São métodos não implementados que são definidos apenas pela sua assinatura em uma classe que deve obrigatoriamente ser abstrata Com isso quando uma subclasse herdar desta classe abstrata deverá obrigatoriamente realizar a implementação dos métodos definidos como abstratos Interface Estrutura que possui apenas a definição de métodos abstratos não sendo permitido criar métodos concretos ou atributos que não sejam constantes Uma interface pode ser implementada por uma classe de forma que essa classe seja obrigada a implementar os métodos na interface definidos Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Aprofundando os conceitos de Orientação a Objetos 323 323 Sobrescrita de métodos É quando uma subclasse reescreve a implementação de um método definido na superclasse Classes Abstratas São classes que não podem ser instanciadas e que geralmente são utilizadas junto ao conceito de herança Métodos Abstratos São métodos não implementados que são definidos apenas pela sua assinatura em uma classe que deve obrigatoriamente ser abstrata Com isso quando uma subclasse herdar desta classe abstrata deverá obrigatoriamente realizar a implementação dos métodos definidos como abstratos Interface Estrutura que possui apenas a definição de métodos abstratos não sendo permitido criar métodos concretos ou atributos que não sejam constantes Uma interface pode ser implementada por uma classe de forma que essa classe seja obrigada a implementar os métodos na interface definidos Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Aprofundando os conceitos de Orientação a Objetos Polimorfismo Consiste em poder enviar uma instância criada a partir de uma subclasse como se fosse uma instância da superclasse porém ao executar os métodos dessa instância da superclasse caso tenham sido sobrescritos na subclasse serão executados os métodos da subclasse utilizada para instanciar Tratamento de Exceções Conceito que permite adicionar um tratamento para as exceções disparadas pela aplicação garantindo assim que a aplicação não seja finalizada quando um erro acontecer pois esse erro poderá ser tratado Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Aprofundando os conceitos de Orientação a Objetos SENAI Trabalhando com arquivos e acesso a banco de dados 327 Olá estudante Seja bemvindo a estes estudos com o tema Trabalhando com arquivos e acesso a banco de dados Chegou o momento de construir uma aplicação mais completa Nesta etapa você irá aprender a realizar a manipulação de arquivos conseguindo realizar a leitura e a escrita de arquivos a fim de armazenar informações de uma forma simples e prática Na sequência você verá como criar uma interface gráfica simples para que possamos evoluir nossas aplicações fornecendo telas de cadastro e listagem E esses cadastros não serão armazenados apenas em arquivos pois também iremos aprender a realizar a conexão do nosso código com um banco de dados possibilitando assim armazenar de uma forma mais segura todas as informações que estamos salvando Ao permitir que o nosso código realize o acesso a um banco de dados você também vai aprender a utilizar um padrão de projeto denominado DAO o qual trará uma melhor organização do código além de permitir utilizar diversos dos conceitos que aprendemos no decorrer deste estudo Bons estudos PARA INICIAR 329 Confira a seguir uma situação prática relacionada aos conteúdos que você estudará a partir de agora Esta é uma importante etapa de seu processo avaliativo Então dediquese ao máximo e busque em sua trajetória de estudos aqui fundamentar os resultados esperados no desafio que está proposto a seguir Aproveite pois essa é uma grande oportunidade de praticar novos conhecimentos Desafio Gerenciamento de Estoque Chegou o momento de criar uma aplicação completa utilizando a linguagem de programação Java desde a definição da estrutura de banco de banco de dados a ser utilizada passando pela definição das classes que irão realizar a comunicação com o seu banco de dados até a interface gráfica para simplificar o uso da aplicação pelo cliente O intuito deste desafio é que você possa ter uma experiência da prática dos conhecimentos adquiridos ao longo deste estudo pois desenvolver uma competência significa justamente ter a habilidade de utilizar os conceitos aprendidos dentro do nosso contexto pessoal e profissional de forma efetiva e eficaz Lembrese esteja atento a todos os detalhes indicados no Desafio e na Agenda pois tratase de uma parte importante de seu processo avaliativo nestes estudos DESAFIO 331 Comunicação Oral e Escrita 331 Os gestores da empresa onde você trabalha perceberam a sua grande dedicação e o quanto você evoluiu nos seus conhecimentos recentemente Por conta disso decidiram direcionar para você a responsabilidade de realizar a implementação de uma aplicação para o controle de estoque de uma empresa parceira Para concluir o desenvolvimento você deverá projetar desde o banco de dados até as interfaces gráficas da aplicação incluindo todo o processo de comunicação dessa aplicação com o banco de dados A seguir você irá encontrar todas as diretivas para a realização desse desenvolvimento Esta aplicação deverá realizar o controle de estoque de produtos armazenando o código do produto nome do produto e quantidade em estoque Deverá ser possível realizar o cadastro de novos produtos Deverá ser possível realizar a atualização de produtos sendo permitido atualizar apenas a quantidade em estoque Gerenciamento de Estoque Comunicação Oral e Escrita 332 332 Deverá ser possível realizar a exclusão de produtos para o caso em que a empresa não trabalhe mais com um determinado produto Deverá ser possível listar todos os produtos cadastrados apresentando o seu código nome e quantidade em estoque Deverá ser possível listar todos os produtos que possuem menos de 10 itens em estoque apresentando o seu código nome e quantidade em estoque Ao incluir um produto deve ser obrigatório informar o nome do produto e a quantidade deve ser maior ou igual a zero Ao atualizar um produto a quantidade deve ser maior ou igual a zero A aplicação deverá permitir realizar um backup de todos os produtos existentes para um arquivo podendo este ser de texto ou binário Obrigatoriamente deve ser apresentada uma interface gráfica para uma melhor interação do usuário Com base nessas informações você deve entregar a implementação do projeto finalizada contendo tanto as classes Java quanto o script SQL para a criação das tabelas Lembrese de consultar a agenda e conferir os detalhes do desafio como resultado esperado forma de desenvolvimento critérios de avaliação e forma de entrega 333 AGENDA Desafio Gerenciamento de Estoque Resultado esperado Deverá ser entregue o projeto contendo todas as classes Java desenvolvidas junto ao script SQL utilizado para criar as tabelas do banco de dados Desenvolvimento Individual Confirmar com o professortutor Critérios de avaliação Criar um projeto para a aplicação solicitada Criar a classe de modelo para os objetos do tipo Produto Importar o driver do banco de dados para dentro do projeto Criar as classes para realizar a comunicação com o Banco de Dados Criar um método para realizar a inclusão de registros no banco de dados Criar um método para realizar a exclusão de registros do banco de dados Criar um método para realizar a alteração de registros do banco de dados Criar um método para realizar a listagem de todos os registros do banco de dados Criar um método para realizar a listagem de todos os registros com menos de 10 itens em estoque do banco de dados Realizar as validações ao inserir um novo produto Realizar as validações ao atualizar um produto Criar uma interface gráfica para a inclusão de novos produtos Criar uma interface gráfica que permita a exclusão de produtos Criar uma interface gráfica que permita a atualização de produtos Criar uma interface gráfica que permita a listagem de todos os produtos Criar uma interface gráfica que permita a listagem de todos os produtos com menos de 10 itens em estoque 334 Criar uma estrutura de classes para permitir salvar todos os produtos em um arquivo Permitir acionar pela interface gráfica o método responsável por realizar o backup para arquivo A aplicação estar executando sem erros de compilação Entregar atividade conforme prazo estabelecido Forma de entrega Arquivo compactado em formato zip a ser entregue em ferramenta do Ambiente Virtual de Aprendizagem AVA 335 Até aqui todo o código que fizemos perdia as informações digitadas junto ao encerramento da aplicação porém agora vamos poder armazenar estas informações em arquivos a visualizar de uma forma mais estruturada utilizando as interfaces gráficas do Java ESTUDO E PRÁTICA I ARQUIVOS E INTERFACE GRÁFICA Nos ebooks você irá aprender conceitos sobre a manipulação de arquivos compreendendo como realizar a escrita e leitura de um arquivo utilizando o Java Na sequência serão vistos alguns conceitos de interface gráfica no Java para que possamos criar uma aplicação com uma usabilidade melhor do que com o JOptionPane e o Systemoutprintln Vamos começar a trabalhar com a manipulação de arquivos no Java Para isso você aprenderá desde o processo de como abrir um arquivo utilizado o código até a como realizar a leitura de dados armazenados nesse arquivo e também a como escrever novas informações em um arquivo Para isso iremos utilizar algumas bibliotecas disponibilizadas pela linguagem de programação bem como teremos a oportunidade de aprimorar os conceitos de tratamento de exceções aprendendo algumas novas exceções que podem ser disparadas pelo código Ebook Trabalhando com arquivos Trabalhando com arquivos 338 A manipulação de arquivos é uma das formas mais antigas de realizar o armazenamento de dados em uma aplicação Além disso é uma opção muito utilizada para realizar a importação de dados para um sistema ou ainda a exportação desses dados Por isso neste ebook você aprenderá a criar e manipular arquivos utilizando a linguagem de programação Java Até o momento toda a nossa aplicação tem realizado o armazenamento de dados em variáveis e arrays de forma que quando uma variável sai do escopo ou a execução da aplicação é finalizada nós perdemos todos os dados registrados Como uma das soluções para esse problema vamos compreender como funciona o armazenamento de informações em arquivos utilizando a linguagem de programação Java Essa é uma das formas mais antigas de se armazenar informações sendo possível também armazenar em bancos de dados forma esta que veremos posteriormente DEITEL DEITEL 2017 De acordo com Deitel e Deitel 2017 o Java vê os arquivos como um fluxo de bytes sequencial os quais podem ser utilizados de duas formas como um fluxo de bytes ou um fluxo de caracteres O fluxo baseado em bytes gera e armazena dados em formato binário de forma que um char tem dois bytes um int possui 4 bytes um long tem 8 bytes e assim por diante quando analisamos os tipos de dados do Java Já o fluxo baseado em caracteres gera e armazena dados como uma sequência de caracteres na qual cada caractere armazenado possui dois bytes independentemente do que ele representa Trabalhando com arquivos 339 Para realizar a manipulação de arquivos a partir da linguagem de programação Java iremos utilizar as classes presentes dentro do pacote java io as quais são disponibilizadas na biblioteca do Java As classes presentes nessa biblioteca são separadas em dois grupos sendo InputStream e Reader o grupo responsável por realizar a leitura de arquivos e OutputStream e Writer o grupo responsável por realizar a escrita de arquivos Essas classes citadas dizem respeito às classes abstratas definidas na biblioteca para as quais temos algumas implementações de classes concretas que veremos mais adiante MANZANO COSTA JUNIOR 2014 ESCREVENDO EM ARQUIVO DE TEXTO SEQUENCIAL Os arquivos de texto armazenam caracteres alfanuméricos palavras e caracteres numéricos além de caracteres especiais Como citado anteriormente cada caractere armazenado no arquivo possui o tamanho de dois bytes portanto se armazenarmos o número 1 um utilizaremos apenas dois bytes pois é representado por um caractere apenas Porém se armazenarmos o número 250000 duzentos e cinquenta mil temos aqui seis caracteres o que significa que serão utilizados 12 bytes para armazenar esse valor É importante saber disso pois dependendo do tipo de dados que serão armazenados no arquivo pode ser vantajoso ou não utilizar o arquivo de texto MANZANO COSTA JUNIOR 2014 Trabalhando com arquivos 340 Trabalhando com arquivos Para trabalhar com arquivos de texto iremos utilizar as classes que herdam de Reader e Writer presentes no pacote javaio e para esse cenário específico iremos fazer uso da classe FileReader que herda de Reader e também da classe FileWriter que herda de Writer Para exemplificar a criação de arquivos vamos trabalhar com um exemplo simples para o qual iremos solicitar informações de um cadastro de pessoa contendo código nome e cpf Após solicitar esses valores o objetivo é armazenar essas informações em um arquivo de forma que possam ser consultadas posteriormente Toda a implementação referente à manipulação de arquivos será feita dentro de uma classe denominada Arquivo Para iniciar a implementação verifique a seguir a criação do método criarArquivo o qual tem como objetivo verificar se já existe um arquivo com um determinado nome e caso não tenha um novo arquivo deve ser criado public void criarArquivoString nomeArquivo String codigo JOptionPaneshowInputDialogInforme o código String nome JOptionPaneshowInputDialogInforme o nome String cpf JOptionPaneshowInputDialogInforme o cpf try File file new FilenomeArquivo FileWriter fileWriter new FileWriterfile false fileWriterwritecodigo fileWriterwrite fileWriterwritenome fileWriterwrite fileWriterwritecpf fileWriterclose catch IOException exception JOptionPaneshowMessageDialognull Erro ao escrever no arquivo Trabalhando com arquivos 341 Trabalhando com arquivos Neste método as primeiras linhas solicitam as informações de código nome e cpf para o usuário a partir de um showInputDialog Na sequência é iniciado o processo de escrita do arquivo dentro do bloco try Primeiramente é criado um objeto do tipo File responsável por inicializar o arquivo Nesse ponto caso o arquivo já exista irá carregálo caso contrário irá criar um novo arquivo com o nome e extensão informados Na criação desse arquivo você pode informar um caminho absoluto por exemplo Cusuariodocumentosexemplotxt ou pode ser informado apenas o nome do arquivo o qual nesse caso será criado na raiz do projeto Java criado Após a criação do arquivo é criada uma instância do objeto FileWriter o qual recebe por parâmetro o objeto file carregado previamente e um valor booleano que se for false indica que o arquivo deverá ser totalmente sobrescrito caso já exista alguma informação salva nele Se for informado true indica que as novas informações a serem escritas no arquivo deverão ser incluídas após as informações já existentes no arquivo como um complemento das informações O FileWriter é o responsável por realizar as operações de escrita no arquivo carregado MANZADO COSTA JUNIOR 2014 Trabalhando com arquivos 342 Na sequência é utilizado o método write do FileWriter para realizar a escrita de valores textuais no arquivo sendo que cada vez que o método é chamado ele adiciona o texto logo ao lado do último texto inserido Por conta disso em algumas linhas você pode observar a escrita da String a qual é responsável por adicionar uma quebra de linha ao arquivo Ao término realizamos o fechamento do arquivo para liberar o recurso alocado Sempre que trabalhamos com arquivos precisamos realizar um tratamento de exceção para o caso de disparar um IOException que pode acontecer ao tentarmos abrir um arquivo inexistente Portanto no tratamento da exceção apenas apresentamos um JOptionPane informando que houve um erro ao escrever no arquivo Com isso temos um processo de escrita em arquivo de texto definido porém podemos realizar uma pequena melhoria nesse código pois estamos fechando o arquivo apenas ao término da execução do bloco try Contudo se alguma exceção acontecer esse arquivo não será fechado caso tenha sido aberto Por conta disso a seguir é apresentada uma alteração neste código para garantir que o arquivo sempre seja fechado No código é possível verificar que agora o FileWriter é definido antes do bloco try porém ele permanece sendo instanciado dentro desse bloco try Ao fazer isso conseguimos mover o processo de fechamento do arquivo para o bloco finally o qual sempre será executado indiferentemente de ter executado o bloco try ou catch Trabalhando com arquivos 343 No bloco finally é verificado se o objeto FileWriter foi instanciado para se for verdadeiro fechar o arquivo e liberar a alocação realizada É importante ressaltar que essa operação fica dentro de um novo bloco trycatch pois o processo de fechar o arquivo também pode disparar uma exceção do tipo IOException public void criarArquivoV2String nomeArquivo String codigo JOptionPaneshowInputDialogInforme o código String nome JOptionPaneshowInputDialogInforme o nome String cpf JOptionPaneshowInputDialogInforme o cpf FileWriter fileWriter null try File file new FilenomeArquivo fileWriter new FileWriterfile false fileWriterwritecodigo fileWriterwrite fileWriterwritenome fileWriterwrite fileWriterwritecpf fileWriterclose catch IOException exception JOptionPaneshowMessageDialognull Erro ao escrever no arquivo finally try if fileWriter null fileWriterclose catch IOException e JOptionPaneshowMessageDialognull Erro ao fechar o arquivo Trabalhando com arquivos 344 Ao executar este método para escrever em um arquivo de texto será criado o arquivo conforme o nome enviado por parâmetro Suponha que tenhamos enviado a String testetxt e informamos o código 9999 o nome Teste e o cpf 123456 Nesse caso será criado um arquivo na raiz do projeto com o nome teste txt e na primeira linha teremos o valor 9999 na segunda linha o valor Teste e na terceira linha o valor 123456 conforme apresentado na figura a seguir Figura 22 Arquivo de texto gerado Fonte Do autor 2023 Agora que já aprendemos como realizar a escrita de um arquivo de texto também precisamos aprender como realizar a leitura de um arquivo de texto Nesse caso em vez de utilizar um FileWriter iremos fazer uso do FileReader junto ao BufferedReader conforme demonstrado a seguir Neste cenário estamos instanciando um objeto do tipo File para obter o arquivo que desejamos fazer a leitura e na sequência iremos criar uma instância de FileReader enviando o File criando previamente por parâmetro O FileReader será o responsável por realizar a leitura do arquivo de texto já o BufferedReader o qual é instanciado na sequência recebendo o FileReader como parâmetro traz uma otimização no processo de leitura do arquivo MANZANO COSTA JUNIOR 2014 Após instanciar todos os objetos necessários para a leitura do arquivo é realizada de fato essa leitura utilizando o método readLine do BufferedReader o qual irá retornar todo o conteúdo de uma linha até encontrar uma quebra de linha no caso um Verifique no código que utilizamos um while para continuar realizando a leitura de linhas do arquivo até que o valor referente à linha seja nulo o que significa que não existe mais linhas a serem lidas Trabalhando com arquivos 345 public void lerArquivoString nomeArquivo File file new FilenomeArquivo FileReader fileReader null BufferedReader bufferedReader null try fileReader new FileReaderfile bufferedReader new BufferedReaderfileReader String linha bufferedReaderreadLine while linha null Systemoutprintlnlinha linha bufferedReaderreadLine catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar a leitura do arquivo finally try if fileReader null fileReaderclose if bufferedReader null bufferedReaderclose catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar o fechamento do arquivo Referente ao tratamento de exceção assim como no FileWriter o FileReader também pode gerar uma IOException referente ao processo de manipulação do arquivo portanto toda a implementação fica dentro de um bloco trycatch para garantir o tratamento desse erro Além disso no bloco finally é verificado isoladamente se o fileReader existe e se o bufferedReader existe para que eles sejam fechados corretamente liberando o espaço alocado Trabalhando com arquivos 346 Com isso finalizamos o processo de escrita e leitura em arquivos de texto utilizando a linguagem de programação Java e as bibliotecas FileWriter e FileReader Para testar a implementação realizada durante a explicação é só criar uma classe com o método main instanciar um objeto referente à classe criada para implementar os métodos de manipulação do arquivo e chamar os métodos de escrita e leitura observando o arquivo gerado na raiz do projeto Vamos verificar agora como realizar a criação de arquivos binários utilizando a linguagem de programação Java Para trabalhar com esse tipo de arquivo é permitido o uso dos tipos primários da linguagem de programação como int boolean e float por exemplo Para isso ao utilizarmos o DataInputStream e DataOutputStream para realizar a escrita e leitura de dados no arquivo teremos métodos auxiliares como writeInt writeFloat e writeBoolean assim como para todos os tipos primitivos existentes no Java MANZANO COSTA JUNIOR 2014 Para demonstrar como realizar a escrita de dados em arquivos do tipo binário a seguir é apresentado um exemplo no qual são solicitadas três informações para o usuário que consistem em código nome e cpf e essas informações são gravadas em um arquivo com o nome enviado por parâmetro para o método Para isso iremos trabalhar com o tipo int para o código e com o tipo String para o nome e o cpf Trabalhando com arquivos 347 public void escreverString nomeArquivo String codigo JOptionPaneshowInputDialogDigite o código String nome JOptionPaneshowInputDialogDigite o nome String cpf JOptionPaneshowInputDialogDigite o cpf OutputStream outputStream null DataOutputStream dataOutputStream null try File file new FilenomeArquivo outputStream new FileOutputStreamfile dataOutputStream new DataOutputStreamoutputStream dataOutputStreamwriteIntIntegerparseIntcodigo dataOutputStreamwriteUTFnome dataOutputStreamwriteUTFcpf catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar a escrita no arquivo finally try if dataOutputStream null dataOutputStreamclose if outputStream null outputStreamclose catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar o fechamento do arquivo Trabalhando com arquivos 348 Neste exemplo iniciamos solicitando os valores por intermédio de um JOptionPaneshowInputDialog e na sequência criamos fora do bloco try as variáveis que serão utilizadas para manipulação do arquivo que consiste no OutputStream o qual irá criar um canal de comunicação de saída para o arquivo informado por parâmetro e o DataOutputStream que tem o objetivo de otimizar em memória as operações de escrita de dados nos arquivos Dentro do bloco try é onde realizamos todas as operações de escrita lembrando que é necessário utilizar o tratamento de exceção pois pode ser disparado um IOException durante o processo de instanciação ou escrita dos componentes referentes à manipulação do arquivo Inicialmente é criado um arquivo utilizando o nome enviado por parâmetro e nesse caso por ser um arquivo binário esse arquivo não necessita nem ter extensão Na sequência são instanciados o FileOutputStream enviando o File criado previamente por parâmetro e o DataOutputStream enviando o FileInputStream por parâmetro Para a escrita do arquivo observe que para cada dado que desejamos escrever utilizamos um método write de acordo com o tipo de dado Portanto temos um writeInt para escrever o código o qual estamos convertendo para um valor inteiro e um writeUTF para escrever as Strings que correspondem ao nome e o cpf Caso alguma exceção aconteça será apresentada a mensagem do bloco catch o qual apenas indica que houve um problema na escrita do arquivo e por fim temos o bloco finally que verifica se foram instanciados o FileInputStream e o DataInputStream para então chamar o método close de cada um Trabalhando com arquivos 349 Com a implementação do método finalizada ao chamar este método a partir de uma classe com a implementação do método main será criado um arquivo conforme o nome enviado por parâmetro armazenando essas informações Como o arquivo criado é binário nem todas as informações são compreensíveis ao abrirmos esse arquivo basicamente apenas as informações de texto serão realmente legíveis A figura a seguir apresenta o arquivo criado a partir da chamada deste método Observe que o nome e o cpf são legíveis por serem Strings porém o código apenas será legível a partir da leitura utilizando a linguagem de programação Java Figura 23 Arquivo binário criado Fonte Do autor 2023 Para realizar a leitura desse arquivo binário é apresentado a seguir o código referente a essa implementação Neste cenário em vez de utilizarmos as classes OutputStream e DataOutputStream utilizamos as classes InputStream e DataInputStream as quais possuem o mesmo contexto das anteriores porém voltadas para a manipulação de leitura do arquivo Assim como na escrita as variáveis são criadas fora do bloco try garantindo assim que seja possível chamar o método close referente a esses objetos dentro do bloco finally 350 Trabalhando com arquivos public void lerString nomeArquivo InputStream inputStream null DataInputStream dataInputStream null try File file new FilenomeArquivo inputStream new FileInputStreamfile dataInputStream new DataInputStreaminputStream SystemoutprintlndataInputStreamreadInt SystemoutprintlndataInputStreamreadUTF SystemoutprintlndataInputStreamreadUTF catch IOException e JOptionPaneshowMessageDialognull Erro ao ler o arquivo binário finally try if inputStream null inputStreamclose if dataInputStream null dataInputStreamclose catch Exception e JOptionPaneshowMessageDialognull Erro ao fechar o arquivo Para instanciar o InputStream utilizamos a classe FileInputStream enviando por parâmetro o arquivo instanciado com base na informação enviada por parâmetro E para instanciar o DataInputStream utilizamos a classe DataInputStream enviado por parâmetro o FileInputStream criado previamente 351 Trabalhando com arquivos Na sequência apenas é impresso na console os valores obtidos a partir do arquivo e observe que para a leitura do valor inteiro foi utilizado o readInt e para a leitura das String o readUTF seguindo o mesmo contexto do que foi utilizado na escrita do arquivo Ao realizar a leitura do arquivo binário é importante que os métodos de read sejam chamados na mesma sequência que foram utilizados os métodos de write Em outras palavras se ao escrever o arquivo foi utilizada a sequência writeInt writeUTF writeBoolean e writeFloat ao realizar a leitura desse mesmo arquivo devese seguir a mesma sequência de tipos de dados realizando um readInt readUTF readBoolean e readFloat Atenção Além de salvar um arquivo binário armazenando com base em cada tipo primitivo de dado que desejamos armazenar também é possível armazenar uma instância de um objeto diretamente no arquivo recuperando esse objeto posteriormente Com isso trabalhando com o conceito de Orientação a Objetos Trabalhando com arquivos 352 tornase muito mais simples fazer esse gerenciamento de armazenar informações em um arquivo e posteriormente recuperálas pois dessa forma conseguimos definir uma classe de modelo por exemplo uma classe Pessoa e armazenar e recuperar instâncias dessa classe Vamos verificar agora um exemplo que realiza essa persistência de um objeto inteiro em um arquivo Você verá que é bem semelhante ao armazenamento de informações em arquivo binário apenas modificando uma das classes referentes ao InputStream que utilizamos Inicialmente será necessário criar a classe Pessoa que será utilizada como base para armazenar e recuperar informações do arquivo binário A seguir é apresentada a implementação dessa classe public class Pessoa implements Serializable private int codigo private String nome private boolean contribuinteIRPF Trabalhando com arquivos 353 public Pessoaint codigo String nome boolean contribuinteIRPF super thiscodigo codigo thisnome nome thiscontribuinteIRPF contribuinteIRPF public int getCodigo return codigo public void setCodigoint codigo thiscodigo codigo public String getNome return nome public void setNomeString nome thisnome nome public boolean isContribuinteIRPF return contribuinteIRPF public void setContribuinteIRPFboolean contribuinteIRPF thiscontribuinteIRPF contribuinteIRPF Trabalhando com arquivos 354 Nessa classe definimos três atributos com tipos de dados diferentes um construtor que exige que sejam informados valores para todos os atributos para que o objeto seja instanciado e os métodos de acesso getters e setters Além disso um outro ponto importante nesta implementação é que a classe implementa a interface Serializable Isso é necessário pois é a interface Serializable que define a implementação que permite salvar um objeto em formato de arquivo binário bem como recuperar esse objeto salvo no arquivo Caso não seja implementada essa interface no momento de tentar salvar um objeto em arquivo será obtida a exceção apresentada na figura a seguir Figura 24 Exceção por não implementar a interface Serializable Fonte Do autor 2023 Após finalizar a implementação da classe de modelo e definila como serializável iremos criar os métodos de escrita do objeto do arquivo binário e de recuperação desse objeto realizando a leitura nesse arquivo binário Iniciando pela escrita a seguir é apresentada a implementação do método escreverObjeto o qual recebe por parâmetro o nome do arquivo a ser criado e também a instância referente ao objeto Pessoa que deve ser salva no arquivo Trabalhando com arquivos 355 A grande diferença entre este código e o apresentado previamente referente ao armazenamento de informações em arquivos binários é que ao salvar um objeto utilizase a classe ObjectOutputStream em vez da classe DataOutputStream Ao instanciar essa classe também é passada a instância de FileOutputStream criada previamente e para escrever o objeto no arquivo utilizase o método writeObject No mais a implementação não sofre alterações do que já havia sido apresentado anteriormente public void escreverObjetoString nomeArquivo Pessoa pessoa OutputStream outputStream null ObjectOutputStream dataOutputStream null try File file new FilenomeArquivo outputStream new FileOutputStreamfile dataOutputStream new ObjectOutputStreamoutputStream dataOutputStreamwriteObjectpessoa catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar a escrita no arquivo eprintStackTrace finally try if dataOutputStream null dataOutputStreamclose if outputStream null outputStreamclose catch IOException e JOptionPaneshowMessageDialognull Erro ao realizar o fechamento do arquivo Trabalhando com arquivos 356 Para a leitura do objeto salvo no arquivo seguese o mesmo princípio muito semelhante à leitura de dados binários apresentada previamente A seguir é apresentada esta implementação na qual em vez de utilizar o DataInputStream estamos utilizando o ObjectInputStream Para carregar o objeto inteiro para uma instância de pessoa utilizamos o método readObject o qual retorna um objeto do tipo Object ou seja o tipo mais genérico de um objeto em Java Isto ocorre pois este método é responsável por retornar qualquer tipo de objeto e como todas as classes em Java no fim herdam de Object ele acaba retornando o tipo mais genérico possível Para converter este Object para um objeto do tipo Pessoa é realizado o que chamamos de cast que consiste na conversão de um tipo de objeto mais genérico para um tipo de objeto mais especializado O cast é feito ao adicionar o nome da classe para a qual desejamos converter o objeto entre parênteses logo após o sinal de igualdade conforme pode ser observado no código Trabalhando com arquivos 357 public void lerObjetoString nomeArquivo InputStream inputStream null ObjectInputStream dataInputStream null try File file new FilenomeArquivo inputStream new FileInputStreamfile dataInputStream new ObjectInputStreaminputStream Pessoa pessoa Pessoa dataInputStreamreadObject SystemoutprintlnpessoagetCodigo SystemoutprintlnpessoagetNome SystemoutprintlnpessoaisContribuinteIRPF catch IOException e JOptionPaneshowMessageDialognull Erro ao ler o arquivo binário catch ClassNotFoundException e JOptionPaneshowMessageDialognull Não foi possível converter o valor lido para o tipo de objeto escolhido finally try if inputStream null inputStreamclose if dataInputStream null dataInputStreamclose catch Exception e JOptionPaneshowMessageDialognull Erro ao fechar o arquivo Trabalhando com arquivos 358 Por conta do cast foi adicionado um bloco catch adicional o qual é responsável por tratar uma exceção que pode ser gerada ao tentar realizar a conversão de Object para Pessoa ou seja o cast Esse tratamento é necessário pois pode acontecer de tentarmos converter um objeto que não seja uma instância de Pessoa para um objeto do tipo Pessoa o que não é possível Portanto esse catch adicional será responsável por tratar esse tipo de situação que neste cenário apenas informamos ao usuário de que não foi possível converter o objeto para o tipo definido Com isso finalizamos as explicações sobre a manipulação de arquivos utilizando a linguagem de programação Java em que você aprendeu a ler e escrever arquivo podendo esses arquivos ser de texto ou binários lembrando que com isso é possível agora armazenar dados em arquivos para recuperar posteriormente ao reiniciar a aplicação algo que não era possível fazer até o aprendizado deste conteúdo Neste ebook você aprendeu a trabalhar com arquivos a partir da linguagem de programação Java Inicialmente você compreendeu as opções de armazenamento de dados em arquivos e entendeu qual a sua importância Na sequência foram apresentados diversos exemplos para o armazenamento de informações em arquivos do tipo texto e binário de forma que nos arquivos binários foi demonstrada a possibilidade de armazenar objetos inteiros ou ainda de armazenar as informações individualmente Trabalhando com arquivos 359 REFERÊNCIAS DEITEL Harvey M DEITEL Paul J Java como programar 10 ed São Paulo Pearson Education 2017 MANZANO José Augusto N G COSTA JUNIOR Roberto Affonso da Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 361 A utilização de interface gráfica faz com que a nossa aplicação tenha uma usabilidade muito mais amigável do que a utilização na console conforme vínhamos utilizando até o momento Portanto você aprenderá a trabalhar com interfaces gráficas voltadas para desktop no Java utilizando as bibliotecas disponibilizadas pela linguagem Com o objetivo de conseguirmos realizar o desenvolvimento de uma interface gráfica para uma aplicação simples de cadastro vamos aprender a criar Janelas com campos de inserção de dados e botões para o preenchimento do cadastro assim como a criação de Janelas com tabelas que apresentem as informações armazenadas Ebook Interface Gráfica Interface Gráfica 364 Chegou o momento de pararmos de utilizar o JOptionPane e a console para solicitar e apresentar informações e utilizarmos uma verdadeira interface gráfica que permita uma melhor interação e navegabilidade para o usuário Por isso neste ebook você aprenderá sobre a biblioteca de interface gráfica do Java que o capacitará a criar telas simples de cadastro e listagem O objetivo de uma interface gráfica com o usuário também chamada de GUI Graphical User Interface consiste em propor um mecanismo amigável para o usuário interagir com um aplicativo Essa interface gráfica é construída a partir do que chamamos de componentes GUI que são objetos com os quais o usuário pode interagir por meio do mouse teclado ou outros mecanismos de interação disponíveis DEITEL DEITEL 2017 Muitas IDEs permitem realizar o design da interface gráfica a partir de plugins que utilizam do conceito de drag and drop que lhe permite arrastar os componentes para a tela e o código vai sendo gerado automaticamente Por mais que essa abordagem simplifique o desenvolvimento o nosso objetivo é compreender todas as etapas da construção de uma interface gráfica aproveitando para colocar em prática diversos dos conceitos de Programação Orientada a Objetos aprendidos Portanto no decorrer deste livro veremos como construir o código de uma interface gráfica de forma manual Interface Gráfica 365 Para desenvolver interface gráfica em Java é preciso realizar o uso de dois pacotes presentes na biblioteca do Java o AWT Abstract Windowing Toolkit e o Swing O pacote AWT foi o primeiro pacote gráfico da linguagem Java enquanto o Swing surgiu posteriormente É importante enfatizar que esses dois pacotes são complementares um ao outro de forma que o Swing deriva das do pacote AWT Por conta disso hierarquicamente falando o pacote Swing está abaixo do pacote AWT e isso também faz com que existam classes com nomes semelhantes como a classe Component do pacote AWT e a classe JComponent do pacote Swing MANZANO COSTA JUNIOR 2014 Para diferenciar quais classes pertencem ao pacote AWT e quais pertencem ao pacote Swing é possível utilizar a letra inicial do nome da classe Praticamente sempre que iniciar com a letra J como o caso do JComponent a classe pertence ao pacote Swing Caso contrário provavelmente irá pertencer ao pacote AWT MANZANO COSTA JUNIOR 2014 Atenção 366 Você já deve ter trabalhado com um componente pertencente ao pacote Swing o JOptionPane Este é um componente utilizado para apresentar caixas de diálogo as quais podem ser para solicitar valores como o showInputDialog e o showConfirmDialog ou para simplesmente apresentar valores que é o caso do showMessageDialog DEITEL DEITEL 2017 Apenas as caixas de diálogo não fornecem uma interação agradável do usuário com a aplicação Por conta disso veremos como utilizar componentes para criar uma Janela de Aplicação Os principais componentes que serão abordados são apresentados na tabela a seguir DEITEL DEITEL 2017 JFrame Representa a Janela principal da nossa aplicação aquela que é possível minimizar e fechar JPanel Representa áreas em que os componentes podem ser adicionados dentro de um JFrame JLabel Utilizado para exibir textos não editáveis JTextField Utilizado para receber a entrada de informações fornecidas pelo usuário JComboBox Apresenta uma lista de itens em formato drop down na qual o usuário pode realizar uma seleção JList Uma lista de itens a partir dos quais o usuário pode fazer uma seleção simples ou múltipla Quadro 1 Componentes do Java Swing Fonte Adaptado de Deitel e Deitel 2017 Interface Gráfica Interface Gráfica 367 Para iniciar o nosso aprendizado referente à interface gráfica vamos realizar a criação de um JFrame o qual representa a janela principal da nossa aplicação Para isso o recomendado é criar uma classe que herde de Jframe conforme apresentado a seguir public class ExemploFrame extends Jframe public ExemploFrame setTitleExemplo Ebook setVisibletrue setSize500500 Observe que a classe aqui chamada de Tela está herdando de JFrame e temos um construtor default que é responsável por chamar o construtor da superclasse além de realizar algumas configurações de inicialização Para o construtor da superclasse devemos enviar uma String a qual representa o título da nossa janela neste caso Exemplo Ebook É utilizado também o método setVisible da superclasse enviando true por parâmetro de forma que ao instanciar um objeto a partir dessa classe fará com que o JFrame seja apresentado em tela Por fim estamos definindo o tamanho da janela utilizando o método herdado da superclasse denominado setSize para o qual estamos dizendo que a janela terá como tamanho 500x500 Para executar e apresentar o JFrame é só criar uma classe com a implementação do método main e instanciar um objeto a partir da classe que criamos a qual herda de JFrame Inicialmente a janela terá a aparência da figura a seguir uma tela vazia apenas com as opções de fechar minimizar e maximizar Interface Gráfica 368 public class ExemploFrame extends JFrame private JPanel panel public ExemploFrame setTitleExemplo Ebook panel new JPanel panelsetLayoutnew GridLayout4 1 addpanel setVisibletrue setSize500500 Figura 25 JFrame vazio Fonte Do autor 2023 Agora que definimos um JFrame a próxima etapa consiste em criar um JPanel o qual será incluído dentro desse JFrame e é onde iremos adicionar os demais componentes como JLabel JTextField e JButton Iremos concentrar a criação de todos os componentes no próprio JFrame porém também é possível separar alguns componentes em diferentes classes A seguir é apresentado o código referente à criação do JPanel Interface Gráfica 369 Neste código existem alguns pontos a serem destacados a começar pelo componente JPanel o qual foi declarado como um atributo da classe O motivo disso é que esse componente poderá ser acessado por diferentes partes do código e não apenas dentro do construtor Portanto é definido um atributo mas a instanciação do objeto é feita no construtor da classe Outro ponto que é possível observar é a definição de layouts sendo definido um FlowLayout para o JFrame o qual irá organizar os componentes lado a lado no JFrame e caso não exista mais espaço ao lado irá inserilos logo abaixo Já para o JPanel foi definido como layout um GridLayout o qual recebe dois parâmetros sendo o primeiro a quantidade de linhas que o JPanel deverá ser dividido e o segundo a quantidade de colunas que cada linha terá Neste cenário estão sendo definidas quatro linhas e cada linha terá apenas uma coluna ou seja apenas um componente Ainda referente à criação do JPanel após a instanciação e a definição do tipo de layout foi chamado o método add referente à superclasse JFrame método este que é responsável por adicionar o componente JPanel que criamos ao componente JFrame Por fim as chamadas aos métodos setSize e setVisible foram movidas para o final da implementação do construtor isso é importante principalmente por conta do setVisible que se o tornarmos true antes de desenharmos os componentes estes não aparecerão na tela 370 Interface Gráfica Vamos aprender agora como adicionar campos de texto na tela sendo esses campos não editáveis como o JLabel ou campos editáveis como o JTextField Para isso o primeiro passo será criar como atributos os componentes que poderão ser acessados em diferentes partes do código que neste caso são os componentes editáveis A seguir é apresentada a criação desses atributos private JPanel panel private JTextField textFieldNome private JTextField textFieldIdade Foram definidos dois atributos do tipo JTextField um que será responsável por solicitar o nome da pessoa e outro que será responsável por solicitar a idade da pessoa Para instanciar esses componentes iremos definir métodos que farão a instanciação e configuração de cada um desses elementos A seguir é apresentada a implementação desses métodos private void criarComponenteNome JLabel labelExemplo new JLabelNome paneladdlabelExemplo textFieldNome new JTextField20 paneladdtextFieldNome private void criarComponenteIdade JLabel labelExemplo new JLabelIdade paneladdlabelExemplo textFieldIdade new JTextField20 paneladdtextFieldIdade 371 Interface Gráfica Na implementação deste código os dois métodos possuem uma estrutura semelhante porém cada um é responsável pela criação de um conjunto de itens para o nosso formulário conjunto este que é formado por um JLabel e um JTextField Inicialmente é criado o JLabel para o qual enviamos no construtor o texto que deverá ser apresentado nesse componente e na sequência adicionamos esse elemento ao panel instanciado anteriormente no construtor Após adicionar o JLabel iremos instanciar o JTextField e armazenar essa instância nos atributos que foram definidos No construtor do JTextField estamos informando a quantidade de colunas que deverá ter o nosso componente definindo assim a largura que ele terá por fim o JTextField também deve ser adicionado ao JPanel Lembrase do GridLayout que foi definido para o JPanel Nele definimos que esse JPanel terá uma estrutura de quatro linhas com uma coluna cada linha Por isso ao adicionarmos o primeiro componente que foi o JLabel ele foi inserido na primeira linha do GridLayout Já ao adicionarmos o JTextField na sequência este foi adicionado na segunda linha do GridLayout ficando abaixo do label adicionado anteriormente Vale ressaltar que se você tivesse definido mais de uma coluna ao adicionar componentes iria primeiro completar todas as colunas da primeira linha para então começar a inserir componentes na segunda linha Atenção Até aqui nós definimos os métodos de criação dos campos Nome e Idade porém não chamamos esses métodos em nenhum lugar Para resolver isso iremos adicionar ao construtor da classe após a criação e inserção do JPanel a chamada a esses dois métodos conforme apresentado a seguir Interface Gráfica 372 Após finalizar esta parte do código se executarmos a aplicação veremos que temos agora uma janela com dois campos de formulário sendo que cada um desses campos possui um JLabel com um texto que indica o que representa o campo e um JTextField o qual é um campo editável para que o usuário informe um valor A figura a seguir apresenta a estrutura da tela com os códigos implementados até o momento public ExemploFrame setTitleExemplo Ebook panel new JPanel panelsetLayoutnew GridLayout4 1 addpanel criarComponenteNome criarComponenteIdade setVisibletrue setSize500500 Interface Gráfica 373 Figura 26 Execução do JFrame Fonte Do autor 2023 Vamos verificar agora como realizar a inclusão de um botão a nossa janela com o objetivo de salvar as informações fornecidas no formulário Para isso iremos trabalhar com o JButton para o qual também iremos definir um método específico para a sua criação organizando de uma melhor forma o nosso código A seguir é apresentada a implementação desse método private void criarBotaoSalvar JButton buttonSalvar new JButtonSalvar buttonSalvaraddActionListenernew ButtonSalvarHandler paneladdbuttonSalvar A estrutura para a criação do JButton é bem semelhante a dos outros componentes que já vimos sendo enviado pelo construtor o texto que será apresentado junto ao botão neste caso Salvar Após isso adicionamos o botão ao nosso JPanel para que ele possa de fato aparecer em tela A chamada a esse método será feita a partir do construtor da classe logo após a criação dos campos do formulário A seguir é apresentado o construtor da classe atualizado e será possível observar também que a quantidade de linhas no GridLayout subiu para cinco pois agora além dos dois JLabels e dois JTextFields também teremos um JButton totalizando cinco linhas Interface Gráfica 374 public ExemploFrame setTitleExemplo Ebook panel new JPanel panelsetLayoutnew GridLayout4 1 addpanel criarComponenteNome criarComponenteIdade criarBotaoSalvar setVisibletrue setSize500500 Com a implementação realizada para o botão até o momento nenhuma ação foi definida para esse botão de forma que ao executar a aplicação e clicar em Salvar nada irá acontecer Para resolver isso será preciso implementar o que chamamos de handler para o nosso JButton cuja implementação é apresentada a seguir private void criarBotaoSalvar JButton buttonSalvar new JButtonSalvar buttonSalvaraddActionListenernew ButtonSalvarHandler paneladdbuttonSalvar Interface Gráfica 375 private class ButtonSalvarHandler implements ActionListener Override public void actionPerformedActionEvent e JOptionPaneshowMessageDialognull Nome textFieldNomegetText Idade textFieldIdadegetText O handler consiste em uma classe privada a qual deve ser criada dentro da classe referente ao JFrame Essa classe que chamamos de ButtonSalvarHandler deve implementar a interface ActionListener a qual define todas as ações que um botão clicável deve realizar Por ser uma interface será necessário que a nossa classe privada implemente os métodos definidos por ela que neste caso é o método actionPerformed que recebe um objeto do tipo ActionEvent por parâmetro Dentro desse método deve ser implementado o que deverá acontecer quando for clicado no botão que neste cenário estamos apenas apresentando um JOptionPane com as informações preenchidas nos campos do formulário Interface Gráfica 376 Observe que na implementação da classe privada referente ao handler é possível acessar os atributos definidos na classe acima no caso no JFrame Isso é permitido porque o handler foi criado como uma classe privada dentro do JFrame o que permite que essa classe acesse todas as informações do JFrame Outro ponto a ser observado é que o handler apenas consegue acessar os dados do JTextField porque estes foram definidos como atributos caso tivessem sido definidos como variáveis locais dentro do construtor não seria possível o acesso às suas informações fora desse construtor Atenção Para concretizar a implementação do handler além de definir a classe também é necessário informar ao botão qual será o seu handler Para isso no método criarBotaoSalvar foi adicionada uma linha na qual adicionamos um actionListener ao botão enviando como parâmetro uma instância da classe ButtonSalvarHandler a qual implementa a interface ActionListener portanto fazendo o uso do conceito de polimorfismo para enviar esta informação Com a implementação que realizamos até o momento temos uma aplicação que solicita o nome e a idade de uma pessoa e ao clicar em salvar apresentamos um JOptionPane com as informações preenchidas Agora vamos incrementar essa aplicação realizando a inclusão de dois componentes que recebem uma lista de valores para seleção que são o JComboBox e o JList O objetivo é sempre que salvarmos as informações de uma pessoa adicionar essa pessoa em ambos os componentes de lista Para isso iremos primeiro criar uma entidade de modelo para representar uma Pessoa pois assim será possível instanciar uma pessoa como um objeto dentro da nossa aplicação enviando no construtor o seu nome e idade A seguir é apresenta a implementação desta classe Interface Gráfica 377 public class Pessoa private String nome private int idade public Pessoa public PessoaString nome int idade thisnome nome thisidade idade public String getNome return nome public void setNomeString nome thisnome nome public int getIdade return idade public void setIdadeint idade thisidade idade Override public String toString return nome idade Interface Gráfica 378 Na implementação desta classe temos os dois atributos encapsulados permitindo os seus acessos pelos métodos get e set e dois construtores um padrão e outro recebendo todas as informações por parâmetro No final da classe temos uma sobrescrita do método toString este é um método que todos os objetos do Java possuem pois ele está definido na classe Object que é a superclasse de todas as classes Esse método é chamado sempre que tentamos imprimir o valor de um objeto por exemplo se fizermos um Systemout printlnpessoa será impresso o que for definido dentro do método toString por conta disso estamos sobrescrevendo esse método para que sempre que imprimirmos o valor de Pessoa seja apresentado o nome e a idade dessa pessoa Com esta classe de modelo definida vamos criar os atributos referentes às nossas listas A seguir é apresentada a definição do atributo JComboBox e do atributo JList e ambas recebem entre os sinais de menor e maior o tipo de dado que essas listas irão armazenar que no nosso caso serão objetos do tipo Pessoa Também é definido um atributo do tipo DefaultListModel o qual será utilizado para adicionar valores à nossa JList posteriormente private JPanel panel private JTextField textFieldNome private JTextField textFieldIdade private JComboBoxPessoa comboBox private JListPessoa list private DefaultListModelPessoa listModel Para inicializar os componentes a adicionar ao JPanel foram criados dois métodos um denominado criarComboBox e outro denominado criarList conforme demonstrado a seguir No método criarComboBox a inicialização é bem semelhante as dos campos JTextField modificando apenas o tipo de componente que está sendo inicializado Interface Gráfica 379 private void criarComboBox JLabel labelComboBox new JLabelPessoas paneladdlabelComboBox comboBox new JComboBoxPessoa paneladdcomboBox private void criarList JPanel panelList new JPanel JLabel labelList new JLabelPessoas 20 paneladdlabelList listModel new DefaultListModelPessoa list new JListPessoalistModel listsetPreferredSizenew Dimension400 200 JScrollPane scrollPane new JScrollPanelist scrollPanesetPreferredSizenew Dimension400200 panelListaddscrollPane addpanelList 380 Interface Gráfica Já o método criarList possui algumas particularidades como a criação de um JPanel específico para o JList Isso é necessário pois por estarmos utilizando o GridLayout no outro JPanel todas as linhas devem conter a mesma altura porém o JList é um componente maior pois apresenta uma lista de itens a serem selecionados por conta disso foi criado um JPanel específico para ele Outro ponto é a inicialização do DefaultListModel diferentemente do JComboBox em que conseguimos inserir valores diretamente pelo componente o JList necessita de um ListModel específico para gerenciar isso portanto instanciamos e passamos esse ListModel por parâmetro na instanciação do JList Além disso também estamos definindo um tamanho fixo para o JList utilizando o setPreferredSize enviado uma instância de Dimension por parâmetro na qual definimos 400 pixels de largura e 200 pixels de altura Também criamos nesse método um JScrollPane que é necessário porque o JList pode receber uma quantidade de itens que ultrapassa o seu tamanho Ao definir o JScrollPane e adicionar o JList dentro desse componente estamos atribuindo uma barra de rolagem vertical para quando a quantidade de itens da lista for maior que o seu tamanho Por fim adicionamos esse JScrollPane ao panel criado especificamente para a lista e o panel é adicionado diretamente ao JFrame e não ao outro panel que havíamos definido 381 Interface Gráfica Com o JComboBox e o JList inicializados será preciso modificar o handler referente ao botão para todas as vezes em que salvarmos um objeto do tipo Pessoa adicionarmos esse objeto nas duas listas A seguir essa implementação é demonstrada de forma que é instanciado um objeto do tipo Pessoa utilizando o construtor com parâmetros com base nos valores dos JTextField e na sequência esse objeto é adicionado ao JComboBox a partir do método addItem e também ao ListModel a partir do método addElement Como esse ListModel foi utilizado na instanciação do JList toda alteração realizada nesse ListModel irá refletir no JList private class ButtonSalvarHandler implements ActionListener Override public void actionPerformedActionEvent e JOptionPaneshowMessageDialognull Nome textFieldNomegetText Idade textFieldIdadegetText Pessoa pessoa new PessoatextFieldNomegetText IntegerparseInttextFieldIdadegetText comboBoxaddItempessoa listModeladdElementpessoa Interface Gráfica 382 E para finalizar esta implementação de exemplo não podemos nos esquecer de chamar os métodos criarComboBox e criarList no construtor do JFrame o que é demonstrado a seguir public ExemploFrame setTitleExemplo Ebook setLayoutnew FlowLayout panel new JPanel panelsetLayoutnew GridLayout9 1 panelsetSize500 300 addpanel criarComponenteNome criarComponenteIdade criarBotaoSalvar criarComboBox criarList setSize500500 setVisibletrue setDefaultCloseOperationEXITONCLOSE Agora ao executarmos a nossa aplicação e cadastrarmos algumas pessoas será possível verificar que esses objetos serão inseridos tanto no JComboBox quanto no JList conforme demonstrado na figura a seguir Interface Gráfica 383 No construtor final apresentado referente à classe que herda do JFrame foi adicionada uma nova linha de código com o setDefaultCloseOperation Isso é importante para garantir que ao clicar no X para fechar a janela referente à aplicação irá encerrar a execução do código Caso contrário o código permanece executando em background Atenção Figura 27 Execução final da aplicação Fonte Do autor 2023 Interface Gráfica 384 Na aplicação desenvolvida no decorrer deste ebook em momento algum foi realizada a validação dos dados Portanto sugiro como atividade para fortalecer os seus conhecimentos validar se os campos de nome e idade foram preenchidos e também se a idade corresponde a um valor numérico antes de instanciar um objeto do tipo Pessoa e adicionar as Listas Outra sugestão de melhoria a ser implementada é para sempre que clicar em salvar e adicionar as informações a Lista limpar os campos JTextField referente ao nome e idade facilitando a usabilidade da aplicação Mão na massa Com isso finalizamos o processo de aprendizagem referente aos componentes básicos para se trabalhar com interface gráfica no Java Existem diversos outros componentes além dos apresentados neste ebook porém o objetivo aqui foi o de demonstrar a utilização dos principais elementos necessários para se criar uma aplicação com interface gráfica Neste ebook você aprendeu o básico necessário para trabalhar com interfaces gráficas no Java compreendendo principalmente a biblioteca Swing e seus principais componentes como JFrame JPanel JLabel JTextField JButton JComboBox e JList Com isso já é possível criar uma interface gráfica simples e amigável com o objetivo de solicitar e apresentar informações para o usuário tornando as nossas aplicações mais completas Interface Gráfica 385 REFERÊNCIAS DEITEL Harvey M DEITEL Paul J Java como programar 10 ed São Paulo Pearson Education 2017 MANZANO José Augusto N G COSTA JUNIOR Roberto Affonso da Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 SENAI 387 Videoflix Com o objetivo de aprender na prática os conceitos de manipulação de arquivos e de interface gráfica nesta sequência de vídeos nós iremos juntos criar uma aplicação simples que irá realizar a leitura de um arquivo para importar dados para a nossa aplicação que permitirá realizar o cadastro de novos dados a partir da interface gráfica e que por fim terá uma opção para exportar os dados atualizados para um arquivo httpsplayervimeocom video828452809hdea1c7065e Apresentando o projeto que será desenvolvido httpsplayervimeocom video828452840h3aea37e834 Criando a classe ArquivoUtils Parte 1 httpsplayervimeocom video828452874h6f6ccf1dc5 Criando a classe ArquivoUtils Parte 2 388 httpsplayervimeocom video828452901h8887c159a3 Criando a tela de Página Inicial httpsplayervimeocom video828452928he5efe37933 Criando a tela de Cadastro httpsplayervimeocom video828452959hb88799ba9c Criando a tela de Listar 389 Nestes infocasts serão apresentados maiores esclarecimentos e detalhes referentes aos principais conceitos vistos neste estudo Vamos falar um pouco mais de arquivos comentando melhor sobre as diferenças entre os arquivos de texto e os binários realizando um comparativo para ajudálo a decidir qual a melhor abordagem quando precisar desse recurso em um projeto Já referente à interface gráfica vamos falar um pouco mais sobre as principais diferenças entre as duas principais bibliotecas que são AWT e Java Swing apresentando as principais diferenças entre elas Infocast 391 Diferenças entre o AWT e o Swing Olá Quando falamos de interface gráfica no Java logo ouvimos o nome das duas principais bibliotecas que existem sendo a AWT e a Swing Mas o que muda entre elas Bom o AWT que significa Abstract Window Toolkit foi a primeira implementação disponível no Java para se trabalhar com interfaces gráficas e algumas de suas características incluem o fato de que seus componentes são dependentes de plataforma e sua execução é um pouco mais pesada que a do Swing Já o Swing consiste em uma implementação sem nenhum código nativo tendo toda a sua implementação baseada nas classes da biblioteca Java tornando as suas interfaces gráficas independentes de plataforma Porém eles permitem uma maior liberdade para o desenvolvimento tornando possível realizar implementações customizadas que na biblioteca AWT não é tão simples assim Para diferenciar os componentes AWT dos componentes Swing pois muitas vezes os nomes são semelhantes você pode considerar o J no início do nome da classe sendo que as classes JComponent JTextField JLabel JList são todas classes Swing Hoje por mais que existam as duas opções é muito mais comum acompanharmos implementações utilizando apenas Java Swing ficando a biblioteca AWT um pouco depreciada Agora se você quiser saber qual a melhor biblioteca como sempre não existe uma resposta correta para essa pergunta porém eu diria que pela maleabilidade e liberdade que o Java Swing fornece acredito esta seja a melhor opção atualmente Até a próxima 393 Diferença entre os arquivos de texto e os arquivos binários Olá Você sabe quais as principais diferenças entre um arquivo de texto e um arquivo binário ao trabalhar com o desenvolvimento em Java Bom para começar o nome do arquivo em texto já diz praticamente tudo sobre esse tipo de arquivo certo Esse é um arquivo que irá armazenar apenas valores textuais que em Java pode ser um char ou uma String e a característica é que cada caracter que é inserido no arquivo possui dois bytes independentemente ser um valor numérico ou um texto Já referente aos arquivos binários estes permitem armazenar informações de mais tipos de dados como int float long boolean ou até mesmo um objeto Portanto não é permitido armazenar exclusivamente valores textuais sendo possível a partir da linguagem de programação Java incluir e obter valores já de acordo com o seu tipo de dado específico E quando se deve utilizar cada um Aí depende da sua necessidade Muitas vezes um arquivo de texto é mais simples porém demanda um maior número de processamentos para converter os dados para seus respectivos tipos e até mesmo estratégias para separar diferentes tipos de dados sendo cada informação em uma linha ou a definição de um separador entre cada informação na mesma linha Já no arquivo binário temos um armazenamento mais estruturado onde cada informação será armazenada separadamente utilizando o seu tipo de dados específico o único cuidado é que os dados devem ser recuperados na mesma sequência que foram armazenados Além disso um outro ponto importante a ser observado é que o arquivo de texto é legível por qualquer pessoa que conseguir acessálo já para um arquivo binário não é tão simples assim realizar a sua leitura sendo que o único tipo de dado que é facilmente identificável ao abrir esses arquivos é o valor textual Portanto exitem grandes diferenças entre esses dois tipos de arquivos mas saber qual a melhor opção para um projeto vai depender da sua análise para identificála Até a próxima 395 Gostou do assunto Você pode aprender ainda mais sobre Relacionamento entre Classes e Herança buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Java como programar Deitel e Deitel 2017 estão entre os autores mais conhecidos quando fa lamos em Programação Java e Programação Orientada a Objetos Seu livro traz excelentes explicações sobre o conceito de Java Swing e Manipulação de Arquivos Para auxiliar no seu aprendizado seguem os assuntos e suas respectivas páginas para estudo Capítulo 12 Componentes GUI parte 1 páginas 373 a 428 Capítulo 15 Arquivos fluxos e serialização de objetos páginas 507 a 531 Capítulo 22 Componentes GUI parte 2 páginas 711 a 743 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 396 Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento Outros autores que trazem uma excelente explicação sobre esses conceitos são Manzano e Costa Junior 2014 que abordam os conceitos de interface gráfica e manipulação de arquivos de uma forma simples e sempre demons trando exemplos práticos junto à explicação teórica Seguem os assuntos e suas respectivas páginas para estudo Capítulo 9 Interface Gráfica Básica páginas 255 a 298 Capítulo 11 Arquivos em Disco páginas 333 a 367 MANZANO José Augusto N G COSTA JUNIOR Roberto Affonso da Java 8 programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 397 Agora é o momento de conferir um resumo dos principais conhecimentos aprendidos ao longo de seus estudos até aqui Este resumo foi elaborado em formato de checklist para que você assinale os itens que considera já ter desenvolvido e caso sinta a necessidade retome os estudos Aproveite mais esta oportunidade de construção de saberes Resumindo Apliquei princípios de programação orientada a objetos Reconheci processo de desenvolvimento orientado a objeto Utilizei técnicas e normas para manipulação de arquivos Implementei interfaces gráficas para interação com o usuário Modelei linguagem de programação orientada a objetos para resolução de problemas de pequena complexidade 399 Agora chegou o momento de permitimos que o nosso código realize a conexão com o banco de dados com o objetivo de permitir o armazenamento dos dados cadastrados na aplicação de uma forma simples e segura ESTUDO E PRÁTICA II CONECTANDO AO BANCO DE DADOS Nestes ebooks você aprenderá todo o processo necessário para realizar a conexão da nossa aplicação Java com um Banco de Dados Para isso faremos uso de praticamente todos os conceitos de Programação Orientada a Objetos aprendidos até aqui com o objetivo de deixar esse acesso ao banco de dados o mais simples e menos abstrato possível Neste primeiro ebook iremos aprender o básico necessário para realizar a conexão de uma aplicação Java com um Banco de Dados Veremos como realizar a configuração para permitir esta conexão e também como inicializar a nossa conexão junto à aplicação que está sendo desenvolvida Após esse processo de conexão e configuração veremos como realizar as operações básicas de um banco de dados que são inserção alteração exclusão e listagem Ebook Configurando a Conexão com o Banco de Dados Configurando a Conexão com o Banco de Dados 402 CONFIGURANDO A CONEXÃO COM O BANCO DE DADOS INTRODUÇÃO Chegou o momento de descobrir como proceder a configuração da aplicação para realizar a conexão com um banco de dados que nos permitirá armazenar as informações fornecidas pelas telas de cadastro de uma forma mais simples e segura Para isso neste ebook você também irá aprender a realizar as operações de inserção alteração exclusão e listagem de dados a partir do código Java Previamente você aprendeu a armazenar dados em arquivos de texto e binários como uma forma de conseguir recuperar informações criadas durante o desenvolvimento de uma aplicação após reiniciála Porém existem outras formas de armazenar coleções de dados de forma organizada e a principal é com o uso de Banco de Dados Para isso fazse uso de Sistemas Gerenciadores de Banco de Dados os quais fornecem mecanismos para armazenar organizar recuperar e modificar dados DEITEL DEITEL 2017 Neste ebook não iremos entrar no conceito de como criar e manipular um banco de dados utilizando a linguagem SQL Structured Query Language mas sim veremos como realizar a conexão entre a nossa aplicação Java e um sistema gerenciador de banco de dados Para isso é preciso utilizar os drivers JDBC que consistem em bibliotecas Java produzidas pelos próprios Sistemas Gerenciadores de Banco de Dados os quais trazem as implementações das classes necessárias para que seja possível realizar a comunicação e a manipulação dos dados a partir de uma aplicação DEITEL DEITEL 2017 Configurando a Conexão com o Banco de Dados 403 Para os exemplos que serão apresentados no decorrer deste material iremos fazer o uso do banco de dados MariaDB que consiste em um fork realizado a partir do MySQL mas que é uma solução totalmente opensource CONFIGURANDO A CONEXÃO COM O BANCO DE DADOS Para permitir que o nosso projeto Java realize a comunicação com o banco de dados MariaDB o primeiro passo consiste em obter o driver JDBC fornecido pelo Gerenciador de Banco de Dados para o desenvolvimento em Java Para realizar o download do driver JDBC você precisa acessar o link ou código QR a seguir httpsmariadbcomdownloadsconnectors connectorsdataaccess Acessando o link do site mariadbcom indicado acima você será direcionado para o download dos drivers que também são conhecidos como connectors fornecidos pelo próprio fornecedor neste caso MariaDB A figura a seguir apresenta a tela de download existente no momento da produção deste material Configurando a Conexão com o Banco de Dados 404 Figura 28 Tela de download do driver JDBC Fonte MariaDB 2023 Nesta tela é preciso selecionar a aba Connectors na parte superior e então em Product selecionar a linguagem de programação referente a qual deseja realizar o download do driver JDBC o qual neste caso será o Java 8 connector Após selecionar todas as informações será necessário clicar em Download na parte inferior da tela quando será de fato obtido o driver JDBC o qual terá uma extensão jar Para continuarmos com a configuração de uma aplicação com acesso ao banco de dados sugiro realizar a criação de um novo projeto Java no Eclipse o qual para este exemplo será nomeado como ConexaoBancoDeDados Inicialmente não iremos criar nenhuma classe mas iremos importar o nosso driver JDBC obtido previamente para o nosso projeto fazendo assim com que seja possível realizar a conexão com o banco de dados Para realizar essa ação é preciso clicar com o botão da direita no projeto então selecionar Build Path e na sequência clicar em Configure Build Path Esse caminho levará você até a tela de configuração de bibliotecas do Java conforme apresentado na figura a seguir Nessa tela na parte superior temos diversas abas para configuração do Build Path mas iremos trabalhar aqui com a aba denominada Libraries Configurando a Conexão com o Banco de Dados 405 Nessa aba será possível verificar que temos apenas uma biblioteca importada a qual representa toda a biblioteca de desenvolvido do Java Para adicionar o driver JDBC ao Build Path será necessário primeiro clicar em classpath na área de bibliotecas existentes para então clicar em Add External Jars e então buscar o local onde salvou o connector referente ao MariaDB obtido previamente Após concluir a seleção você verá que o connector irá aparecer na área de bibliotecas importadas Por fim é só clicar em Aplicar e Fechar para que as alterações sejam aplicadas ao projeto Figura 29 Configuração do Build Path Fonte Tela do autor em MariaDB ConnectorJ v 313GA 2023 Configurando a Conexão com o Banco de Dados 406 Após finalizar o processo de configuração do connector será possível visualizar o arquivo jar importado nas Referenced Libraries do projeto conforme é apresentado na figura a seguir Figura 30 Connector importado no Referenced Libraries Fonte Tela do autor em MariaDB ConnectorJ v 313GA 2023 Agora o seu projeto está configurado porém para iniciarmos o processo de conexão com o banco de dados e realizarmos a manipulação desses dados primeiro será necessário criar uma base de dados na qual podermos nos conectar Para exemplificar iremos trabalhar com uma estrutura simples de banco de dados na qual teremos um database chamado poo e duas tabelas uma para armazenar informações de pessoa e outra para armazenar informações de telefone sendo que a tabela de telefone terá uma chave estrangeira para pessoa Ambas as tabelas criadas possuem uma chave primária autoincrementável portanto não será necessário gerenciar a sequência da chave primária A seguir é apresentado o script de criação desse banco de dados Configurando a Conexão com o Banco de Dados 407 CREATE DATABASE IF NOT EXISTS poo USE poo CREATE TABLE IF NOT EXISTS pessoa idpessoa INT NOT NULL AUTOINiiCREMENT PRIMARY KEY nome VARCHAR100 NOT NULL cpf CHAR14 NOT NULL CREATE TABLE IF NOT EXISTS telefone idtelefone INT NOT NULL AUTOINCREMENT PRIMARY KEY ddd INT NOT NULL numero CHAR10 NOT NULL apelido VARCHAR30 idpessoa INT NOT NULL FOREIGN KEY idpessoa REFERENCES pessoa idpessoa Para iniciar a manipulação dos dados a partir do nosso projeto o primeiro passo será criar a conexão com o banco de dados Para isso será criada uma classe denominada BancoDeDados a qual será a responsável por gerenciar a conexão com o banco o fechamento desta conexão com o banco e também as queries de manipulação de dados Inicialmente nesta classe será preciso criar um atributo referente à conexão e realizar o processo de abertura da conexão com o banco de dados que será feito no construtor da classe para garantir que esta seja instanciada com uma conexão ativa Como é possível observar a seguir criamos um atributo privado com base na interface Connection a qual é responsável por gerenciar a conexão com o banco de dados e inicialmente esta conexão é definida como null Para inicializar essa instância definimos um método privado denominado abrirConexao o qual é chamado no construtor padrão da classe Esse método realiza o carregamento do driver JDBC que importamos para o projeto utilizando o ClassforName onde é enviado o caminho da classe referente ao Driver dentro da biblioteca importada Configurando a Conexão com o Banco de Dados 408 Na sequência realiza a conexão com o banco de dados a partir do método getConnection chamado de forma estática a partir da classe DriverManager Para iniciar a conexão são necessários três parâmetros sendo o primeiro a url de conexão o segundo o usuário do banco e o terceiro a senha deste usuário DEITEL DEITEL 2017 public class BancoDeDados private Connection connection public BancoDeDados abrirConexao private void abrirConexao try ClassforNameorgmariadbjdbcDriver connection DriverManager getConnectionjdbcmariadblocalhost3306poo root 123456 JOptionPaneshowMessageDialognull Conexão com o banco de dados realizada com sucesso catch SQLException e JOptionPaneshowMessageDialognull Erro ao realizar a conexão com o banco de dados eprintStackTrace catch ClassNotFoundException e JOptionPaneshowMessageDialognull Não foi possível carregar o driver de conexão eprintStackTrace Configurando a Conexão com o Banco de Dados 409 A url de conexão segue um padrão composto por jdbcsistema gerenciador de banco de dadosendereço do banco de dadosporta do banco de dadosnome do banco de dados Para outros sistemas gerenciadores de banco de dados basicamente o que deve ser alterado é o nome do sistema gerenciador de banco de dados e a porta de conexão o endereço de conexão durante o desenvolvimento que geralmente é localhost porém após estar em produção apontará para o endereço do banco de dados real que pode ser um endereço IP ou uma URI DEITEL DEITEL 2017 Na implementação dos tratamentos de exceção referentes ao método responsável por abrir a conexão com o banco de dados foi adicionado um JOptionPane indicando que houve um erro e na sequência o comando eprintStackTrace foi adicionado A inclusão dessa linha faz com que ao acontecer o erro seja apresentado um log na console o que nos auxilia na identificação do motivo do erro Em cenário com conexão com banco de dados é importante adicionar esse comando pois muitas vezes não sabemos o motivo pelo qual não foi possível fazer a conexão já que são muitos os erros que podem acontecer Dessa forma a console apresenta uma descrição mais detalhada de onde o erro ocorreu em nosso código Dica Configurando a Conexão com o Banco de Dados 410 Toda a implementação da conexão do banco de dados está dentro de um bloco try o qual possui dois tratamentos de exceção um SQLException o qual pode gerar problemas na conexão com o banco como um acesso negado ou uma URL usuário ou senha inválidos Além disso também temos um ClassNotFoundException pois ao carregar o driver de conexão com o ClassforName estamos acessando uma classe dinamicamente em tempo de execução e caso o caminho indicado para esta classe não exista será disparada essa exceção DEITEL DEITEL 2017 Ao se trabalhar com conexões de banco de dados existem duas estratégias diferentes A primeira consiste em abrir uma conexão com o banco de dados ao abrir a aplicaçãoe fechar a conexão apenas ao finalizar a aplicação ou então é possível realizar a conexão antes de cada manipulação do banco de dados para fechar essa conexão após a efetivação da manipulação dos dados Neste cenário de exemplo iremos trabalhar com a primeira estratégia citada iniciando a conexão ao executar a aplicação e fechando essa conexão ao finalizar a aplicação Para isso iremos criar um método público chamado fecharConexao apresentado a seguir o qual deverá ser chamado no momento em que a aplicação é encerrada Configurando a Conexão com o Banco de Dados 411 public void fecharConexao try if thisconnection null thisconnection isClosed thisconnectionclose JOptionPaneshowMessageDialognull Conexão com o Banco de Dados fechada com sucesso catch SQLException e JOptionPaneshowMessageDialognull Erro ao fechar a conexão com o banco de dados A implementação referente ao método de fechar conexão com o banco de dados é realizada dentro de um bloco try no qual verificamos se existe uma instância do atributo denominado connection e caso exista também verificamos se essa conexão já não está fechada Caso não esteja é chamado o método close referente à implementação da interface Connection efetivando assim o fechamento da conexão com o banco de dados O único tratamento de exceção realizado é referente ao SQLException pois é possível que ocorra um erro no momento de fechar a conexão com o banco de dados Configurando a Conexão com o Banco de Dados 412 Para testar se a implementação está funcionando e se a conexão com o banco de dados está acontecendo corretamente será criada uma nova classe denominada Conexao na qual será implementado um método main conforme apresentado a seguir Na implementação desse método apenas instanciamos um objeto do tipo BancoDeDados e no momento da instanciação ao executarmos o construtor da classe será realizada a conexão com o banco de dados de forma que se tudo der certo deverá apresentar um JOptionPane com a mensagem Conexão com o banco de dados realizada com sucesso Já na sequência é chamado o método para fechar a conexão com o banco de dados o qual caso executado sem erros irá apresentar a mensagem Conexão com o banco de dados fechada com sucesso em um JOptionPane ou seja se essas duas mensagens forem apresentadas em sequência significa que a nossa conexão com o banco de dados está ocorrendo corretamente Com a configuração de conexão de banco de dados finalizada chegou o momento de realizar a manipulação dos dados em que veremos como realizar uma inserção atualização e exclusão de dados e também como realizar uma consulta de dados Todas estas implementações serão feitas dentro da classe BancoDeDados para que possamos fazer uso da instância de connection criada e armazenadas como um atributo da classe Antes de qualquer coisa recomendase criar uma classe de modelo para representar a tabela do banco de dados a partir de uma classe Java Neste ebook serão exemplificados os comandos SQL referente à tabela de pessoa Portanto a seguir é apresentada a implementação dessa classe de modelo a qual tem por finalidade ser a representação de um objeto Java para a tabela do banco de dados Para isso observe que os atributos criados são uma réplica das colunas da tabela do banco de dados sempre obedecendo os tipos de dados public class Pessoa private int idPessoa private String nome private String cpf Configurando a Conexão com o Banco de Dados 413 public Pessoa public Pessoaint idPessoa String nome String cpf thisnome cpf thisidPessoa idPessoa public PessoaString nome String cpf thisnome nome thiscpf cpf public int getIdPessoa return idPessoa public void setIdPessoaint idPessoa thisidPessoa idPessoa public String getNome return nome public void setNomeString nome thisnome nome public String getCpf return cpf public void setCpfString cpf thiscpf cpf Configurando a Conexão com o Banco de Dados 414 Após definir a classe de modelo iremos iniciar pela inserção de dados A seguir é apresentada a implementação do método denominado salvarPessoa o qual recebe por parâmetro uma instância de pessoa que deve ser salva no banco de dados e a execução do comando de insert Na primeira linha do método é definida uma variável do tipo String onde consta o comando SQL a ser executado no banco de dados que neste caso é um simples insert na tabela de pessoa A diferença aqui para o comando de inserção que você já conhece é que os valores a serem inseridos estão representados por interrogações indicando que serão fornecidos posteriormente com o auxílio da linguagem de programação Java public void salvarPessoaPessoa pessoa String sql INSERT INTO pessoa nome cpf VALUES try PreparedStatement ps connectionprepareStatementsql pssetString1 pessoagetNome pssetString2 pessoagetCpf psexecuteUpdate catch SQLException e JOptionPaneshowMessageDialognull Erro ao inserir uma pessoa eprintStackTrace Nesse código o bloco try possui uma implementação um pouco diferente do que foi visto até o momento introduzindo o que é chamado de try com recurso Em vários exemplos nós realizamos o fechamento de um recurso dentro do bloco finally sempre verificando se o recurso é diferente de nulo para na sequência chamar o método close Ao utilizar o try com recurso não é mais preciso realizar esse fechamento no bloco finally já ficando implícito que o recurso deverá ser fechado ao término da execução do bloco try independentemente se foi executado o bloco try ou se caiu no bloco catch Configurando a Conexão com o Banco de Dados 415 Para isso as variáveis que devem ser fechadas ao final da execução devem ser declaradas dentro dos parênteses logo após a instrução try sendo possível declarar mais de uma variável desde que finalize cada uma das declarações com um ponto e vírgula Porém não é todo tipo de objeto que pode ser instanciado em um try com recurso sendo obrigatório que a classe referente ao objeto ou alguma de suas superclasses implemente a interface AutoClosable DEITELDEITEL 2014 Voltando ao código referente ao método para salvar uma pessoa no try com recurso é criada uma variável do tipo PreparedStatement a qual é instanciada a partir da chamada ao método prepareStatement do atributo connection para o qual é enviado por parâmetro a instrução SQL que deve ser executada O PreparedStatement é o objeto utilizado pela biblioteca de conexão com banco de dados do Java para enviar os comandos SQL que devem ser executados Porém o comando SQL ainda não está finalizado pois temos dois parênteses na definição do insert que devem ser substituídos pelos valores a serem inseridos o que é feito nas linhas seguintes a criação do PreparedStatement no qual neste exemplo chamamos o método setString do PreparedStatement para substituir a interrogação pela String enviada por parâmetro a qual estamos obtendo a partir do objeto Pessoa Por fim o comando SQL é executado ao chamarmos o método executeUpdate referente ao PreparedStatement momento em que será efetivada a operação no banco de dados DEITEL DEITEL 2014 Configurando a Conexão com o Banco de Dados 416 Assim como existe o método setString na classe PreparedStatement também existem método para os outros tipos primitivos do Java como setInt setFloat e setBoolean por exemplo Cada vez que é chamado um método para substituir uma interrogação do nosso comando SQL como por exemplo o método setString será realizada a substituição das interrogações na ordem que foram definidas no comando sendo sempre a primeira interrogação encontrada a que será substituída Atenção Com o método de inserção de dados finalizado o próximo passo é realizar a leitura dos dados salvos na tabela de pessoa Para isso a seguir é apresentada a implementação do método listarPessoas o qual irá retornar uma lista de objetos do tipo Pessoa Portanto inicialmente é criada lista de pessoas que deverá ser retornada a qual inicialmente será vazia e o comando SQL para realizar um SELECT e obter todas os registros armazenados na tabela Aqui também será utilizado o try com recurso porém duas variáveis serão criadas utilizando este conceito o PreparedStatement que já foi o explicado o seu conceito previamente e o ResultSet que consiste em uma interface com as definições dos métodos necessários para realizar a manipulação do resultado da consulta Simplificando uma implementação de ResultSet será uma classe iterável na qual serão armazenados todos os registros obtidos a partir da consulta realizada no banco de dados Para obter o ResultSet referente ao SELECT definido é chamado o método executeQuery referente ao PreparedStatement DEITEL DEITEL 2017 Configurando a Conexão com o Banco de Dados 417 public ListPessoa listarPessoas ListPessoa pessoas new ArrayListPessoa String sql SELECT FROM pessoa try PreparedStatement ps connection prepareStatementsql ResultSet resultSet psexecuteQuery while resultSetnext Pessoa pessoa new Pessoa pessoasetIdPessoaresultSetgetIntidpessoa pessoasetNomeresultSetgetStringnome pessoasetCpfresultSetgetStringcpf pessoasaddpessoa catch SQLException e JOptionPaneshowMessageDialognull Erro ao listar as pessoas eprintStackTrace return pessoas Com o ResultSet obtido será necessário converter os dados que estão em formato ResultSet para objetos do tipo Pessoa para que seja possível adicionar a lista que será retornada Dentro do bloco try foi implementado um comando de repetição while o que irá repetir o seu bloco de código enquanto o resultado da chamada do método next retornar verdadeiro Esse método next é responsável por apontar para a próxima linha de dados referente ao retorno do SELECT realizado retornando true caso existam valores a serem lidos naquela linha ou false quando não existem mais registros a serem lidos Configurando a Conexão com o Banco de Dados 418 Para cada repetição do bloco while é criada uma nova instância de Pessoa e são setados os dados de cada atributo referente à classe de acordo com os valores obtidos a partir do banco de dados Para isso o ResultSet possui métodos que tornam possível obter os valores a partir do índice da coluna onde deve ser passado um valor inteiro ou a partir do nome da coluna e esses métodos são específicos para cada tipo de dado existindo o getInt para inteiros e o getString para Strings por exemplo No caso para o setIdPessoa é obtido a partir do ResultSet o getInt enviando por parâmetro o nome da coluna da tabela que detém este valor no caso o idpessoa Ao final do comando de repetição while o objeto criado é adicionado a lista de pessoas que é retornada ao final da execução do método Dica Caso deseje realizar uma consulta mais específica no banco de dados como obter uma pessoa com base no código do idpessoa é possível criar uma consulta SQL específica para isso por exemplo SELECT FROM pessoa WHERE idpessoa sendo que a interrogação deve ser substituída pelo valor desejado antes de executar o executeQuery do PreparedStatement Configurando a Conexão com o Banco de Dados 419 A realização das operações de UPDATE e DELETE é muito semelhante à do processo de INSERT modificando apenas o comando SQL que será executado A seguir é apresentado o método responsável por realizar a atualização de um registro no banco de dados para o qual definimos o comando de UPDATE no qual a principal diferença é que além de definir os valores de nome e cpf também é preciso definir o valor do id da pessoa indicando qual o registro que deve ser atualizado Para executar o comando é chamado o método executeUpdate do PreparedStatement assim como é feito no comando de INSERT public void alterarPessoaPessoa pessoa String sql UPDATE pessoa SET nome cpf WHERE idpessoa try PreparedStatement ps connectionprepareStatementsql pssetString1 pessoagetNome pssetString2 pessoagetCpf pssetInt3 pessoagetIdPessoa psexecuteUpdate catch SQLException e JOptionPaneshowMessageDialognull Erro ao atualizar uma pessoa eprintStackTrace Como dito previamente para realizar a exclusão de dados a implementação também é muito semelhante à da operação de inserção A seguir é apresentado o código referente a essa implementação que também possui como principal diferença o comando SQL a ser executado assim como os parâmetros que são setados para o ResultSet a fim de atribuir os valores não definidos na String referente ao SQL 420 public void excluirPessoaint idpessoa String sql DELETE FROM pessoa WHERE idpessoa try PreparedStatement ps connectionprepareStatementsql pssetInt1 idpessoa psexecuteUpdate catch SQLException e JOptionPaneshowMessageDialognull Erro ao remover uma pessoa eprintStackTrace Neste caso o comando SQL espera a definição apenas do valor referente ao id da pessoa que deverá ser removida o qual informado ao PreparedStatement antes de realizar a chamada ao método executeUpdate o qual efetiva a operação de exclusão do registro no banco de dados Para reforçar os conceitos apresentados neste ebook sugiro que realize o mesmo processo de INSERT UPDATE DELETE e SELECT para a tabela de Telefone lembrando que aqui é necessário enviar o ID que é a chave estrangeira para Pessoa Além disso também sugiro realizar testes a partir da classe que implementa o método main com o objetivo de verificar as operações implementadas sendo de fato executadas no banco de dados Mão na massa Configurando a Conexão com o Banco de Dados Configurando a Conexão com o Banco de Dados 421 Finalizamos assim o aprendizado referente aos principais conceitos para realizar uma conexão com o banco de dados em Java realizando a conexão com o banco de dados MariaDB manipulando os dados realizando inserção alteração exclusão e consulta aos registros do banco de dados e por fim realizando o fechamento da conexão com o banco de dados Agora você sabe como realizar uma conexão entre o seu código Java e um Sistema Gerenciado de Banco de Dados permitindo que sejam desenvolvidas aplicações muito mais completas e com um acesso mais estruturado aos dados que não por intermédio de arquivos Para isso você aprendeu a inserir uma nova biblioteca ao Build Path do projeto Java para posteriormente realizar a conexão com o banco de dados assim como os processos de inserção atualização exclusão e obtenção de dados para ao final realizar o fechamento da conexão com o banco de dados Configurando a Conexão com o Banco de Dados 422 REFERÊNCIAS DEITEL Harvey M DEITEL Paul J Java como programar 10 ed São Paulo Pearson Education 2017 MARIADB Download MariaDB MariaDB Redwood City CA c2023 Disponível em httpsmariadbcomdownloadsconnectorsconnectorsdataaccess Acesso em 15 fev 2023 SENAI 425 Neste ebook você irá aperfeiçoar os seus conhecimentos referentes ao desenvolvimento de uma aplicação com o uso de banco de dados Previamente você aprendeu a realizar as operações básicas de manipulação de banco de dados porém sem uma estrutura de código bem definida que permita a reusabilidade e a fácil manutenção do código Portanto você aprenderá a realizar uma implementação com uma arquitetura de código bem definida que faça uso de uma estrutura de pacotes para os quais são definidas responsabilidades específicas dividindo o código em diversas etapas para simplificar o processo de codificação e manutenção deste código Também serão apresentados o uso de alguns padrões de projetos para otimizar o código Ebook Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 428 Chegou o momento de ter uma estrutura bem definida para o código desenvolvido dividindo a implementação do projeto em camadas específicas para as quais cada uma terá a sua responsabilidade bem definida Serão camadas de modelo controle e visão garantindo que cada camada execute apenas as suas atribuições solicitando auxílio das demais camadas quando necessário Durante esses estudos em momento algum foi abordado o conceito de organização de código seguindo arquiteturas e padrões de projeto com o objetivo de tornar o nosso código mais simples de dar manutenção assim também simplificando o processo de implementar novas funcionalidades Focamos até o momento em conhecer os principais conceitos de Programação Orientada a Objetos e em como realizar uma implementação aplicando esses conceitos Agora neste ebook esses conceitos serão abordados de forma que será apresentado um dos padrões de arquiteturas mais conhecidos além de alguns padrões de projetos principalmente para serem utilizados junto ao processo de conexão com o banco de dados O padrão de arquitetura que será apresentado é conhecido como MVC ModelViewController o qual deve o seu desenvolvimento iniciado em 1979 por Trygve Reenskaug O objetivo deste padrão consiste na definição de três camadas independentes as quais são chamadas de Modelo Visão e Controle Ao trabalhar com esSa separação é possível realizar uma redução no acoplamento que representa o quanto uma classe conhece a outra de forma que para termos um baixo acoplamento o objetivo é fazer com que uma classe primária tenha acesso a uma classe secundária apenas por intermédio de uma interface Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 429 Outro ponto que o padrão MVC auxilia é no aumento da coesão das classes do projeto o que significa que iremos buscar sempre estruturar classes que tenham um único e bem focado propósito Ao aplicar esses conceitos estaremos facilitando a manutenção do código e também realizando uma melhor reutilização de código FREEMAN FREEMAN 2009 Um dos principais benefícios que o padrão MVC traz é a possibilidade de isolar a lógica referente às regras de negócio da interface com o usuário Ao realizar essa separação estamos possibilitando que alterações no projeto possam ser feitas de forma que uma camada irá gerar pouco impacto na outra Imagine o contexto em que temos um projeto finalizado porém será preciso refazer a implementação referente à interface gráfica do projeto Se estivermos com as separações de responsabilidades dentro do nosso projeto essa alteração acontecerá apenas na camada de visão que representa a interface com o usuário não sendo necessário realizar nenhuma alteração nas outras camadas FREEMAN FREEMAN 2009 A figura a seguir apresenta um diagrama referente à arquitetura do modelo MVC à esquerda é apresentada a camada de visão que irá realizar a interação com o usuário Sempre que um evento for disparado nessa camada por exemplo um click de um botão deverá ser chamada a camada de controle a qual está no meio do diagrama para realizar o tratamento das informações e redirecionar para a camada de modelo aplicar a lógica de negócio O objetivo da camada de controle é ser apenas um intermediário entre a camada de visão e a de modelo e é nesse ponto que deve ser realizada por exemplo a conversão de objetos recebidos da camada de visão para objetos que serão compreendidos pela camada de modelo caso isso seja necessário para o contexto FREEMAN FREEMAN 2009 Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 430 Visão Controle Modelo Figura 31 Arquitetura do modelo MVC Fonte Do autor 2023 Já a camada de modelo é a responsável por toda a lógica de negócio o que inclui a aplicação das regras de negócio e validações caso existam e também a comunicação com o banco de dados Portanto geralmente esta é a camada com a maior quantidade de código por englobar um contexto maior Após o processamento realizado pela camada de modelo este retorna o resultado das operações realizadas para a camada de controle que tem como objetivo novamente tratar os dados caso necessário para devolver a informação para a camada de visão apresentar ao usuário FREEMAN FREEMAN 2009 Com esta explicação é possível visualizar que ao aplicar este padrão de arquitetura de código conseguimos realizar uma separação bem definida entre as camadas distribuindo as responsabilidades de forma muito clara e objetiva facilitando assim a manutenção do nosso código Em um projeto Java essa separação irá acontecer por meio de pacotes conforme mostra a figura a seguir Figura 32 Estrutura de pacotes para o padrão MVC Fonte Do autor 2023 Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 431 Na estrutura de pacotes apresentada temos o objetivo final da arquitetura do projeto a qual engloba os conceitos de MVC e também o dos padrões de projetos que iremos trabalhar Na camada model temos três pacotes vinculados um referente às entidades onde iremos armazenar as classes que irão representar os objetos a serem armazenados no banco de dados o pacote dao que será o responsável pela conexão e comunicação com o banco de dados utilizado o padrão de projeto de mesmo nome Nesse pacote temos uma divisão de api onde serão armazenadas as interfaces referentes a esse pacote e o impl onde ficarão as classes que irão implementar as interfaces da api Por fim temos o pacote service o qual será a porta de entrada para a camada de modelo sendo a responsável por aplicar todas as regras de negócio e também por chamar o pacote dao para recuperar ou persistir informações no banco de dados Referente ao pacote controller que será o intermediário entre a visão e o modelo temos apenas as divisões de pacotes entre a api e o impl conforme o que foi descrito previamente no pacote dao E para fechar o modelo de arquitetura temos o pacote view que será responsável por armazenar todas as classes que representam a interface gráfica da aplicação Vale ressaltar que cada camada pode receber a criação de quantos pacotes forem necessários para definir a sua implementação A estrutura aqui apresentada é uma das muitas maneiras de aplicar o padrão MVC ao projeto Para exemplificar as classes e interfaces de cada uma das camadas será apresentado um exemplo simples que irá armazenar apenas o código e o nome de um produto Com isso será possível demonstrar todas as etapas da arquitetura de projeto Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 432 O objetivo deste exemplo é apenas apresentar a estrutura de classes e os padrões de projetos utilizados para o desenvolvimento Por conta disso não serão apresentadas todas as implementações de métodos que apliquem lógicas já abordadas previamente Será dado foco na arquitetura do projeto e nas implementações que abordem conceitos ainda não apresentados neste material Atenção Vamos iniciar pela camada de modelo e dentro dela iniciar pelo pacote de entidade Nos exemplos referentes a banco de dados esse pacote já foi introduzido e ele é responsável por armazenar as classes que geralmente representam objetos que reproduzem as tabelas do banco de dados Neste caso foi criada apenas uma classe denominada Produto na qual foram definidos dois atributos privados um que é o id e outro o nome junto aos métodos de acesso getters e setters A seguir é apresentada a implementação dessa classe public class Produto private int id private String nome public int getId return id Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 433 public void setIdint id thisid id public String getNome return nome public void setNomeString nome thisnome nome O próximo ponto da arquitetura que iremos analisar é referente ao pacote dao o qual será responsável por realizar a conexão e também a comunicação com o banco de dados Vamos iniciar pela explicação referente à conexão com o banco de dados que será uma classe denominada Conexao criada dentro do pacote modeldaoimpl pois esta será uma classe e não uma interface Para realizar a implementação desta classe iremos realizar o uso de um padrão de projeto denominado Singleton Primeiramente vamos falar um pouco sobre o que é um padrão de projeto Esse conceito que em inglês é chamado de Design Patterns apresenta soluções para problemas que são recorrentes no desenvolvimento de aplicações orientadas a objetos sendo sempre representados por um nome problema e solução Existem diversos padrões de projetos existentes para problemas rotineiros no desenvolvimento orientado a objetos porém neste ebook você conhecerá dois deles o Singleton e o Data Access Object DAO FREEMAN FREEMAN 2009 Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 434 Agora que você conhece a ideia de um padrão de projeto vamos voltar para a classe de conexão a qual irá fazer uso do padrão singleton Este tem como objetivo garantir que uma classe tenha apenas uma instância de si e essa classe será a responsável gerenciar a sua instância sendo necessário definir também um ponto de acesso global para esta instância Para isso é preciso realizar o uso do modificador static e também dos modificadores de acesso Por conta disso a nossa classe de conexão encaixa perfeitamente para realizar o uso deste padrão pois o meu projeto precisa apenas de uma instância referente à classe Connection para realizar a comunicação com o banco de dados a qual deve ser acessada por diferentes classes que irão realizar o processo de manipulação de dados FREEMAN FREEMAN 2009 A seguir é apresentada a implementação da classe Conexao realizando o uso do padrão de projeto Singleton Para aplicar o padrão foi definido um atributo estático denominado conexaoSingleton o qual será uma instância da própria classe Conexao Além disso também foi definido um método estático denominado getInstance o qual irá retornar uma instância de conexão Nesse método a implementação verifica se já foi instanciado um objeto e armazenado no atributo conexaoSingleton caso não tenha sido instanciado ainda irá realizar a instanciação para na sequência retornar a instância referente à conexão Esse método getInstance será o acesso global à instância da classe Conexão e todo acesso a essa classe deverá ser realizado exclusivamente por esse método Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 435 public class Conexao private static Conexao conexaoSingleton private Connection connection private Conexao try ClassforNameorgmariadbjdbcDriver connection DriverManager getConnectionjdbcmariadblocalhost3306projetofinal root 123456 catch SQLException e eprintStackTrace catch ClassNotFoundException e eprintStackTrace public static Conexao getInstance if conexaoSingleton null conexaoSingleton new Conexao return conexaoSingleton public Connection getConnection return connection Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 436 Além de garantir um acesso global à instância referente à classe outro requisito do padrão de projeto era que existe apenas uma instância referente a essa classe Para isso observe que o construtor da classe possui o modificador de acesso private garantindo que apenas a própria classe poderá gerar uma instância dela o que é realizado na implementação do método getInstance Esse construtor realiza o processo de conexão com o banco de dados e armazena essa conexão no atributo denominado connection o qual pode ser obtido a partir do seu método de acesso getConnection Veja que essa classe de Conexão faz uso de atributos e métodos estáticos e não estáticos Neste caso tudo o que é estático diz respeito ao padrão de projeto Singleton pois é a instância da própria classe que é privada e o método getInstance que é público O atributo e método não estáticos poderão ser acessados apenas após se obter a instância da classe por exemplo ConexaogetInstancegetConnection Atenção Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 437 Com a classe responsável pela conexão com o banco de dados finalizada o próximo passo consiste em realizar a implementação das classes que irão realizar a comunicação com o banco de dados Para isso será apresentado aqui um outro padrão de projeto denominado Data Access Object DAO Esse é um padrão de projeto desenvolvido com o objetivo de isolar a parte de acesso a dados da parte de lógicas de negócio da aplicação e junto a isso ele trabalha com o conceito de interfaces permitindo uma maior abstração Ao utilizar esse padrão de projetos o processo de realizar uma alteração de sistema de gerenciamento de banco de dados na aplicação terá um menor impacto por exemplo Pense no cenário em que a sua aplicação utiliza o banco de dados MariaDB porém foi decidido realizar a alteração para o PostgreSQL Com o padrão de projeto DAO será possível resolver isso apenas criando uma nova classe de implementação com foco nesse banco de dados sem precisar modificar as outras camadas que acessam o padrão de projeto por intermédio de suas interfaces FREEMAN FREEMAN 2009 Na literatura é possível encontrar diversos formatos de implementação para o padrão de projeto DAO porém todos mantêm os princípios básicos da sua definição os quais foram descritos anteriormente Para este exemplo vamos utilizar a estrutura apresentada na figura a seguir na qual teremos uma interface denominada DAO que fará uso dos tipos genéricos do Java e irá definir a assinatura dos métodos para as principais operações de banco de dados que consistem em inserção alteração exclusão e listagem Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 438 Além dessa interface teremos uma nova camada de interfaces DAO específicas para cada entidade e essas interfaces irão herdar da interface genérica DAO Por fim teremos as implementações das interfaces quando serão criadas as classes que de fato irão implementar os contratos definidos pelas interfaces Figura 33 Diagrama de classes da camada DAO Fonte Do autor 2023 Vamos começar a nossa análise pela interface genérica DAO apresentada a seguir Observe que esta implementação traz um novo conceito que são os tipos genéricos no Java o qual é representado pelo T ao lado do nome da interface De acordo com Deitel e Deitel 2017 a utilização de tipos genéricos junto a classes e métodos nos dá a possibilidade de definir uma estrutura de código com a capacidade de se adaptar a diversos tipos de dados diferentes permitindonos assim realizar uma maior abstração e reutilização de código A ideia aqui é que quando a nossa interface ProdutoDAO herdar da interface DAO devese substituir esse T por Produto indicando que o tipo de dado que deverá ser atendido para aquele contexto específica ou seja tratase de substituir tudo o que estiver definido com o tipo genérico T na classe por objetos do tipo Produto Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 439 Isso nos permite reaproveitar essa interface DAO para todas as interfaces específicas das entidades que irão surgir no decorrer do projeto public interface DAOT public void salvarT t public void excluirT t public ListT listarTodos Essa interface define três métodos principais que deverão ser implementadas por todas as interfaces DAO que desejarem realizar as instruções básicas de banco de dados Esses métodos são o método salvar que irá receber por parâmetro um objeto do tipo especificado no momento da implementação ou herança da interface um método excluir que também receberá por parâmetro um objeto de acordo com o tipo definido e um método listarTodos o qual não recebe um parâmetro mas retorna uma lista de acordo com o tipo utilizado para definir a interface Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 440 Após a definição desta interface será preciso definir a segunda interface da estrutura a qual é uma implementação não genérica já direcionada para o tipo de dado que irá persistir A seguir é apresentada a estrutura da interface ProdutoDAO a qual será responsável por realizar a comunicação com o banco de dados para manipular os dados da tabela de produto Essa interface irá herdar da interface DAO enviando para a substituição do tipo genérico a informação de que deverá ser utilizada a entidade de Produto Ao herdar da interface DAO já estamos definindo que essa interface possui os métodos definidos no DAO agora com seu tipo específico porém caso seja necessário implementar novos tipos de consultas ao banco de dados como uma buscar por id ou uma busca por nome do produto é nessa interface que as assinaturas dos métodos devem ser definidas public interface ProdutoDAO extends DAOProduto public Produto buscarPorIdint id Com essas duas interfaces fechamos o nosso pacote de api referente à camada DAO Agora é preciso realizar a implementação da classe a qual será chamada aqui de ProdutoDAOImpl e que receberá a implementação dos métodos para conectar ao banco de dados e realizar as manipulações das informações A seguir é apresentada uma parte dessa implementação demonstrando o método salvar Ao implementar a interface ProdutoDAO somos obrigados a implementar os métodos definidos em ProdutoDAO e em DAO pois uma herda da outra Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 441 public class ProdutoDAOImpl implements ProdutoDAO private static final String INSERT INSERT INTO produto nome values private static final String UPDATE UPDATE produto SET nome WHERE idproduto private static final String EXCLUIR DELETE FROM produto WHERE idproduto private static final String LISTARTODOS SELECT FROM produto Override public void salvarProduto produto if produto null produtogetId 0 thissalvarProdutoproduto else thisalterarProdutoproduto private void salvarProdutoProduto produto try PreparedStatement ps ConexaogetInstance getConnectionprepareStatementINSERT pssetString1 produtogetNome psexecuteUpdate catch SQLException e eprintStackTrace Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 442 Observe que o método sobrescrito salvar definido na interface DAO substitui o parâmetro T t definido na interface por Produto produto pois ao herdar essa interface em ProdutoDAO definimos que este seria o tipo de dado utilizado neste contexto Quanto à implementação dos métodos segue o mesmo padrão do que foi apresentado no ebook anterior com a única diferença sendo o uso da classe de conexão com o Singleton No bloco try ao criar o PreparedStatement é feita a chamada ConexaogetInstancegetConnection prepareStatementINSERT o que indica que estamos utilizando a instância única de conexão criada na própria classe por intermédio do acesso global disponibilizado a essa instância private void alterarProdutoProduto produto try PreparedStatement ps ConexaogetInstance getConnectionprepareStatementUPDATE pssetString1 produtogetNome pssetInt2 produtogetId psexecuteUpdate catch SQLException e eprintStackTrace Override public void excluirProduto produto try PreparedStatement ps ConexaogetInstance getConnectionprepareStatementEXCLUIR pssetInt1 produtogetId psexecuteUpdate catch SQLException e eprintStackTrace Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 443 Essa é a estrutura para implementar o padrão DAO para o acesso ao banco de dados para cada nova classe de entidade a ser definida uma nova interface e uma nova classe na camada DAO devem ser implementadas garantindo a manutenção do padrão definido O último pacote faltante na estrutura da camada de modelo é o service também dividido em api e impl e que tem como objetivo implementar as lógicas de negócio e se necessário chamar as interfaces do DAO para realizar a manipulação dos dados O princípio da definição de uma api e uma classe que implemente a interface da api segue a mesma ideia do apresentado no padrão DAO garantir um isolamento maior de forma que se for preciso criar uma nova versão referente à implementação das lógicas de negócio é possível realizar isso de forma simples ao implementar as interfaces já definidas A seguir é apresentada a implementação da interface public interface ProdutoService public void salvarProduto produto public void excluirProduto produto public ListProduto listarTodos Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 444 Neste exemplo esta interface possui os métodos que irão tratar os dados recebidos e posteriormente chamar as interfaces DAO para persistência porém não podem existir métodos que não representem um acesso ao banco de dados sendo estes referentes à lógica de negócio caso necessário Após definir a interface será preciso criar a classe que irá implementar esta interface a qual é apresentada a seguir public class ProdutoServiceImpl implements ProdutoService private ProdutoDAO produtoDAO public ProdutoServiceImpl produtoDAO new ProdutoDAOImpl Override public void salvarProduto produto Lógicas de negócio e validação thisprodutoDAOsalvarproduto Override public void excluirProduto produto TODO Autogenerated method stub Override public ListProduto listarTodos TODO Autogenerated method stub return null Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 445 Esta é a primeira classe que de fato fará uso de outra interface definida para a comunicação entre as camadas e observe que a definição do atributo é com base na interface e não na classe de implementação sendo que a classe é utilizada na instanciação do atributo dentro do construtor da classe É apresentado aqui também o exemplo de um método o salvar no qual temos na primeira linha um comentário indicando que caso fossem realizados tratamentos de dados ou validações estes aconteceriam nesse ponto para posteriormente chamar o método salvar da interface ProdutoDAO Dessa forma encerramos a implementação da camada de modelo no padrão de arquitetura MVC É possível dizer que esta é a camada com mais implementação sendo o ponto onde toda a lógica de negócio é realizada assim como as persistências em banco de dados A camada de controle é mais simples pois o principal objetivo é ser um intermediário entre a camada de visão e a camada de modelo por isso temos apenas uma estrutura com a api para a definição das interfaces e o impl para a definição das classes A definição da interface segue o mesmo padrão dos demonstrados anteriormente sendo necessário criar uma interface para cada possibilidade de comunicação entre a visão e o modelo Neste exemplo criaremos apenas para o produto mas caso existisse um cadastro de clientes também seria necessário criar uma nova interface para essa comunicação 446 Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados Não será apresentada aqui a codificação da interface pois apenas são realizadas as definições das assinaturas dos métodos Portanto a seguir é apresentada a definição da classe que realiza a implementação da interface public class ProdutoControllerImpl implements ProdutoController private ProdutoService produtoService public ProdutoControllerImpl thisprodutoService new ProdutoServiceImpl Override public void salvarProduto produto thisprodutoServicesalvarproduto Override public void excluirint id Produto produto new Produto produtosetIdid thisprodutoServiceexcluirproduto Override public ListProduto listarTodos return thislistarTodos Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 447 Neste cenário a classe implementa a interface ProdutoController e assim como vimos anteriormente utilizamos a interface para definir o atributo ProdutoService e no construtor utilizamos a classe para instanciar esse atributo Como o controller é só um intermediário a sua implementação é simples sendo realizados o tratamento e conversão de dados caso necessário como é possível verificar na definição do método excluir o qual recebe um parâmetro do tipo inteiro mas precisa enviar um parâmetro do tipo Produto para o service nesse caso é feita a conversão para posteriormente chamar o service Outros casos é quando recebemos informações do service mas não precisamos enviar tudo para a interface gráfica Então é possível converter o retorno do service para um novo tipo de dado apenas com as informações necessárias e isso acontece aqui na etapa de controle E a última camada a ser demonstrada é a camada de visão sobre a qual você já teve uma explicação bem ampla no momento em que falamos sobre interfaces gráficas A única diferença aqui é que será preciso definir um atributo para a interface de controle e que ao se clicar em um botão com ações de regras de negócio esse botão deverá chamar o método do controle para que este chame o respectivo service da camada de modelo Não será apresentado aqui o código da interface gráfica pois nada de diferente dos códigos anteriores seria apresentado apenas é preciso lembrar de definir e instanciar o atributo para permitir a chamada aos métodos da classe de controle Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 448 Finalizamos assim as explicações sobre o padrão de arquitetura MVC e também sobre os padrões de projeto Singleton e DAO É importante ressaltar que o uso desses padrões traz uma melhor qualidade ao nosso código com o grande objetivo de facilitar a manutenção e reutilização do código Porém não podemos deixar de falar do fato que esses padrões aumentam bastante a quantidade de codificação necessária trazendo um maior trabalho inicial porém simplificando o processo para o futuro Quando trabalhamos com esses padrões muitas vezes temos a sensação de que estamos repetindo muitos códigos porém estamos apenas estruturando o nosso projeto para ter o menor acoplamento possível Agora você já sabe como desenvolver um projeto utilizando os principais padrões adotados no desenvolvimento de software desde o padrão de arquitetura MVC até os padrões de projeto singleton e Data Access Object DAO Com isso será possível desenvolver códigos bem organizados e que permitam uma manutenção e reusabilidade de código melhor por estarmos garantindo um menor acoplamento entre as classes Definindo uma Arquitetura de Código para a Conexão com o Banco de Bados 449 REFERÊNCIAS DEITEL Harvey M DEITEL Paul J Java como programar 10 ed São Paulo Pearson Education 2017 FREEMAN Eric FREEMAN Elisabeth Use a cabeça Padrões de projetos 2 ed Rio de Janeiro Alta Books 2009 SENAI 451 Videoflix Agora você poderá acompanhar na prática o desenvolvimento de uma aplicação que irá realizar o uso da conexão de banco de dados bem como dos padrões de arquitetura de código e padrões de projetos apresentados nos ebooks deste bloco Iremos desenvolver aqui uma aplicação de exemplo a qual possibilitará a implementação de todos os conceitos abordados até o momento httpsplayervimeocom video828452986h43ebfd86b2 Apresentando e iniciando o projeto httpsplayervimeocom video823803960hb0326c59e7 Criando a classe de modelo e iniciando a implementação do padrão DAO httpsplayervimeocom video823803994h22e4c57b8b Continuando a implementação da estrutura DAO 452 httpsplayervimeocom video828453051h17b955d4f0 Finalizando a estrutura DAO e definindo o service httpsplayervimeocom video828453075hfd5afea412 httpsplayervimeocom video828453075hfd5afea412 Finalizando a definição do service e implementando o controller Implementação da interface gráfica 453 Após aprender a implementar uma conexão com o banco de dados e a definir uma arquitetura de código para manter o seu projeto mais organizado vamos falar um pouco sobre os principais assuntos que foram vistos aqui que incluem a importância do uso de uma arquitetura de código e o funcionamento do padrão de projeto DAO Infocast 455 Por que é tão importante definir uma arquitetura de código Olá Você sabe por que é tão importante definir uma arquitetura de código Ao fazer uso de um padrão de arquitetura para o nosso projeto estaremos trazendo vantagens e desvantagens para o nosso desenvolvimento assim como muitas coisas que desenvolvemos ao produzir o nosso código Nós falamos aqui neste material sobre o padrão MVC que significa model view e controller porém é importante destacar que existem outros diversos tipos de arquiteturas de código e conforme você for conhecendo todos estes padrões você verá que para cada contexto você irá identificar qual o melhor padrão que irá se adequar Voltando para o padrão MVC vamos falar um pouco mais sobre as vantagens e desvantagens do uso desse padrão de arquitetura Como vantagens nós temos a separação do sistema em camadas muito bem definidas cada um com sua responsabilidade e com isso a manutenção da nossa aplicação ficará mais simples Outro ponto muito vantajoso é o reaproveitamento de código que por estar separado em camadas eu posso reaproveitar as camadas mais baixas como o caso do modelo para diferentes aplicações assim como eu também tenho a garantia que ao realizar alterações na camada de visão eu não estarei afetando em momento algum a camada de modelo por exemplo E para finalizar as principais vantagens do uso desse padrão de arquitetura é que praticamente todo desenvolvedor conhece esse padrão de forma que torna fácil o entendimento do projeto para novos desenvolvedores que entrarem para a equipe Vamos agora analisar algumas desvantagens referente ao uso do padrão MVC Obviamente se você estiver desenvolvendo uma aplicação extremamente simples e com poucas classes a aplicação desse padrão de arquitetura pode tornar a aplicação muito mais complexa de forma desnecessária Portanto é muito importante avaliar em que momento é válido aplicar um padrão desses 456 Além disso por mais que simplifique a manutenção do código torna o desenvolvimento um pouco mais massivo pois são diversas camadas para codificar com o objetivo de adicionar uma nova funcionalidade a aplicação porém ao desenvolver o código dentro de um padrão com qualidade toda modificação a ser feita nesta aplicação será simples e prática Muitas vezes irá surgir a dúvida se vale aplicar um padrão de arquitetura ou não ao projeto ou principalmente qual padrão de arquitetura aplicar Neste caso minha sugestão é que você analise todo o contexto da aplicação que com certeza isso irá auxiliálo escolher a melhor arquitetura de código para o seu projeto Até a próxima 457 Explicando o padrão DAO Olá Você aprendeu que o padrão DAO que significa Data Access Object é um padrão de projeto que define uma estrutura de código para acesso ao banco de dados O objetivo aqui é reforçar este conceito desde a conexão até a estrutura de classes Ao pesquisar sobre o padrão DAO com certeza você encontrará diversas implementações diferentes para ele porém todos irão seguir o mesmo princípio a definição de classes para manipulação de banco de dados sendo o seu desenvolvimento totalmente voltado para interfaces a fim de garantir um baixo acoplamento das classes Porém a implementação mais clássica consiste em termos uma interface DAO para cada entidade existente na nossa aplicação lembrando que as entidades possuem como objetivo representar as tabelas do banco de dados em forma de objetos Portanto se em um projeto você possui uma entidade Pessoa será preciso que você tenha uma interface PessoaDAO Se você tiver uma entidade endereço será preciso ter uma interface EnderecoDAO e assim por diante Essa interface deverá definir todas as assinaturas de métodos que a classe que for realizar esta comunicação com o banco de dados deve implementar Portanto para cada entidade você terá uma interface e uma classe DAO correspondente Mas por que preciso fazer isso Não posso ter apenas a classe e pronto A resposta é não pois ao desenvolver para uma interface estamos deixando bem explícito o contrato que todas as classes que quiserem corresponder àquela interface devem implementar Isso é muito importante para o cenário de uma troca de sistema gerenciador de banco de dados da aplicação pois imagine que será preciso criar novas consultas que atendam a linguagem SQL do novo gerenciador de banco de dados Nesse caso será simplesmente necessário criar uma nova classe de conexão para aquele banco de dados e uma nova classe de implementação da interface DAO para aquele novo banco de dados podendo manter a classe referente à implementação do outro sistema gerenciador de banco de dados rodando enquanto a implementação da nova classe é realizada e enquanto a migração do banco de dados não é efetivada 458 Este foi apenas um exemplo de uma das principais vantagens do uso do padrão de projeto DAO Ao pesquisar mais sobre o assunto você verá que é muito comum esse padrão ser utilizado junto a outros como é o caso do Singleton que você já conhece e do Factory que consiste em um padrão de projeto para representar uma fábrica de criação de instâncias Deixo como sugestão uma pesquisa sobre o padrão Factory para compreender como é possível integrálo com o padrão DAO Bons estudos 459 Gostou do assunto Você pode aprender ainda mais sobre classes abstratas interfaces polimorfismo e tratamento de exceções buscando novos horizontes sites links aplicativos e livros Saiba mais lendo e conferindo os materiais a seguir Quero saber Conceito de conexão com o banco de dados e tipos genéricos Padrões de arquitetura e padrões de projetos Deitel e Deitel 2017 estão entre os autores mais conhecidos quando falamos em Programação Java e Programação Orientada a Objetos O seu livro traz excelentes explicações sobre o conceito de conexão com o banco de dados e tipos genéricos Para auxiliar no seu aprendizado seguem os assuntos e suas respectivas páginas para estudo Capítulo 20 Classes e métodos genéricos páginas 655 a 675 Capítulo 24 Acesso a banco de dados com JDBC páginas 813 a 856 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 Referente aos padrões de arquitetura e padrões de projetos os autores Freeman e Freeman 2019 escreveram um livro que aborda a maioria dos padrões já existentes Portanto fica a sugestão de realizar a leitura completa desse livro que o auxiliará na compreensão de todos os padrões de projeto existentes os quais sempre realizam forte uso dos conceitos de Programação Orientada a Objetos FREEMAN Eric FREEMAN Elisabeth Use a cabeça Padrões de projetos 2 ed Rio de Janeiro Alta Books 2009 No text found in the image 461 Agora é o momento de conferir um resumo dos principais conhecimentos aprendidos ao longo de seus estudos até aqui Este resumo foi elaborado em formato de checklist para que você assinale os itens que considera já ter desenvolvido e caso sinta a necessidade retome os estudos Aproveite mais esta oportunidade de construção de saberes Resumindo Apliquei princípios de programação orientada a objetos Reconheci processo de desenvolvimento orientado a objeto Modelei linguagem de programação orientada a objetos para resolução de problemas de pequena complexidade Utilizei técnicas na integração de sistemas orientadas a objetos e banco de dados Interpretei programação orientada a objetos para documentação técnica 463 Parabéns Você chegou ao final destes estudos A seguir explore o infográfico que preparamos para você Ele traz os principais conceitos e definições que foram abordadas no decorrer de toda essa importante jornada de construção de conhecimentos Esse é um breve resumo para você consultar sempre que sentir necessidade PARA CONCLUIR Java Swing Classes que implementam o conceito de interface gráfica dentro da linguagem de programação Java Arquivos de Texto Arquivos criados a partir da linguagem de programação Java que possuem a capacidade de armazenar apenas valores textuais Serializable Interface Java que permite armazenar um objeto inteiro em um arquivo binário e posteriormente recuperar esse objeto JDBC Conectores desenvolvidos para a linguagem de programação Java que permitem realizar a partir do código a conexão e manipulação de valores no banco de dados Arquivos Binários Arquivos criados a partir da linguagem de programação Java que podem armazenar todos os tipos primários de dados inclusive um objeto inteiro JDBC Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Trabalhando com arquivos e acesso a banco de dados 465 PreparedStatement Interface responsável por executar as operações da aplicação com o banco de dados ResultSet Interface que recupera informações do banco de dados sendo preciso acessar os dados coluna por coluna para conseguir converter para um objeto Padrão de Arquitetura Definição de uma estrutura de pacotes com regras de acesso entre elas garantindo que cada camada tenha a sua responsabilidade bem definida Padrão de Projeto Soluções para resoluções de problemas recorrentes no desenvolvimento de algoritmos Padrão DAO Padrão de projeto que padroniza o acesso da aplicação ao banco de dados Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Trabalhando com arquivos e acesso a banco de dados 466 PreparedStatement Interface responsável por executar as operações da aplicação com o banco de dados ResultSet Interface que recupera informações do banco de dados sendo preciso acessar os dados coluna por coluna para conseguir converter para um objeto Padrão de Arquitetura Definição de uma estrutura de pacotes com regras de acesso entre elas garantindo que cada camada tenha a sua responsabilidade bem definida Padrão de Projeto Soluções para resoluções de problemas recorrentes no desenvolvimento de algoritmos Padrão DAO Padrão de projeto que padroniza o acesso da aplicação ao banco de dados Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Trabalhando com arquivos e acesso a banco de dados Padrão Singleton Padrão de projeto que define a existência de uma única instância de uma classe gerenciada pela própria classe a qual deve disponibilizar um acesso global a essa instância Tipos Genéricos Possibilidade de criar uma classe ou interface com o uso de objetos genéricos que serão substituídos posteriormente com o objeto informado junto à implementação ou herança Confira agora um resumo dos principais conceitos abordados e retome sempre que sentir necessidade Trabalhando com arquivos e acesso a banco de dados 467 469 Olá Agora que você chegou ao final deste estudo sobre Programação Orientada a Objetos você já possui os conhecimentos necessários para realizar o desenvolvimento de aplicações orientadas a objetos Durante os seus estudos você aprendeu sobre o conceito e história do paradigma de programação orientada a objetos passando por seus principais conceitos iniciando pelos principais conceitos como classes objetos atributos e métodos os quais são fundamentais para qualquer desenvolvimento Na sequência você aprendeu sobre os principais pilares da orientação a objetos que consistem no Encapsulamento Herança Abstração e Polimorfismo Para cada um desses pilares diversos conceitos foram abordados como construtores modificadores de acesso sobrecarga de métodos sobrescrita de métodos interfaces e classes abstratas Nós nos aprofundamos bastante também no conceito de polimorfismo o qual faz uso de praticamente todos os outros pilares da orientação a objetos Para colocar todos esses conceitos em prática você aprendeu a fazer o uso de Interfaces Gráficas de forma que foi possível criar softwares completos utilizando a linguagem de programação Java Junto a isso também foi abordado o conceito de conexão com banco de dados que nos permitiu armazenar os registros informados pelo usuário para posterior recuperação Para finalizar você aprendeu sobre uma das principais arquiteturas de softwares orientados a objetos o MVC junto ao qual foram introduzidos alguns conceitos de padrões de projetos como o DAO para padronizar o acesso ao banco de dados e o Singleton para criar instâncias únicas de um objeto para a aplicação Continue sempre se aperfeiçoando Bons estudos e até a próxima FECHAMENTO 470 REFERÊNCIAS ARAÚJO E C de Orientação a Objetos com Java Simples fácil e eficiente Florianópolis Visual Books 2008 DEITEL H M DEITEL P J Java como programar 10 ed São Paulo Pearson Education 2016 FREEMAN Eric FREEMAN Elisabeth Use a cabeça padrões de projetos 2 ed Rio de Janeiro Alta Books 2009 MANZANO J A N G COSTA JUNIOR R A da Java 8 Programação de computadores Guia prático de introdução orientação e desenvolvimento 1 ed São Paulo Érica 2014 MARTIN R C Código limpo habilidades práticas do Agile Software Rio de Janeiro Alta Books 2009 SANTOS R Introdução à programação orientada a objetos usando Java Rio de Janeiro Campus 2003