Baixe o app para aproveitar ainda mais
Prévia do material em texto
Program ação Orientada a Objetos e Estrutura de Dados Fábio da Silva Souza Rolfi Cintas Gomes Luz Organizador: Adilson da Silva Fábio da Silva Souza Rolfi Cintas Gomes Luz Organizador: Adilson da Silva GRUPO SER EDUCACIONAL PROGRAMAÇÃO ORIENTADA A OBJETOS E ESTRUTURA DE DADOS PROGRAMAÇÃO ORIENTADA A OBJETOS E ESTRUTURA DE DADOS SER_Capa e Contra-Programação Orientada a Objetos e Estrutura de Dados.indd 1,3SER_Capa e Contra-Programação Orientada a Objetos e Estrutura de Dados.indd 1,3 27/01/2023 12:10:3327/01/2023 12:10:33 Programação Orientada a Objetos e Estrutura de Dados © by Ser Educacional Todos os direitos reservados. Nenhuma parte desta publicação poderá ser reproduzida ou transmitida de qualquer modo ou por qualquer outro meio, eletrônico ou mecânico, incluindo fotocópia, gravação ou qualquer outro tipo de sistema de armazenamento e transmissão de informação, sem prévia autorização, por escrito, do Grupo Ser Educacional. Imagens e Ícones: ©Shutterstock, ©Freepik, ©Unsplash. Diretor de EAD: Enzo Moreira. Gerente de design instrucional: Paulo Kazuo Kato. Coordenadora de projetos EAD: Jennifer dos Santos Sousa. Equipe de Designers Instrucionais: Gabriela Falcão; José Carlos Mello; Lara Salviano; Leide Rúbia; Márcia Gouveia; Mariana Fernandes; Mônica Oliveira e Talita Bruto. Equipe de Revisores: Camila Taís da Silva; Isis de Paula Oliveira; José Felipe Soares; Nomager Fabiolo Nunes. Equipe de Designers gráficos: Bruna Helena Ferreira; Danielle Almeida; Jonas Fragoso; Lucas Amaral, Sabrina Guimarães, Sérgio Ramos e Rafael Carvalho. Ilustrador: João Henrique Martins. SOUZA, Fábio da Silva. / LUZ, Rolfi Cintas Gomes. Organizador: SILVA, Adilson. Programação Orientada a Objetos e Estrutura de Dados: Recife: Digital Pages e Grupo Ser Educacional - 2022. 187 p.: pdf ISBN: 978-65-81507-81-7 1. Programação 2. Sistemas 3. Objetos. Grupo Ser Educacional Rua Treze de Maio, 254 - Santo Amaro CEP: 50100-160, Recife - PE PABX: (81) 3413-4611 E-mail: sereducacional@sereducacional.com Iconografia Estes ícones irão aparecer ao longo de sua leitura: ACESSE Links que complementam o contéudo. OBJETIVO Descrição do conteúdo abordado. IMPORTANTE Informações importantes que merecem atenção. OBSERVAÇÃO Nota sobre uma informação. PALAVRAS DO PROFESSOR/AUTOR Nota pessoal e particular do autor. PODCAST Recomendação de podcasts. REFLITA Convite a reflexão sobre um determinado texto. RESUMINDO Um resumo sobre o que foi visto no conteúdo. SAIBA MAIS Informações extras sobre o conteúdo. SINTETIZANDO Uma síntese sobre o conteúdo estudado. VOCÊ SABIA? Informações complementares. ASSISTA Recomendação de vídeos e videoaulas. ATENÇÃO Informações importantes que merecem maior atenção. CURIOSIDADES Informações interessantes e relevantes. CONTEXTUALIZANDO Contextualização sobre o tema abordado. DEFINIÇÃO Definição sobre o tema abordado. DICA Dicas interessantes sobre o tema abordado. EXEMPLIFICANDO Exemplos e explicações para melhor absorção do tema. EXEMPLO Exemplos sobre o tema abordado. FIQUE DE OLHO Informações que merecem relevância. SUMÁRIO UNIDADE 1 Objetivos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 11 Introdução � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 12 Introdução à orientação a objetos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 13 Objetivos e vantagens da poo � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 14 Modelos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �14 Bibliotecas de operações � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �16 Tipos de Dados Primitivos (Representação) � � � � � � � � � � � � � � � � � � � � � � � �16 A classe String � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 20 Variáveis � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 23 Operadores lógicos relacionais e comparadores em java � � � � � � � � � 23 Executando o java � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 30 Inserido Classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �33 Operadores lógicos e negação em java � � � � � � � � � � � � � � � � � � � � � � � � � � 34 Estrutura de decisão em java � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 38 Estrutura de repetição em java � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �42 Terminologia da programação orientada a objetos � � � � � � � � � � � � � 44 Instanciando um objeto � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �47 UNIDADE 2 Objetivos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 51 Introdução � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 52 Classes, pacotes, objetos, atributos, métodos, construtores, palavra-chave this e sobrecarga � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 53 Classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 53 Pacotes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 55 Objetos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 57 Atributos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 58 Métodos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 60 Construtores � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 63 Palavra-chave This � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 67 Sobrecarga � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 68 Instanciação e referências de objetos � � � � � � � � � � � � � � � � � � � � � � � � � � �70 Envio de mensagens � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 72 Ciclo de vida de um objeto � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 73 Abstração e encapsulamento � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �76 Abstração � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 76 Encapsulamento � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 78 Estruturas compostas homogêneas � � � � � � � � � � � � � � � � � � � � � � � � � � � � 83 Vetor � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 83 Vetor orientado a objetos � � � � � � � � � � � � � � � � � � � � � � � � � � � 89 Matriz � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 92 Estruturas comportamentais heterogêneas � � � � � � � � � � � � � � � � � � � 94 Instanciação � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 94 Atribuição � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 95 Tipos abstratos de dados � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 97 Tipos de armazenamento � � � � � � � � � � � � � � � � � �� � � � � � � � � 98 Coleções � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 99 UNIDADE 3 Objetivos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 103 Introdução � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 104 Herança � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �105 Utilização de herança � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 105 Palavra-chave super � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 109 Criação e uso de hierarquia de classes � � � � � � � � � � � � � � � � � � � � � � � � � � 111 Classes e subclasses � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 113 Classes abstratas e interfaces � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 113 Classes abstratas � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �114 Interfaces � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 117 Relacionamento entre classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 121 Associação � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 121 Composição � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 127 Agregação � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �133 Polimorfismo � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 134 Introdução ao polimorfismo � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 134 Polimorfismo na prática � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �135 Ligação dinâmica (dynamic binding) � � � � � � � � � � � � � � � � � � � � � � � � � � � 138 Tratamento de exeções � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 140 Evitando e capturando exceções � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 140 UNIDADE 4 Objetivos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 143 Introdução � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 144 Algoritmos recursivos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �145 Técnicas de ordenação � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �146 Método Bubble Sort � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 147 Método Insertion Sort � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 149 Método Selection Sort � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 150 Estruturas Lineares � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 151 Listas � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 151 Lista Estática � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 152 Lista Ligada � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 152 Lista Duplamente Ligada � � � � � � � � � � � � � � � � � � � � � � � � � � � 156 Código Lista Duplamente Ligada � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 158 Lista Collection � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 158 Pilhas � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �160 Código da Pilha de Alocação Estática � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 162 Filas – implementações � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 163 Collection Class Queue – Fila dinâmica � � � � � � � � � � � � � � � � � � � � � � � � � � � � 168 Árvores e suas generalizações � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �170 Terminologia da estrutura Árvore � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 174 Nó � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 174 Node – Implementação dinâmica � � � � � � � � � � � � � � � � � � 176 Vetor – Implementação sequencial � � � � � � � � � � � � � � � � � 177 Árvores binárias � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 178 Tipos de Árvores binárias � � � � � � � � � � � � � � � � � � � � � � � � � � � 179 Árvores de busca � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 182 Árvore binária e de busca � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 183 Referências � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 185 Apresentação Olá, aluno(a). Seja bem-vindo(a) à disciplina! Nessa disciplina será abordada a Programação Orientada a Objetos (POO), utilizando a linguagem de programação JAVA. Tam- bém serão apresentados conceitos de POO e conceitos e estruturas de dados usadas para a manipulação e armazenamento de dados. Dentre essas estruturas apresentadas, vamos encontrar os vetores, as matrizes e as árvores. Para essas estruturas, serão apre- sentadas formas de ordenação de dados. Antes de começarmos, lembre-se que muitas dessas estru- turas possuem formatos diferenciados que contribuem em diversas áreas, como redes, hardware, banco de dados, Sistemas de Infor- mação e negócios, entre outros. No decorrer do conteúdo, todos os conceitos de orientação a objetos serão abordados de forma simplificada para que você possa absorver facilmente os temas abordados no material. Dito isto, desejo a você boa leitura e bons estudos! Autoria Fábio da Silva Souza O professor Fábio da Silva Souza é tecnólogo em Gestão da Tecno- logia da Informação pela Faculdade Tecnológica de Guaratinguetá (Fatec). Formou-se no ano de 2017 e, desde então, atua como pro- gramador e analista de sistemas. Currículo Lattes http://lattes.cnpq.br/0316083306850058 Rolfi Cintas Gomes Luz O professor Rolfi Cintas Gomes Luz é mestre (2012) em Ensino de Ciências pela Universidade Cruzeiro do Sul. É graduado (2008) em Ciência da Computação pela mesma instituição. Atua há duas déca- das na área da computação como analista de sistemas, passando por empresas nacionais e multinacionais, e possui uma década atuando no ensino superior. Currículo Lattes http://lattes.cnpq.br/0778971556248045 Organizador Adilson da Silva O professor Adilson da Silva é formado em Ciência da Computação pela Universidade Católica de Pernambuco (1995), possui especiali- zação em Tecnologia da Informação pela UFPE (Universidade Fede- ral de Pernambuco) e MBA em Gestão de Pessoas por Competências pela faculdade Santa Maria. Também tem especialização em Meto- dologias Ativas da Educação e Mestrado em Engenharia de Software pelo C.E.R.S.A.R., além de possuir certificação Scrum Master. Atua na área de informática há mais de trinta anos, como Analista de Sistemas e como professor de disciplinas como Algoritmo, Banco de dados, Gestão de projetos, Gestão ágil e Segurança da Informação. Currículo Lattes http://lattes.cnpq.br/7221002795193400 UN ID AD E 1 Objetivos ◼ Apresentar as características de Programação Orientada a Objetos. ◼ Introduzir a linguagem Java para Programação Orientada a Objetos. ◼ Entender os conceitos da Programação Orientada a Objetos.◼ Compreender como surgiu o paradigma de Programação Orientada a Objetos. 12 Introdução Caro(a) aluno(a), como vai? A partir de agora veremos a Programação Orientada a Obje- tos. Dessa forma, falaremos sobre os objetivos esperados e quais as vantagens de utilizá-la. Além disso, apresentaremos os principais conceitos de orientação a objetos e a algumas das suas implemen- tações em JAVA. Veremos também como podemos executar os programas em JAVA usando o Netbean. Assim, discutiremos a aplicação de alguns conceitos de lógica de programação em Java, como o uso de opera- dores (Lógicos e aritméticos). Trataremos também das estruturas condicionais e das estruturas de repetição que podem ser usadas. Por fim, apresentaremos algumas terminologias usadas no para- digma de orientação a Objetos. Pensando nisso, até o final desse material, discutiremos: 1. características da Programação Orientada a Objetos; 2. uso da Linguagem JAVA na ferramenta NetBeans; 3. uso de estruturas condicionais e de estruturas de repetição em JAVA; 4. conceitos de Programação Orientada a Objetos. Destaco que a Programação Orientada a Objetos é o paradig- ma de programação mais utilizado atualmente no desenvolvimento de sistemas, trazendo um aumento de produtividade com a utiliza- ção de reuso de código. E, para que você possa se inserir no merca- do, é necessário ter uma boa base nesse paradigma, e é o que essa disciplina lhe dará. Dito isto, vamos iniciar nossos estudos. 13 Introdução à orientação a objetos Caro(a) aluno(a), é notório que computadores estão presentes no cotidiano e servem para automatizar e agilizar a execução de tarefas simples ou complexas. Mas, um computador não é capaz de efetuar qualquer tarefa sem um software, pois é através dele que se proces- sam as informações. Nos primórdios da computação, um programa de computador era escrito de maneira sequenciada, com suas funções uma abaixo da outra e seguindo esta sequência até o final. Dentro da sequência, o pro- grama trabalhava diante de seleções que executavam uma sequência com base em condições (if ou else) verdadeiras (true) ou falsas (false) ou diante de repetições que executassem tal sequência enquanto a condição fosse verdadeira (iterações: for, foreach, do e while). Em síntese, a Programação Orientada a Objetos (POO) con- siste no desenvolvimento de sistemas computacionais utilizan- do linguagens de programação que suportam orientação a objetos por meio de classes e seus atributos e métodos, introduzindo uma abordagem na qual o(a) programador(a) visualiza o programa em execução como uma coleção de objetos cooperantes que se comuni- cam por mensagens. Em outras palavras, podemos dizer que a POO procura atender aos requisitos do(a) cliente através de funções encontradas dentro dos objetos criados. É importante destacarmos que cada um dos objetos é ins- tância de uma classe e todas as classes formam uma hierarquia de classes unidas via relacionamento de herança, como apontado na página 4 do livro Introdução ao Paradigma de Orientação a Objetos, publicado em 1996 e escrito por Carlos Kamienski. Uma das características da Programação Orientada a Objetos, como o próprio nome sugere, é o uso de objetos, em vez de funções ou procedimentos, para a construção do programa. Eles se comuni- cam mediante mensagens e cada objeto é uma instância de classe, possibilitando que o programa seja escrito sem a necessidade de se seguir uma sequência e que um método seja executado em qualquer parte da classe, desde que no padrão aceito pela linguagem. 14 Objetivos e vantagens da poo A Programação Orientada a Objetos tem por objetivo melhorar a produtividade dos(as) programadores(as) no desenvolvimento de sistemas, possibilitando a construção de sistemas robustos com menos linhas de código, de modo que trechos de códigos sejam rea- proveitados. A POO é vantajosa porque: • possibilita a reutilização de código, sendo essa sua maior van- tagem ao permitir que um(a) programador(a) escreva menos linhas, já que um trecho de código pode ser reutilizado inú- meras vezes em qualquer parte do sistema; • possibilita que a aplicação seja escalável, fazendo com que ela cresça de acordo com as necessidades que surgem no decorrer do desenvolvimento ou mesmo diante da necessidade de im- plantar novas funcionalidades; • além disso, a manutenção do sistema é feita de forma simpli- ficada, rápida e eficiente. Modelos Para programar utilizando a orientação a objetos, é necessário criar classes que, em muitos casos, são só modelos de entidades e, para que se possa representar dados a partir das classes, é necessária a criação de objetos e/ou instanciação destas classes. Além disso, a criação de um objeto, ou sua instanciação, é ne- cessária para que se possa ter a representação de dados e a manipu- lação das informações e executar operações contidas na classe. No exemplo: “Livro livro = new Livro();”, a primeira parte antes do igual indica que se está referenciando na memória do sistema opera- cional o objeto denominado “livro”, que tem o tipo Livro, e a segun- da parte é a criação da instância através da palavra-chave “new”. EXEMPLO 15 Já Na página 14 do livro Introdução à Programação Orienta- da a Objetos usando JAVA, editado em 2011, o autor Rafael Santos afirma que: as classes são estruturas das linguagens de programação orientadas a objetos para con- ter, para determinado modelo, os dados que devem ser representados e as operações que devem ser efetuadas com estes dados (SAN- TOS, 2011). Além disso, os dados contidos na classe são atributos do objeto e as classes são abstrações do mundo real no mundo vir- tual. Na programação, tais classes também são chamadas de modelos (models), representações de objetos, pessoas, tarefas e processos, usados no dia a dia, não necessariamente diante de um computador. Para melhor exemplificar isso, o Diagrama 1 representa um modelo de abastecimento num posto de combustível. Diagrama 1 - modelo de abastecimento em posto de combustível Fonte: editorial Digital Pages (2020). 16 O modelo anterior traduz o processo num posto de combustí- vel, onde o frentista ou caixa recolhe dados, como tipo de com- bustível, valor total pago, quantidade de litros, preço por litro e tipo de pagamento. Esses dados possuem comportamentos usados, por exemplo, para fechamento de caixa, determinar qual combustível é o mais vendido, se é necessária a compra de mais combustível, dentre outros trâmites relativos a um posto de combustível. Bibliotecas de operações Caro(a) aluno(a), é preciso que você saiba que nem todo mode- lo possui dados e operações, visto que eles podem incluir ape- nas dados ou operações. Lembre-se que modelos que contêm só dados são pouco usados, pois não faz sentido ter um modelo cujas informações não são manipuláveis. Já modelos que pos- suem só operações são mais encontrados, sendo denominados bibliotecas de operações, criadas para manipulação de dados de outras classes. Tipos de Dados Primitivos (Representação) Em Sistemas de Informação, muito se fala sobre dados, informa- ção e conhecimento. Nesse cenário, a computação, de forma geral, refere-se à informação e ao conhecimento. Previsão ou tendências, por sua vez, são tratadas na Inteligência de Negócios, ou BI (Busi- ness Intelligence). Já os dados podem ser um conjunto de bits, uma palavra, uma letra, um número, ou podem assumir algum valor sem significado aparente. DICA 17 EXEMPLO EXEMPLO EXEMPLO Por exemplo, o abacate, R$ 5,00, 1 kg. Além disso, a informação é a união de diversos dados que possuem sentido ou significado. Por exemplo: “hoje, 1 kg do abacate está custando R$ 5,00 reais”. Já o conhecimento é a relação dos dados e das informações, constituindo uma ação, aplicação ou saber em diversas áreas do co- nhecimento, geralmente empregada quando se cruzam valores. Por exemplo: “há dez anos, no mês de dezembro, 1 kg do abacate custava R$ 5,00 reais”. Por fim, os dados,em Estrutura de Dados, são trabalhados como forma primordial de computar ou solucionar problemas do mundo real, visando atender às regras de negócio, ou seja, às regras do mundo real que devem ser incorporadas no mundo computacio- nal ou atividades empresariais que utilizam esses dados como ca- deia de valor do negócio. É importante destacarmos ainda que a escolha do tipo de dado em Estrutura de Dados leva em consideração alguns aspectos, como: 18 • identificador - nome pelo qual a estrutura será identificada. Geralmente, possui ligação com sua aplicação no mundo real. • tipo de armazenamento - define se serão armazenadas le- tras, números, valores lógicos etc. • velocidade em inserir dados - a velocidade é medida, geral- mente em milissegundos, e pode variar dependendo do tipo de estrutura escolhida. • algoritmo de ordenação e localização de dados - existem muitos algoritmos específicos para cada tipo de estrutura que dependem muito da sua aplicação. Às vezes, possuem estruturas que demoram mais para or- denar, mas que, por outro lado, são mais velozes para localizar os dados. Assim, através do tipo de aplicação de dados, verifica-se qual o melhor formato de dados para tanto. Nesse contexto, surgem os tipos de dados primitivos, que orientam ao programador a estrutura mais adequada para aplicação na regra de negócio. É importante destacarmos que, em Java, há poucos tipos de dados primitivos, também conhecidos como nativos ou básicos. Eles são parte da linguagem, portanto, suas nomenclaturas são pala- vras-chaves e não são instâncias de outras classes. Assim, cada tipo tem limitações, ocupando valores específicos em memória. Para que você possa entender o que estamos tratando, abaixo, na Tabela 1, constam as especificações dos tipos primitivos em JAVA. Veja: Tabela 1.- Tipos Primitivos em JAVA boolean byte true ou false Entre -128 e 127 O valor booleano assume valores true ou false Números inteiros de 8 bits de precisão 8 8 true 108 Tipo primitivo Valores Observações Bits em memória Exemplo 19 Fonte: editorial Digital Pages (2020). Caro(a) aluno(a), é necessário que você saiba que, para o tipo char, cada número de 0 a 65535 é um dos caracteres na ta- bela ASCII (American Standard Code for Information Interchange), sigla em inglês para Código Padrão Americano para o Intercâm- bio de Informação. Para que você entenda o que estamos deta- lhando, o código a seguir dá um melhor entendimento sobre o tipo char. float long char double int short Entre 1.40239846e-46 e 3.40282347e+38 Entre -9.223.372.036.854.775.808 e +9.223.372.036.854.775.807 Entre 0 e 65535 Entre 4.94065645841246544e-324 e 1.7976931348623157e+308 Entre -2.147.483.648 e +2.147.483.647 Entre -32768 e 32767 Pontos flutuantes de precisão sim- ples, usados para representar valo- res decimais Números inteiros de 64 bits de precisão Na teoria, char armazena números inteiros de 16 bits de precisão, mas, na prática, é utili- zado para para qualquer caractere alfanumérico (char = character) Pontos flutuantes de precisão dupla, usados para representar valores decimais Números inteiro de 32 bits de precisão Números inteiros de 16 bits de precisão 32 64 16 64 32 16 34897.75 7234829 s 34897.75 1000 1000 20 EXEMPLO public class ExemploCharASCII { public static void main(String args[]) { char caractereJ = 74; char caractereA = 65; char caractereV = 86; System.out.println(caractereJ + “” + caractereA + “” + caractereV + “” + caractereA ) ; } } Como você deve ter percebido, no código há três atri- butos do tipo char e cada um representa uma letra. Assim, para escrever a palavra JAVA utilizando char, é preciso usar aspas vazias para dizer ao Java que se está concatenando e não somando, pois, como char é inteiro, sem + “” + a linguagem entenderia que os valores estão somados em vez de concate- nados. Assim, executando o código anterior, a saída no con- sole seria “JAVA”. A classe String Em Java, para atribuir qualquer texto no lugar de um array de char (char []), usa-se a classe String. Isso porque, por ser uma classe, String não é um tipo primitivo, apesar de não precisar ser instancia- da. De acordo com Santos (2011), embora não seja preciso declarar um array de char, o conceito de String é que a instância possui zero ou mais caracteres do tipo char, enfileirados em ordem de leitura (da esquerda para direita). Veja: 21 EXEMPLO public class testePalavra { public static void main(String args[]) { //Usando array de char char [] tipoChar = {‘p’,’a’,’l’,’a’,’v’,’r’,’a’}; //usando classe String sem instanciá-la String classeString = “Palavra”; //usando a classe String, instanciando-a String classeString2 = new String (“Palavra”); } } No exemplo a cima, usando char, é preciso criar um array e cada letra precisa ser passada por aspas simples, enquanto na classe String é possível passar diretamente entre aspas duplas ou por parâ- metro entre aspas duplas ao instanciar a classe String. Perceba que, no código anterior, o mais comum é fazer “String nomeVariavel = “palavra”;” em vez de “String nomeVaria- vel = new String(“palavra”);”. É importante destacarmos que o tamanho de uma String depende da quantidade de memória disponível no sistema, ou seja, ela consome poucos ou muitos bits de memória conforme o tamanho do texto. Além do que detalhamos, é preciso que você saiba que a classe String tem métodos essenciais que auxiliam no desenvolvimento de trabalho com textos. Alguns dos métodos, e para que eles servem, são: • length - regressa à quantidade exata de caracteres con- tidos em uma String. Este método, além de caracteres visíveis, também retorna espaços, quebras de linhas, 22 tabulações etc. É importante destacarmos que o método lengh não aceita parâmetros. • charAt - volta ao caractere que está numa posição do texto. Para execução do método, é necessário que se passe um valor inteiro como argumento. • getChars - retrocede a caracteres partindo de uma posi- ção inicial até outra. Exige que se passe por quatro parâ- metros, posição inicial (srcBegin), posição final (srcEnd), destino (dest) e posição do início do destino (dstBegin). Para tanto, é preciso criar um array de char como destino passado como parâmetro. • replace - substitui caractere ou texto e possui como parâme- tro dois argumentos. O primeiro é o caractere ou texto a ser substituído e o segundo, o caractere ou texto substituto. • toUpperCase - deixa todo o texto maiúsculo e não aceita parâmetros. • toLowerCase - deixa todo o texto minúsculo e não aceita parâmetros. • trim: remove espaços contidos no início e/ou no final de um texto, exceto entre duas palavras. Também não aceita parâmetros. A classe String é imutável, não sendo possível alterá-la após cria- da. Por outro lado, uma variável da classe String também admite a junção de textos, denominada como concatenação. A concatenação é feita utilizando o operador de adição (+) que junta dois ou mais textos em um. Ela só é possível porque, na concatenação, é criado um novo objeto temporário da classe String, posteriormente asso- ciado à referência da variável criada. DICA 23 Variáveis No algoritmo e na computação, temos as variáveis, que são definidas como espaço em memória que possui um identificador e pode alo- car dados. Como nos tipos de dados primitivos que compõem a cadeia (inteiro, real e lógico), nas linguagens de programação, temos tipos primitivos mais específicos, em que cada linguagem possui seu tipo primitivo, porém, algumas linguagens possuem um padrão. Para que você não tenha dúvidas, já lhe adianto que, nesta disci- plina, será utilizada a linguagem Java nos exemplos e, nessa linguagem, para definir uma variável, usa-se o conceito de declaração de variável. É importantedestacarmos que Java é uma linguagem de pro- gramação simples, portável, gratuita, robusta e com bibliotecas para aplicações, além de ser possível executá-la em um terminal Unix ou MS-DOS. Por ser multiplataforma, é utilizada para desenvolvimen- to de sistemas web, mobile ou desktop e possui frameworks fáceis de utilizar e também há integração fácil com o banco de dados. Esta linguagem também é fortemente tipada, ou seja, ao de- clarar atributos ou variáveis, declara-se também o tipo de dado (nu- mérico, texto, booleano, entre outros). Grosso modo, diz-se que, para um campo do tipo primitivo int (numérico), não é possível atribuir um caractere não inteiro entre 0 e 9. Isso porque os tipos de dados primitivos são palavras-chaves reservadas pela linguagem de programação e não se pode utilizá-las como nome para uma variável. Operadores lógicos relacionais e comparadores em java Os fluxos de um programa são baseados em operadores lógicos e ló- gicos relacionais. Eles servem para que, durante a execução de um trecho do código e segundo a condição, o programa faça algo ou, em uma iteração, ele execute aquilo até que a condição seja cumprida ou enquanto ela for válida. Dessa maneira, os operadores lógicos rela- cionais em Java retornam o valor booleano true ou false e são listados a seguir, junto com seu uso para verificação. 24 ◼ == (igual): se dois valores são iguais. Se o valor à esquerda e o valor à direita foram iguais, o resultado é true, do contrário é false. ◼ != ( ): se dois valores são diferentes. Se o valor à esquerda for diferente do valor à direita, o resultado é true, do con- trário é false. ◼ > (maior): se um valor é maior que o outro. Se o valor à es- querda for maior que o valor à direita, o resultado é true, do contrário é false. ◼ < (menor): se um valor é menor que o outro. Se o valor à es- querda for menor que o valor à direita, o resultado é true, do contrário é false. ◼ >= (maior ou igual): se um valor é maior ou igual ao outro. Se o valor à esquerda for maior ou igual ao valor à direita, o resultado é true, do contrário é false. ◼ <= (menor ou igual): se um valor é menor ou igual ao outro. Se o valor à esquerda for menor ou igual ao valor à direita, o resultado é true, do contrário é false. É importante destacarmos que os operadores anteriores são uti- lizados para comparar valores nativos numéricos, inclusive o tipo char: public class TesteOperadoresLogicos { public static void main(String args[]) { int numeroComparado = 18; if (15 == numeroComparado) { System.out.println(“os números são iguais”); } else { EXEMPLO 25 System.out.println(“os números são diferentes”); } If (21 != numeroComparado) { System.out.println(“os números são diferentes”); } else { System.out.println(“os números são iguais”); } If (33 > numeroComparado) { System.out.println(“o número é maior que o número comparado”); } else { System.out.println(“o número é menor que o número comparado”); } if (19 < numeroComparado) { System.out.println(“o número é menor que o número comprado”); } else { System.out.println(“o número é menor que o número comprado”); } if ( 18 >= numeroComparado) { System.out.println(“o número é maior ou igual ao número comparado”); } else { System.out.println(“o número é menor que o número comparado”); } 26 EXEMPLO if (18 <= numeroComparado) { System.out.println(“o número é menor ou igual ao número comparado”); } else { System.out.println(“o número é maior que o número comparado”); } } } E, caso seja necessário comparar Strings ou objetos, se usa o método equals, como neste exemplo da classe String: public class ComparaPalavra { public static void main(String args[]) { String palavra1 = “Palavra”; String palavra2 = “Palavra”; If (palavra1.equals(palavra2)) { System.out.println(“As palavras são iguais”); } else { System.out.println(“As palavras são diferentes”); } } } 27 EXEMPLO Perceba que, no exemplo anterior, a palavra1 é igual à pala- vra2, portanto, ao executar o código, é exibido no console o resulta- do “As palavras são iguais”. Ao utilizar o método equals da classe String, todos os caracteres da palavra precisam estar na mesma sequência, inclusive os espaça- mentos. Isso porque o método também diferencia se o caractere é maiúsculo ou minúsculo. Então, “Arroz com Feijão” não é a mesma coisa que “Arroz coM feijão” ou “Arroz comFeijão”. Assim, para sa- ber se uma String é igual a outra, sem distinguir caracteres maiús- culos e minúsculos, é utilizado o equalsIgnoreCase. É importante você saber que todas as classes possuem o mé- todo equals (herdado da classe Object) e, para customizá-lo, é pre- ciso sobrescrevê-lo utilizando a annotation @Override acima do método, veja: public class Livro { private long id; private String nomeAutor; private int anoLancamento; private String titulo; public String getNomeAutor() { return nomeAutor; } DICA 28 public void setNomeAutor(String nomeAutor) { this.nomeAutor = nomeAutor; } public int getAnoLancamento() { return anoLancamento; } public void setAnoLancamento(int anoLancamento) { this.anoLancamento = anoLancamento; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Livro other = (Livro) obj; 29 if (anoLancamento != other.anoLancamento) return false; if (nomeAutor == null) { if (other.nomeAutor != null) return false; } else if (!nomeAutor.equals(other.nomeAutor)) return false; if (titulo == null) { if (other.titulo != null) return false; } else if (!titulo.equals(other.titulo)) return false; return true; } } No exemplo acima, o método equals foi sobrescrito com a annotation @Override. No código, o objeto passado pelo parâmetro “(Object obj)” é do tipo Object e não do tipo Livro, isso acontece por- que todas as classes herdam direta ou indiretamente a classe Object, sendo ela a base para todas as demais. Em seguida, como no código do exemplo, é feita a conversão explícita do objeto genérico para o tipo Livro (Livro other = (Livro) obj;). Ele também confere cada atributo da classe Livro, com ex- ceção do id, algo que foi feito de forma proposital, pois, se ele fosse verificado também, conforme a circunstância, haveria dois objetos Livros com o mesmo autor, mesmo título e mesmo ano de lançamento, mas com o id diferente, fazendo que o método equals retorne false. 30 Lembre-se que o id é utilizado para aplicações em banco de dados, logo, ao averiguar se um objeto já existe no banco, não se considera o id, pois assim é evitada a duplicidade de dados, já que os demais atributos seriam iguais. Não obstante, isso depende da regra de negócio. Executando o java Após a instalação do JDK e do Netbeans, abra o Netbeans. Clique em Arquivo e, logo em seguida, clique em Novo Projeto, e aparecerá a tela representada na Figura 1: Figura 1 - Ambiente Netbeans: tela inicial de Novo Projeto Fonte: editorial Digital Pages (2019). Logo depois, na tela do Novo Projeto, clique em Java, Aplica- ção Java e Próximo, e aparecerá a tela conforme a Figura 2: 31 Figura 2 - Ambiente Netbeans: criando Nova Aplicação do Projeto Fonte: editorial Digital Pages (2019). Nessa etapa, escreva o Nome do Projeto (todo exemplo e programa que serão desenvolvidos na disciplina será um Projeto Novo). A localização física padrão do projeto é na pasta Documentos\ NetBeansProjects do Usuário local. Deixe selecionadoCriar Classe Principal, assim: Figura 3 - Ambiente Netbeans: tela inicial de Desenvolvimento Fonte: editorial Digital Pages (2019). 32 EXEMPLO Na área de desenvolvimento, temos o botão Play, que é o bo- tão que inicia o comando de execução do projeto e o faz na parte de baixo da área de desenvolvimento. Fique tranquilo(a), pois, na dis- ciplina, será fornecido o código para execução das estruturas. Atente-se ao fato de que todo nome do programa deve- rá (neste primeiro momento) ser o nome do projeto. Logo, veja o exemplo a seguir. public class prjOla { public static void main(String []args) { System.out.println(“Olá”); } } O nome do projeto, ao criar um novo, é prjOla. O Java é case sensitive, isto é, ele diferencia letras maiúsculas e minúsculas. En- tão, prjOLA é diferente de PRJOLA e diferente de prjola. Por isso, no- mes de programas, projetos e comandos devem seguir exatamente como estão escritos no material. No comando anterior, para poder executar, cole o código e di- gite play. Lembre-se que os comandos em Java funcionam via blo- cos, que são as aberturas e fechamentos de chaves. O principal método a ser executado no projeto é o public static void main que, ao ser iniciado, irá apresentar na tela a palavra “Olá” através do comando System.out.println(). A seguir, estão exemplos do uso de tipos primitivos em ope- ração matemática e demonstração em tela. 33 EXEMPLO public class prjSoma { public static void main(String []args) { int numA = 5; int numB = 6; int result = numA + numB; System.out.println(“O resultado de A + B :” + result); } } Inserido Classes Caro(a) aluno(a), para inserir mais uma classe no projeto, clique com o botão direito do mouse em cima do pacote, como na Figura 4. Figura 4 - Ambiente Netbeans: criando uma nova Classe no Projeto (passo 1) Fonte: editorial Digital Pages (2019). 34 Logo em seguida, aparecerá a janela da Figura 5. Neste mo- mento, somente escreva o nome da classe e clique em Finalizar. Figura 5 - Ambiente Netbeans: criando uma nova Classe no Projeto (passo 2) Fonte: editorial Digital Pages (2019). Operadores lógicos e negação em java Os operadores lógicos seguem a mesma ideia que os lógicos relacio- nais e auxiliam na execução de processos diante de circunstâncias para tomada de decisões, em que duas ou mais condições são consi- deradas e retornam um valor booleano true ou false. Há apenas dois operadores lógicos: • && (dois “e comercial”): a pronúncia correta é and e a tradu- ção para o português é “e”. É utilizado para comparar duas ou mais condições e todas precisam ser verdadeiras. • || (duas vezes o símbolo pipe, localizado no mesmo botão que a contra-barra “\”, próximo à letra Z no teclado): a pronúncia correta é or e a tradução para o português é “ou”. É utiliza- do para comparar duas ou mais condições em que pelo menos uma delas precisa ser verdadeira. 35 EXEMPLO public class OperadorLogico { public static void main(String args[]) { int resultado1 = 15 + 12; int resultado2 = 22 + 33; if (resultado1 == 27 && resultado2 == 55) { System.out.println(“As condições foram atendidas”); } else { System.out.println(“As condições não foram atendidas”); } if (resultado1 > 27 || resultado2 == 55) { System.out.println(“Uma ou outra condição foi atendida”); } else { System.out.println(“Nenhuma das condições foi atendida”); } } } No exemplo acima, a primeira condição (primeiro if) é que o resultado1 precisa ser igual a 27 e o resultado2, igual a 55. Como ambas as comparações são verdadeiras, ao executar o có- digo, para a primeira condição é exibido o texto “As condições foram atendidas”. Já na segunda condição, o resultado1 precisa ser maior que 27 e o resultado2, igual a 55. Assim, a primeira condição não é atendi- da, pois resultado1 é igual a 27 e não maior. Já a segunda condição é atendida, pois o resultado2 é igual a 55. Como o operador lógico é 36 EXEMPLO “ou” e só uma condição precisa ser verdadeira, ao executar a segun- da condição, o texto exibido é “Uma ou outra condição foi atendida”. A negação é utilizada para negar (inverter) um valor boolea- no, seja ele verdadeiro (true) ou falso (false). A negação utiliza o sinal ! (exclamação) e sua denominação é not (não). Dessa maneira, toda comparação retorna um valor booleano, assim, a negação impacta diretamente no valor booleano, em que o verdadeiro vira falso e o falso vira verdadeiro. public class ComparaPalavra { public static void main(String args[]) { int resultado1 = 15 + 12; int resultado2 = 22 + 33; if (!(resultado1 == 28) && resultado2 == 55) { System.out.println(“As condições foram atendidas”); } else { System.out.println(“As condições não foram atendidas”); } if (!(resultado1 > 27 || resultado2 == 55)) { System.out.println(“Uma ou outra condição foi atendida”); } else { System.out.println(“Nenhuma das condições foi atendida”); } } } 37 Como você já deve ter percebido, um programa de compu- tador segue a mesma regra da matemática, processando primeiro o conteúdo interno dentro dos parênteses e, depois, o que está fora dos parênteses. Pensando nisso, o raciocínio para o operador de ne- gação parece um pouco complicado em um primeiro momento e, por isso, ele foi separado em tópicos para melhor entendimento. Observando o código anterior, na primeira condição, se tem: !(resultado1 == 28) && resultado2 == 55 • Dentro dos parênteses resultado1 == 28. O resultado dá o valor booleano false, já que o resultado1 é igual a 27, e não 28. • O sinal de negação está negando o resultado dentro dos parênteses. Desse modo, o resultado vira true já que é false (inverso de false); • Depois, se tem a comparação “resultado2 == 55”, o que resul- ta em true. • Então, aparecem dois valores booleanos –true: o “!(resultado 1 == 28)” é verdadeiro e o “resultado2 == 55” também. Como o compa- rador lógico neste caso é “&&” (e), todas as condições precisam ser verdadeiras, o que realmente acontece. Assim sendo, para a primeira condição, é exibido no terminal “As condições foram atendidas”. Já para a segunda condição, se tem o seguinte cenário: !(resultado1 > 27 || resultado2 == 55) • Dentro dos parênteses, há duas comparações de operadores lógicos de comparação e o operador lógico “||” (ou). • O resultado1 é igual a 27, e não maior, logo, o resultado é false. • O resultado2 é igual a 55, logo, o resultado é true. • A condição interna dentro dos parênteses volta true, porque apenas uma das comparações precisa retornar true. • O sinal de negação está negando esse resultado. Como ele é true, o resultado final é false. • Portanto, o resultado exibido no terminal é “Nenhuma das condições foi atendida”. 38 Estrutura de decisão em java Um programa de computador trabalha constantemente em cima de decisões que são executadas a partir dos valores booleanos true e false. Além disso, os comandos if-else permitem que um comando ou bloco seja executado diante de uma comparação lógica. Assim, a instrução if-else possui uma estrutura básica que pode ser observada na Figura 6. Figura 6 - Exemplo de condição IF-ELSE * Fonte: editorial Digital Pages (2020). Como você deve ter observado, na figura 6 se tem a declaração do tipo primitivo boolean, com referência na memória chamada de “verdadeiro”, ou seja, o valor booleano possui valor true. Além disso, na estrutura if-else, a primeira condição, destacada em vermelho e na qual está o if, só é executada caso a condição dentro dos parênteses for verdadeira (true). Na hipótese da primeira condição ser false, é execu- tada a condição dentro de else, destacada em cinza. Assim, em uma es- trutura if-else, se não houver uma condição a ser executada dentro da condição else, ela não é obrigatória e nem é declarada,contendo apenas o if. Em alguns casos, há N condições em uma estrutura if-else, que é, então, denominada de if-else aninhada, como na figura 7. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 39 Figura 7 - Exemplo de decisão IF, ELSE E IF-ELSE * Fonte: editorial Digital Pages (2020). Como você pôde perceber, na figura 7, há uma instrução if-else aninhada, composta por vários blocos de instruções if-else. Se a primeira condição, destacada em vermelho, for true, as demais não são executadas. Mas, caso seja false, é apurada a segunda condi- ção, destacada em verde e, se ela for true, as demais abaixo não são examinadas. E, caso seja false, é verificada a terceira condição, des- tacada em bordô. Isso acontece até a condição em laranja e a última condição só é executada se a condição em laranja não for true. Para comparação de casos mais simples, é possível fazer uso do operador ternário. A sintaxe do operador ternário é: “condiçãoBooleana? se- Verdade : seFalso;”. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 40 Figura 8 - Exemplo de SWITCH-CASE * Fonte: editorial Digital Pages (2020). Na figura 8, em azul, está o condicionador ternário e, em ver- de, a expressão que resulta em um valor booleano true ou false. Se a expressão booleana for true, é executado o trecho entre ? (interro- gação) e : (dois-pontos), destacado em vermelho. Mas, caso a expressão booleana seja false, é executado o tre- cho após os: (dois-pontos), destacado em laranja. O operador ter- nário é similar a uma expressão if-else simples. Similar à um if-else aninhado, há o switch-case, utilizado para uma expressão que possui diversas possibilidades, como na figura 9. Figura 9 - Exemplo de SWITCH-CASE * Fonte: editorial Digital Pages (2020). * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 41 Diferentemente do if-else aninhado, o switch-case não para de ser executado até que a última condição não seja validada, exceto se usada a palavra-chave “break”. Na figura 9, há um switch-case e cada bloco possui a palavra-chave “break” para que, quando a condição for correspondida, o bloco de código switch-case seja interrompido. Destacada em amarelo, a palavra-chave “default” é executa- da quando nenhuma das condições é correspondida. Não obstante, há outras observações importantes quanto ao switch-case: • a palavra-chave “default” não é obrigatória e não precisa ter um break, afinal, não há mais condições a serem comparadas e, por con- sequência, não há necessidade de interromper o bloco switch-case. • caso o bloco do switch-case não possua default, o último case não têm necessidade de ter break. • caso duas ou mais condições executem o mesmo processo, elas são alinhadas abaixo uma da outra sem expressão. Veja na Figura 10 que, na parte destacada em cinza, caso a variável número1 seja 8, 9 ou 10, é exibido no console o texto “O núme- ro é 8, 9 ou 10”; e se não for nenhuma destas opções, é exibido no console “O número não é 8, 9 ou 10”; Figura 10 - Exemplo de SWITCH-CASE ANINHADO * Fonte: editorial Digital Pages (2020). * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 42 • O switch-case também é designado para comparar valo- res numéricos de, no máximo, tipo int, que variam entre -2147483648 e 2147483647. Somente a partir do Java 7, é possível trabalhar com Strings, portanto, tipos boolean, long, float e double não funcionam. Estrutura de repetição em java Além da estrutura de decisão, o sistema conta com estruturas de repetição que só param por uma condição programada, como se nota na Figura 11. Figura 11 - Exemplo de Estrutura de repetição * Fonte: editorial Digital Pages (2020). * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 43 Como você deve ter percebido, na Figura 11 há quatro tipos de estruturas de repetição: • o for, destacado em cinza, realiza uma tarefa enquanto a condição for verdadeira. Na figura 10, a variável i é decla- rada no próprio escopo da condição, mas poderia ser de- clarada fora. A estrutura for é lida da seguinte maneira: “enquanto a condição for verdadeira, execute a tarefa”. Cada trecho é separado por ponto e vírgula. Assim, no pri- meiro ponto e vírgula consta a declaração da variável e a atribuição de um valor a ela. No segundo, há a condição e, no terceiro, a incrementação. • o do-while, destacado em bordô, executa uma tarefa enquanto a condição for verdadeira. A estrutura é lida da seguinte ma- neira: “execute a tarefa, enquanto a condição for verdadeira”. A variável foi declarada fora da iteração, pois, se fosse decla- rada dentro, ela seria criada novamente a cada iteração. Den- tro do bloco do, é concretizada a incrementação e, dentro do while, a condição é verificada. • o while, destacado em vermelho, faz uma tarefa enquanto a condição for verdadeira. A estrutura é lida da seguinte ma- neira: “enquanto a condição for verdadeira, execute a ta- refa”. A variável é declarada fora do escopo do while, pois, se fosse declarada dentro, ela seria criada a cada iteração. Assim, a verificação e o incremento se dão dentro do escopo do while. • o último, embora seja similar ao for, é conhecido como forEa- ch. Ele é utilizado para percorrer arrays e, a cada valor contido no array, ele promove uma tarefa. A estrutura forEach é inter- pretada da seguinte maneira: “a cada dado, execute a tarefa”. O forEach não possui contador porque um array possui chave e valor, em que a chave é o índice e o valor é o dado em si. Logo, ele percorre o índice do array. Embora while e do-while sejam similares, o while só executa se a condição for true, enquanto o do-while executa ao menos uma vez, mesmo que a condição seja false. 44 EXEMPLO public class ExemploRepeticao { public static void main(String args[]) { int j = 0; do { System.out.println( “ O valor de J é “ + j ); } while (j != 0); int k = 0; while (k != 0) { System.out.println( “ O valor de k é “ + k ); } } } Observe que, nesse exemplo, o do-while é executado uma vez, enquanto o while não é executado. Terminologia da programação orientada a objetos No mundo de orientação a objetos, assim como em outras áreas, existem terminologias utilizadas nas linguagens orientadas a ob- jetos, tais como: • objetos - são instâncias de classes que possuem estado e comportamento. O estado é representado pelos campos (atri- butos) daquele objeto, que podem ser modificados ao longo do tempo. Já os comportamentos são os métodos, compostos 45 por um conjunto de instruções, com a característica de alterar o estado do objeto. • classes - são estruturas de um objeto (model) que contêm atributos e métodos. Todo objeto é uma instância pertencente à classe e toda classe precisa de um nome único no pacote em que se encontra. Seguindo a convenção de código, uma classe é declarada usando UpperCamelCase. • atributos - são as propriedades (variáveis) que descrevem o objeto. Em uma linguagem fortemente tipada, precisam ser de um tipo, seja ele primitivo ou de outra classe. Em uma lin- guagem fracamente tipada, o tipo não importa, pois a lin- guagem consegue se arranjar com o tipo de dado presente naquele atributo. • variáveis - são nomes atribuídos ao endereço de memória do computador utilizado para armazenamento de tipos de dados do programa executado. Possuem esse nome porque variam duran- te a execução, não sendo um valor fixo. Seguindo a convenção de código, são declaradas usando LowerCamelCase e devem iniciar por uma letra (de a-z),underline (_) ou cifrão ($). É importante que você nunca inicie o nome de uma variável com números. Uma variável global pode ser acessada por qualquer método na classe e é declarada no cabeçalho da classe. Já uma variável local é visível apenas pelo método que está executando. • constantes - possuem as mesmas características de uma va- riável, mas são imutáveis durante a execução do programa. Seguindo a convenção de códigos, uma constante é declarada usando UpperCase. • escopo - trata-se do local em que uma variável é acessada. Há dois tipos de escopo, o global e o local. Uma variável declarada no cabeçalho de uma classe possui o escopo global, ou seja, pode ser acessada por qualquer método de uma classe. Já uma variável local, declarada dentro de um método, tem o escopo local e só é acessada dentro daquele método, não sendo possí- vel utilizá-la em outro método. 46 • métodos e mensagens - os métodos são processos exe- cutados a fim de realizar alguma operação relacionada ao objeto a que ela pertence. Eles se comunicam por meio de mensagens que podem ou não conter dados. Já as mensa- gens são as informações contidas dentro dos parênteses dos métodos, batizados como parâmetros. A declaração de um método, seguindo a convenção de códigos, é escrita em LowerCamelCase. • herança - admite que um objeto herde as mesmas carac- terísticas de outro objeto, facilitando o desenvolvimento e reaproveitando o código já existente. Uma classe Equi- pamento Eletronico, por exemplo, possui característi- cas (como marca, modelo, altura, largura, profundidade e preço), comportamentos (como liga e desliga) e outras duas classes, TV e Rádio, que apresentam as mesmas ca- racterísticas que o equipamento, fazendo com que herdem esses atributos. • ocultação de informação (privacidade) - termo manifesto como Information Hiding, que provê a ocultação de informa- ções desnecessárias, permitindo a visibilidade de itens es- senciais da classe. Assim, a privacidade é controlada pelos três tipos de modificadores para atributos e métodos: pu- blic, protected e private ou, respectivamente, visível a todas as classes de qualquer pacote; visível a todas as classes do mesmo pacote exceto em caso de herança visível por classes que a herdam em pacotes diferentes; e visível apenas pela própria classe. • encapsulamento de dados - muitos autores afirmam que o encapsulamento é utilizado para a proteção de dados, o que de fato acontece. Porém, a ideia é que esses dados sejam acessí- veis diante dos métodos disponíveis naquela classe, denomi- nados de getters e setters. Contudo, há outras formas de acesso a estes dados. • polimorfismo - em POO, possibilita que uma classe herde outra de maneira que seus comportamentos sejam similares, 47 mas distintos. Um exemplo é a classe animal, na qual quase todos os animais têm o comportamento de emitir som, mas cada espécie emite um som particular. • identação - a identação (ou endentação) é o termo atribuído ao código-fonte de um programa, que auxilia na identificação de hierarquia de blocos de instrução, tornando o código mais “limpo” e de fácil entendimento. A identação não é obrigató- ria na programação, mas sua prática é essencial. Um sistema computacional é gerado com objetivo de solucionar problemas cotidianos e a orientação a objetos é destinada a geren- ciar a complexidade na solução dos problemas com um conjunto de objetos. Assim, baseados em objetos reais, os objetos criados são compostos por características e comportamentos, além de serem únicos na memória do sistema. Instanciando um objeto Para criar um objeto na memória do sistema, é preciso declarar o tipo do objeto seguido de um nome. Isso faz com que o programa reserve um espaço na memória do computador e, mediante o nome do objeto, se obtém acesso aos dados armazenados no objeto. No entanto, isso não é suficiente para que se trabalhe com o objeto, já que ele possui somente uma referência na memória. Para que as informações do objeto sejam acessíveis, é ne- cessário que ele seja instanciado e, para isso, emprega-se a pa- lavra-chave “new” seguida do construtor da classe. Lembre-se que toda classe tem seu construtor, que não precisa ser declara- do, mas, conforme a necessidade, é criado da maneira que me- lhor convém. DICA 48 DICA Figura 12 - Exemplo de Instanciação * Fonte: editorial Digital Pages (2020). Devem ser utilizados ao longo da unidade, sejam gráficos, mapas mentais e/ou conceituais, fluxogramas, organogramas, tabelas e quadros, além de imagens que ilustrem graficamente o texto. Para esse fim se utilize de programas como canva.com, Lucidchart.com, pixabay e freepic. Ao inseri-lo, não esqueça de referenciar a fonte e colocar a legenda. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� Construtor padrão Construtor da classe Car Nova instância do objeto Car Construtor customizado com parâmetros Referência do objeto em memória 49 Caro(a) aluno(a), neste material, discutimos o surgimento da pro- gramação orientada a objetos, sua referência com modelos de en- tidades e explicamos que, para programar, é preciso representar objetos por meio de classes que contêm estados e comportamentos de um objeto. Além disso, explicamos que a POO melhora a produtividade dos(as) programadores(as), permitindo a reutilização de códigos e é de fácil manutenibilidade, além de ser escalável. Sobre a linguagem de programação Java, ressaltamos que ela é 100% orientada a objetos e que funciona em diversos dispositivos e sistemas operacionais diferentes, sendo fortemente tipada, pos- suindo tipos primitivos e uma classe diferenciada chamada String para trabalhar com caracteres alfanuméricos, mas que não precisa ser instanciada, além de haver vários métodos internos essenciais para um(a) programador(a) trabalhar com os caracteres. Também foram abordados operadores lógicos, operadores lógicos relacionais, negação, comparadores de classes, estruturas de deci- são e repetição. E, ao final, foram abordados conceitos da orientação a objetos, incluindo objetos, classes, atributos, variáveis, constan- tes, escopos, métodos e mensagens, herança e encapsulamento. Lembre-se de estudar antes e depois da sua aula, aproveite o mo- mento com o(a) docente para tirar todas as suas dúvidas. Até breve! SINTETIZANDO UN ID AD E 2 Objetivos ◼ Apresentar as características de Programação Orientada a Objetos. ◼ Compreender como surgiu o paradigma de Programação Orientada a Objetos. ◼ Introduzir a linguagem Java para Programação Orientada a Objetos. ◼ Entender os conceitos da Programação Orientada a Objetos. ◼ Apresentar as estruturas de dados compostas homogêneas e heterogêneas. ◼ Apresentar os tipos abstratos de dados. 52 Introdução Olá, aluno(a), como vai? Vamos iniciar mais uma etapa de estudos e, a partir de agora, veremos os principais conceitos de atributos e métodos, entenden- do a ocultação das informações através do encapsulamento. Além disso, serão apresentados os conceitos de instâncias, referências e como as classes enviam mensagens. Destaco que, neste material, será explicado qual o ciclo de vida de um objeto. Também apresentaremos o conceito de estrutura compostas homogêneas e heterogêneas. Dito isto, desejo a você boa leitura e bons estudos! 53 Classes, pacotes, objetos, atributos, métodos, construtores, palavra-chave this e sobrecarga Classes A programação orientada a objetos demanda que, ao desenvolver um programa de computador, constantemente, sejam utilizadas classes, com as quais fazemos a representação de uma entidade, seja ela real ou abstrata. A declaração de uma classe é simples, con- forme a sintaxe expressa na figura 1: Figura 1 - Sintaxe básica de uma classe* Fonte: Editorial Digital Pages, 2020. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponívelno seu Ambiente Virtual de Aprendizagem (AVA)� 54 Como você deve ter percebido, na figura 1 temos o modifica- dor de acesso da classe que determina a visibilidade da classe, e que pode ser public, protected, private ou default. Os modificadores de acesso são palavras-chaves reservadas pela linguagem, e devem ser escritos com caracteres minúsculos. Os modificadores protected e private são raramente usados, e só são possíveis através de classes aninhadas. No contexto da programação em Java, o modificador de acesso de- fault não deve ser declarado, sendo oculto. Além dos modificadores de acesso, temos o nome da clas- se, que deverá ser único no pacote e seguir a convenção de códigos. Além disso, ela deve ser declarada em CammelCase, seguindo padrão UpperCamelCase, seu nome deverá ser um substantivo e ter relação com o que ela realmente propõe, sendo simples e objetivo. Fique atento(a), pois as declarações de atributos e métodos devem ser realizadas dentro do escopo da classe. Importante res- saltar que: • toda classe deve possuir a palavra-chave class declarada entre o modificador de acesso e o nome da classe; • toda classe deve estar contida em um pacote. Isso porque, mesmo que ele não seja definido, por padrão, a classe estará em um pacote default. DEFINIÇÃO VOCÊ SABIA? 55 Pacotes Caro(a) aluno(a), ao programar fazendo uso da orientação a objetos, utilizamos pacotes (packages). Pensando nisso, mesmo que eles não sejam definidos, as classes devem estar dentro de um pacote default do próprio Java. Lembre-se: pacotes são utilizados a fim de estruturarmos melhor o sistema desenvolvido, facilitando a localização de tipos, evitando conflitos de nomes e controlando o acesso. Ao trabalharmos com pacotes diferentes do default, temos que declarar, na estrutura da classe, a palavra-chave packages, se- guida do nome do pacote. Carvalho e Teixeira (2012, p. 36) definem pacotes como sendo um envoltório de classes, um guarda classes e outros pacotes. Dessa maneira, podemos visualizar os pacotes como diretórios, ou pastas, nos quais podemos guardar arquivos (classes) e outros diretórios (pacotes). Veja o exemplo da declaração de uma classe com pacote: package modelos; public class Pessoa { private String nome; } Se declarado, o pacote deve estar na primeira linha de código. DICA DICA 56 Mendes (2009, p. 79) diz que os nomes de pacotes, por reco- mendação, mas não obrigatoriamente, devem ser declarados utili- zando o nome do domínio reverso da empresa. Imagine a seguinte situação: uma empresa com domínio www.mi- nhaempresa.com.br está desenvolvendo o projeto farmacêutica, portanto, durante o desenvolvimento do projeto, ao criar o pacote interfaces, deve ser utilizado o nome br.com.minhaempresa.far- maceutica.interfaces. É importante destacarmos que o uso de pacotes é útil para re- solver problemas com a importação de classes que possuem nomes iguais. E, por convenção, os pacotes devem possuir nomenclaturas que usam letras minúsculas e sem caracteres especiais. Veja um exemplo de estrutura de pacotes de um sistema na figura 2: Figura 2 - Exemplo de estrutura de pacotes Fonte: Editorial Digital Pages, 2020. EXEMPLO 57 Como você deve ter percebido, na figura 2 temos vários pa- cotes do projeto fictício denominado gtc. e, em cada pacote, há um tipo de classe que corresponde ao que ela faz. Além disso, todos os pacotes após o .gtc. estão dentro do primeiro pacote gtc. Objetos Inicialmente, é necessário que você saiba que os objetos são todas as entidades que podem ser modeladas (podendo ser concretas ou não) e que possuem estado e comportamento. Além disso, o estado de um objeto é o conjunto das características que ele pos- sui e que podem ser modificadas. Já o comportamento é definido pelas ações que modificam o estado do objeto. Veja um exemplo na figura 3: Figura 3 - Exemplo de classe com estado, comportamento e outro objeto* Fonte: Editorial Digital Pages, 2020. Para que você entenda, na figura 3 temos duas classes que são representações do objeto carro e fabricante. Destacado em cinza, temos o estado da classe, que são os seus atributos e, em vermelho, temos o comportamento que são os métodos que alteram o estado da classe. Observe que o objeto carro, possui como atributo o objeto fabricante, que também possui estado e comportamento. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 58 Atributos Os atributos são as características que um objeto possui. Dessa manei- ra, podemos entender que um atributo é a representação de um dado ou informação de estado do objeto e cada objeto de uma classe pos- sui seu valor próprio. Existem dois tipos de atributos na programação orientada a objetos: os atributos de objetos e os atributos de classes. Os atributos de objetos são os que descrevem os valores daque- le objeto, em que cada instância possui a sua particularidade. Já os atributos de classe são os valores compartilhados entre todas as instâncias do objeto. Em Java, por se tratar de uma linguagem fortemente tipada, ao declarar um atributo, precisamos dizer de qual tipo é aquele atri- buto. Veja a sintaxe básica para declaração de atributos na figura 4: Figura 4 - Exemplo de declaração de atributos em classe* Fonte: Editorial Digital Pages, 2020. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� Indica que o atributo é da classe Indica que o atributo é da classe Indica que o atributo é da classe Indica que o atributo é da classe Tipo de dado: primitivo ou outro projeto Nome do atributo Indica que o atributo é da classe DEFINIÇÃO 59 Observando a figura 4, podemos fazer algumas observações: • os atributos possuem modificadores de acesso, que podem ser private, protected, public ou default, e que determinam a visibilidade do atributo. Lembre-se que os modificadores são palavras-chave da linguagem e são declarados em le- tras minúsculas. • a palavra-chave static é reservada da linguagem e deve ser declarada em letras minúsculas. É utilizada para informar que aquele atributo é de classe, portanto, todas as instân- cias da classe possuem o mesmo valor e, se em algum mo- mento ele for alterado, todas as instâncias passarão a ter o novo valor. • o tipo do dado é uma característica das linguagens forte- mente tipadas como o Java, em que é necessário declarar qual é o tipo do atributo, que pode ser primitivo ou um outro objeto (classe). • por último, temos o nome do atributo que deve ser único na classe. Seguindo a convenção de códigos, ele deve ser declara- do utilizando LowerCamelCase. Uma observação importante a se fazer sobre os atributos de classe é que, para acessá-los, não é necessário instanciar o obje- to, porém a classe precisa estar visível a outra classe e o atributo precisa ter o modificador public, protected ou default. Caso contrário, eles devem ser acessados por métodos também declarados como estáticos, por exemplo, os métodos getters e setters. Para acessar o atributo estático da classe, precisamos fazer referência ao objeto, seguido do atributo. Carro.quantidadeVendida; ou Carro.getQuantidadeVendida();. EXEMPLO 60 Métodos Os métodos são estruturas contidas dentro de classes que são utili- zadas para realizar operações. Eles, geralmente, alteram o estado de um objeto, porém podem ser utilizados para realizar qualquer fun- ção (não demandando, necessariamente, a alteração de um objeto, e podendo apenas retornar um dado qualquer). Dependendo do que o método faz, se ele é utilizado por vá- rias classes e não realiza operações específicas com atributos de uma classe (como calcular dois valores), ele pode se conter apenas dentro de classes que não possuem atributos, sendo essas classes denominadas bibliotecas de operações. Veja como é a sintaxe da de- claraçãode métodos, na figura 5: Figura 5 - Sintaxe básica de método* Fonte: Editorial Digital Pages, 2020. Dentro da classe mostrada na figura 5, temos: • em azul escuro, os modificadores de acesso aos métodos, que podem ser public, protected, private ou default. • em rosa, o modificador static que possibilita utilizar o método da classe sem a necessidade de instanciá-la. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 61 • em vermelho, duas informações. A primeira está na parte de cima, onde se indica a palavra int. Isso quer dizer que o método deve- rá retornar algum dado que represente o tipo int (qualquer valor dentro da faixa de -2147483648 a 2147483647). Depois, temos a palavra-chave return, que retorna um resultado entre os números inteiros. Um método pode retornar qualquer tipo de dado, seja ele primitivo ou não, além de poder não retornar nada, sendo que o tipo de retorno deve ser void e não possuir a palavra-chave return. • em verde, os nomes dos métodos. Diferente dos atributos, podemos possuir vários métodos com o mesmo nome, porém eles precisam possuir uma assinatura diferente. Lembre-se que a assinatura de um método é composta por nomes e parâ- metros. Assim, a possibilidade de criar dois ou mais métodos com mesmo nome e assinaturas diferentes é chamada de so- brecarga de métodos. Seguindo a convenção de códigos Java, os nomes de métodos devem ser declarados usando LowerCa- melCase e representar um verbo. • em azul, os parâmetros. Eles precisam estar dentro dos parên- teses do método. A quantidade de argumentos passados por pa- râmetros podem ser nenhuma ou várias, e de diferentes tipos de dados ou objetos. Os parâmetros, se declarados, devem possuir tipo e nome, assim como fazemos para declarar atributos na classe. Esses parâmetros devem ser informações que são utiliza- das dentro do método, e não estão acessíveis fora do seu escopo. • em laranja, o escopo do método que está entre as chaves. Nele são realizadas as operações, declaradas variáveis e, se neces- sário, enviado o retorno de que o método necessita. Lembre- -se que toda variável declarada ou objeto instanciado dentro do escopo do método é acessível somente dentro do método e não pode ser reutilizado em outro método. A invocação de um método é feita, geralmente, de forma ex- plícita a partir de outros trechos de códigos. Esses trechos podem estar dentro de outros métodos (um método chamando o outro) que está dentro da própria classe ou a partir de outras classes. Veja o exemplo da figura 6: 62 Figura 6 - Sintaxe para invocação de métodos* Fonte: Editorial Digital Pages, 2020. Como você pode observar na figura 6, temos o método main da classe Start declarado em cinza. Ele é um método padrão da linguagem Java, que é utilizado para dar o pontapé inicial na aplicação. Esse método sempre será public static void e deve possuir como parâmetro um array de argumentos do tipo String, que pode ser ou não passado durante a inicia- lização da aplicação. Para esse caso, os parâmetros não são obrigatórios e nome args pode ser qualquer outro, porém deve ser um array, ou seja, possuir os colchetes declarados após o nome do parâmetro. O método main não possui retorno, já que o retorno esperado é void. Assim, com base na figura 5, a invocação do método realizada na figura 6 é feita de duas maneiras diferentes, conforme explica- remos a seguir. • A primeira maneira está destacada em amarelo, e é feita sem a ne- cessidade de criar uma instância do objeto ExemploMetodo. Isso só é possível graças ao método ter sido declarado com modificador static, o que não funcionaria para o método subtrair. Para fins didá- ticos e uma melhor visualização da declaração de um método, foram separados cada trecho, porém o correto é declarar da seguinte ma- neira: NomeClasse.nomeMetodo(tipoAtributo nomeAtributo);. * Caro(a) aluno(a), para uma melhor visualização da figura, sugerimos que acesse o material disponível no seu Ambiente Virtual de Aprendizagem (AVA)� 63 DICA • A segunda maneira está destacada em laranja e só é possível após a instanciação da classe ExemploMetodo, destacada em roxo. Isso permite que os métodos estáticos e não estáticos do objeto exemplo fiquem acessíveis. Assim como foi feito para a primeira maneira, a declaração foi separada em trechos para melhor visualização e o correto é instanciaObjeto.nomeMe- todo(tipoAtributo nomeATributo);. Os parâmetros passados ao invocar cada método são núme- ros inteiros, assim como é esperado pelos métodos na classe Exem- ploMetodo. Eles devem ser passados na mesma ordem em que a assinatura do método se encontra. Ou seja, se um método aguarda argumentos do tipo int e boolean em sua respectiva ordem, não se pode passar os argumentos boolean e int (de forma invertida), ou deixar de passar um dos parâmetros. Construtores Construtores são métodos especiais chamados através do uso da palavra-chave new. São usados quando desejamos criar uma ins- tância de classe. Um construtor não precisa ser declarado, mas, dependendo do con- texto, pode ser essencial que ele seja, pois é por meio dele que pode- mos, por exemplo, inicializar uma variável ou executar um método antes de fazer uso do objeto. Por meio da criação de construtores podemos garantir que o código que eles contêm será executado antes de qualquer outro código em outros métodos, já que uma instância de uma classe só pode ser usada depois de ter sido criada com new, o que causará a execução do construtor (SANTOS, 2013). 64 Quando os atributos (primitivos ou de classe) são inicializa- dos, mas não receberam uma programação durante sua estruturação, iniciam-se automaticamente com valores default listados a seguir. • Tipo boolean: inicializados com valor false, por padrão. • Tipo byte, char, int, long e short: inicializados com valor 0 (zero). • Tipo float e double: inicializados com valor 0.0 (zero ponto zero). • Instâncias de classes: inicializadas com valor null. Para que você entenda o que estamos tratando, sugiro que veja o exemplo de uma classe sem um construtor definido: public class BrinquedoAPilha { private int quantidadePilha; } Uma referência com valor null não estará acessível a menos que ela seja inicializada através do uso da palavra-chave new. No exemplo do código anterior, ao instanciar o objeto, o construtor default será executado, porém nada de mais acontecerá. Mas, supondo que a quantidade mínima de pilhas sejam duas, po- demos declarar o construtor para atribuir o valor dois sempre que o objeto for instanciado. Veja o exemplo do que estamos falando: public class BrinquedoAPilha { public Brinquedo () { this.quantidadePilha = 2; } private int quantidadePilha; } EXEMPLO 65 No exemplo do código anterior, foi declarado o construtor padrão que atribui o valor dois ao atributo quantidadePilha sempre que o objeto seja instanciado. Isso porque, se isso não fosse feito, o valor sempre se iniciaria como sendo zero. O construtor, embora seja um método, possui suas particula- ridades o que o diferencia dos demais métodos. São elas: • o construtor não precisa ser declarado. Se não declarado, o compilador usa o construtor default da classe. Assim, o cons- trutor default é assinado pelo nome da classe e sem argumen- tos como parâmetros; • o construtor sempre possui o mesmo nome da classe à qual ele pertence; • o construtor não tem nenhum tipo de retorno e não deve ser declarado como void; • o construtor pode receber todos os modificadores de aces- so, porém não é muito comum encontrar construtores com modificadores de acesso private. Isso ocorre porque acaba não sendo usual uma classe conter um construtor com essa característica, a menos que ele seja chamado a partir de ou- tros construtores com modificador de acesso public, protec- ted ou default; • o construtor só pode ser chamado a partir da declaração
Compartilhar