Prévia do material em texto
<p>Programação de Sistemas</p><p>JANE TAVARES ALVAREZ DA SILVA</p><p>1ª Edição</p><p>Brasília/DF - 2022</p><p>Autores</p><p>Jane Tavares Alvarez da Silva</p><p>Produção</p><p>Equipe Técnica de Avaliação, Revisão Linguística e</p><p>Editoração</p><p>Sumário</p><p>Organização do Livro Didático....................................................................................................................................... 4</p><p>Introdução ............................................................................................................................................................................. 6</p><p>Capítulo 1</p><p>Introdução à linguagem de programação ........................................................................................................... 7</p><p>Capítulo 2</p><p>Comandos da linguagem Java ................................................................................................................................33</p><p>Capítulo 3</p><p>Conceitos e Implementação usando Orientação a Objetos .........................................................................61</p><p>Capítulo 4</p><p>Classes e objetos: uma visão mais aprofundada .............................................................................................92</p><p>Capítulo 5</p><p>Tratamento de exceções ........................................................................................................................................125</p><p>Capítulo 6</p><p>Coleções de objetos ................................................................................................................................................137</p><p>Referências .....................................................................................................................................................................145</p><p>4</p><p>Organização do Livro Didático</p><p>Para facilitar seu estudo, os conteúdos são organizados em capítulos, de forma didática,</p><p>objetiva e coerente. Eles serão abordados por meio de textos básicos, com questões para</p><p>reflexão, entre outros recursos editoriais que visam tornar sua leitura mais agradável. Ao final,</p><p>serão indicadas, também, fontes de consulta para aprofundar seus estudos com leituras e</p><p>pesquisas complementares.</p><p>A seguir, apresentamos uma breve descrição dos ícones utilizados na organização do Livro</p><p>Didático.</p><p>Atenção</p><p>Chamadas para alertar detalhes/tópicos importantes que contribuam para a</p><p>síntese/conclusão do assunto abordado.</p><p>Cuidado</p><p>Importante para diferenciar ideias e/ou conceitos, assim como ressaltar</p><p>para o aluno noções que usualmente são objeto de dúvida ou entendimento</p><p>equivocado.</p><p>Importante</p><p>Indicado para ressaltar trechos importantes do texto.</p><p>Observe a Lei</p><p>Conjunto de normas que dispõem sobre determinada matéria, ou seja, ela é</p><p>origem, a fonte primária sobre um determinado assunto.</p><p>Para refletir</p><p>Questões inseridas no decorrer do estudo a fim de que o aluno faça uma pausa</p><p>e reflita sobre o conteúdo estudado ou temas que o ajudem em seu raciocínio.</p><p>É importante que ele verifique seus conhecimentos, suas experiências e seus</p><p>sentimentos. As reflexões são o ponto de partida para a construção de suas</p><p>conclusões.</p><p>5</p><p>ORganIzaçãO DO LIvRO DIDáTICO</p><p>Provocação</p><p>Textos que buscam instigar o aluno a refletir sobre determinado assunto antes</p><p>mesmo de iniciar sua leitura ou após algum trecho pertinente para o autor</p><p>conteudista.</p><p>Saiba mais</p><p>Informações complementares para elucidar a construção das</p><p>sínteses/conclusões sobre o assunto abordado.</p><p>Gotas de Conhecimento</p><p>Partes pequenas de informações, concisas e claras. Na literatura há outras</p><p>terminologias para esse termo, como: microlearning, pílulas de conhecimento,</p><p>cápsulas de conhecimento etc.</p><p>Sintetizando</p><p>Trecho que busca resumir informações relevantes do conteúdo, facilitando o</p><p>entendimento pelo aluno sobre trechos mais complexos.</p><p>Sugestão de estudo complementar</p><p>Sugestões de leituras adicionais, filmes e sites para aprofundamento do estudo,</p><p>discussões em fóruns ou encontros presenciais quando for o caso.</p><p>Posicionamento do autor</p><p>Importante para diferenciar ideias e/ou conceitos, assim como ressaltar</p><p>para o aluno noções que usualmente são objeto de dúvida ou entendimento</p><p>equivocado.</p><p>6</p><p>Introdução</p><p>Este Livro Didático fornece uma diretriz sólida para o estudo de vários tópicos relacionados</p><p>à linguagem de programação Java, incluindo conceitos importantes de Orientação a</p><p>Objetos, tais como herança e polimorfismo.</p><p>Ao longo dos seus seis capítulos, este Livro Didático tenta motivar o estudo da disciplina</p><p>Programação de Sistemas, apresentando vários conceitos, exemplos variados, além de</p><p>programas na linguagem de programação Java que conjuguem teoria e prática, permitindo</p><p>assim, que o leitor construa uma base consistente para a programação de sistemas de</p><p>computador.</p><p>O primeiro capítulo trata das características da linguagem e de conceitos básicos. Já os</p><p>demais capítulos levam o leitor a fazer uma imersão maior na parte prática da linguagem</p><p>juntamente com a aplicação dos conceitos de Orientação a Objetos.</p><p>Objetivos</p><p>» Compreender os conceitos da linguagem de programação Java.</p><p>» Construir programas na linguagem de programação Java usando Orientação a</p><p>Objetos.</p><p>» Identificar o melhor caminho na programação para a solução de um problema.</p><p>7</p><p>Introdução ao Capítulo</p><p>Este primeiro capítulo abordará alguns dos principais conceitos relativos à linguagem de</p><p>programação Java, bem como sua sintaxe, através do estudo dos tipos de dados, entrada/saída</p><p>de dados e operadores, permitindo assim, que os primeiros programas sejam escritos.</p><p>Algumas seções deste capítulo somente receberão o devido formalismo em outro momento,</p><p>quando forem estudados os conceitos de orientação a objetos.</p><p>Objetivos do Capítulo</p><p>» Identificar as características da linguagem de programação Java.</p><p>» Apresentar o ambiente de desenvolvimento.</p><p>» Escrever os primeiros programas na linguagem de programação Java.</p><p>1.1 Características da linguagem Java</p><p>A linguagem Java é uma linguagem Orientada a Objetos (OO) e foi desenvolvida na década</p><p>de 1990 por James Gosling da Sun Microsystems.</p><p>Além da característica de ser uma linguagem orientada a objetos, a linguagem Java tem</p><p>outras características, como, por exemplo:</p><p>» Portabilidade, ou seja, independe da plataforma. O lema é “Write once, run</p><p>everywhere”. Traduzindo: Escreva uma vez e rode (execute) em qualquer lugar.</p><p>Isso significa que um programa escrito na linguagem Java pode ser executado em</p><p>computadores com diferentes sistemas operacionais, como, por exemplo, Windows</p><p>ou Linux.</p><p>1</p><p>CAPÍTULO</p><p>InTRODUçãO À LIngUagEM DE</p><p>PROgRaMaçãO</p><p>8</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>» Grande diversidade disponível de bibliotecas de classes. Ou seja, existe muito recurso</p><p>pronto, evitando, assim, a necessidade de escrevermos o que já foi programado na</p><p>linguagem.</p><p>» Sintaxe simples, se comparada com outras linguagens OO.</p><p>Todo programa em Java deve ter um método main que determina o início da execução do</p><p>programa. Não se preocupe em entender tudo agora sobre o programa do exemplo, o que é</p><p>classe e o que é o método main.</p><p>Exemplo:</p><p>/* Arquivo: PrimeiroProg.java */</p><p>public class PrimeiroProg {</p><p>public static void main(String [] args) {</p><p>System.out.println(“Meu primeiro programa.”);</p><p>} // fim do método main</p><p>} // fim da classe PrimeiroProg</p><p>Importante</p><p>É importante notar que:</p><p>» O método main deve estar dentro de uma classe pública, cujo nome é igual ao nome do arquivo .java.</p><p>» O nome do arquivo com código em java tem extensão .java.</p><p>Apesar de estar apenas começando seus estudos em Java, o que você espera que o programa</p><p>anterior faça ao executar? O programa irá imprimir ou fazer o seguinte print ou impressão</p><p>na tela do computador: Meu primeiro programa.</p><p>Todo programa ou código Java deve ficar dentro de uma classe delimitada por chaves e</p><p>para definir uma classe, usamos uma palavra reservada para esse fim, que é a palavra class.</p><p>Saiba mais</p><p>Os comentários seguem o mesmo padrão de outras linguagens, a saber, as linguagens C e C++:</p><p>/*</p><p>› CPF: 823745967-80, 674124745-56, 278452872-78, ...</p><p>› Data de nascimento: 01/03/1997, 25/06/1995, ...</p><p>› Matrícula: 2016145234, 2015264532, 2015285631, ...</p><p>etc.</p><p>64</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Observe que, a partir desse conjunto de atributos podemos representar todos os alunos.</p><p>» Que comportamentos podemos observar nesses alunos?</p><p>› Inscrever em disciplina</p><p>› Trancar matrícula</p><p>› Consultar nota</p><p>› Consultar frequência</p><p>etc.</p><p>Note que esses comportamentos são comuns a todos os alunos.</p><p>Figura 23. Objetos aluno.</p><p>Fonte: https://www.shutterstock.com/pt/image-photo/happy-young-</p><p>university-students-studying-books-522554425.</p><p>Figura 24. Classe aluno.</p><p>Fonte: elaborada pela autora.</p><p>Classificação</p><p>A criação da classe Aluno a partir dos objetos Aluno ocorre por um processo de abstração,</p><p>de acordo com as características (atributos) e os comportamentos (métodos) dos objetos</p><p>em questão.</p><p>Figura 25. abstraindo para criar a classe.</p><p>Objetos Aluno Classe Aluno</p><p>abstrair</p><p>em</p><p>Fonte: elaborada pela autora.</p><p>65</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>Note que:</p><p>» A classe descreve os atributos e os métodos de um conjunto de objetos.</p><p>» A classe é um molde a partir do qual todos os objetos daquela classe são criados.</p><p>» Cada objeto pertence a uma única classe.</p><p>» A classe é o bloco básico para a construção de programas OO.</p><p>Quando criamos um objeto a partir de uma classe, dizemos que temos uma instância da</p><p>classe.</p><p>Figura 26. Classe aluno e algumas instâncias.</p><p>Fonte: elaborada pela autora.</p><p>Importante</p><p>Um objeto tem valores associados aos atributos da classe à qual ele pertence.</p><p>Abstração é um processo para identificar as características (atributos) e os comportamentos</p><p>(métodos) de um objeto, de acordo com a perspectiva de quem observa esse objeto e do</p><p>contexto onde ele será usado.</p><p>Exemplo: Considerando alunos e um sistema de controle acadêmico, quais das características</p><p>indicadas a seguir são relevantes?</p><p>» Nome</p><p>» CPF</p><p>» Data de nascimento</p><p>66</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>» Matrícula</p><p>» Altura</p><p>» Cor do cabelo</p><p>» Cor dos olhos</p><p>Como o contexto do objeto é um sistema acadêmico, temos que altura, cor do cabelo ou cor</p><p>dos olhos são irrelevantes. Então, para atributos dos objetos de uma classe Aluno teremos,</p><p>das possibilidades listadas acima, o nome, o CPF, a data de nascimento e a matrícula.</p><p>atenção</p><p>As classes são os elementos básicos para construção de programas OO em linguagens como C++, Java e C#. Assim, para</p><p>construir um programa OO devemos, inicialmente, identificar as classes que fazem parte do problema que estamos tentando</p><p>resolver. As técnicas para identificação de classes fogem do escopo deste livro.</p><p>Exemplo: Imagine que desejamos implementar um editor gráfico que irá manipular figuras</p><p>geométricas em um plano cartesiano, como, por exemplo, retângulo, círculo, triângulo etc.</p><p>Quais as classes candidatas para esse projeto?</p><p>» Retângulo.</p><p>» Círculo.</p><p>» Triângulo.</p><p>Tomando por base a implementação da classe Retângulo:</p><p>Quais as características de um retângulo?</p><p>» Base, altura, posição (x,y) no plano, cor da borda, cor de preenchimento, etc.</p><p>Que operações gostaríamos de realizar com o retângulo?</p><p>» Desenhar, mover, rodar, redimensionar, etc.</p><p>Então, vamos começar definindo a classe Retangulo!</p><p>Para criar uma classe precisamos definir o lugar onde iremos colocar essa classe. No Java,</p><p>esse lugar é chamado de pacote.</p><p>Podemos imaginar o pacote como sendo um diretório ou uma pasta onde colocamos a</p><p>classe, sendo que podemos definir quantos pacotes quisermos e ainda, escolher o seu</p><p>nome, pois o nome do pacote é definido pelo próprio desenvolvedor.</p><p>67</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>De acordo com a convenção adotada no Java, os nomes dos pacotes devem ter somente</p><p>letras minúsculas.</p><p>Da mesma forma que podemos ter uma hierarquia de pastas, também podemos ter uma</p><p>hierarquia de pacotes. Assim, quando um pacote está dentro de outro, usamos o ponto (.)</p><p>para definir a hierarquia de pacotes.</p><p>Figura 27. Exemplo de pacote.</p><p>Fonte: elaborada pela autora.</p><p>Na figura anterior, é mostrado o exemplo da classe Pessoa que está dentro do pacote java.</p><p>mhs.unitri.javapos.</p><p>Vimos o que é pacote, mas precisamos saber das possibilidades em relação às classes.</p><p>Como uma classe pode ser?</p><p>» public, private ou package (em termos de visibilidade)</p><p>» abstract</p><p>» final</p><p>Alguns desses tipos serão vistos posteriormente.</p><p>Com relação à visibilidade da classe, temos:</p><p>» public: é visível por qualquer outra classe em qualquer pacote.</p><p>» private: só é visível no arquivo onde foi criada.</p><p>» package: só é visível por outras classes do mesmo pacote. É a visibilidade default</p><p>(não precisa escrever package).</p><p>Voltando para a classe Retangulo, podemos ter:</p><p>package principal;</p><p>public class Retangulo {</p><p>}</p><p>68</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Preferencialmente, toda classe deve ser declarada dentro de um pacote.</p><p>Por ser pública, a classe Retangulo é visualizada por todas as demais classes do sistema.</p><p>Importante</p><p>Quando a linha do package não é escrita, o pacote é o default.</p><p>Agora, é preciso adicionar os atributos e métodos à classe Retangulo!</p><p>3.2 Encapsulamento</p><p>Uma classe encapsula atributos e métodos ocultando os detalhes de implementação dos</p><p>objetos. Ou seja, o encapsulamento consiste em mostrar o que pode ser feito sem informar</p><p>como.</p><p>Princípio do desenvolvimento orientado a objetos:</p><p>» Um objeto deve esconder seus atributos de outros objetos, ou seja, os atributos de</p><p>uns objetos não podem ser manipulados diretamente por outros objetos.</p><p>» Os atributos só podem ser alterados ou consultados pelos métodos do objeto.</p><p>3.3 atributos e construtor</p><p>Anteriormente, vimos que um atributo representa a característica do objeto. Então, como</p><p>representar os atributos de uma classe? Basicamente, declarando-os e indicando a sua</p><p>visibilidade.</p><p>A visibilidade de um atributo pode ser:</p><p>» public: pode ser livremente lido ou alterado por qualquer classe.</p><p>» private: só pode ser lido ou alterado na própria classe, ou seja, esse atributo não é</p><p>visível fora da classe.</p><p>» package: só pode ser lido ou alterado pelas classes do mesmo pacote. É a visibilidade</p><p>default (não precisa escrever package).</p><p>» protected: é um nível intermediário entre o public e o private. Um atributo protected</p><p>pode ser acessado na própria classe, nas classes filhas e por outras classes no mesmo</p><p>pacote, filhas ou não. Será usado ao estudarmos herança.</p><p>69</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>Saiba mais</p><p>Um atributo ainda pode ser static e/ou final.</p><p>Ser static significa que o atributo é da classe e ser final significa que o atributo é constante, ou seja, seu valor inicial não pode</p><p>ser alterado.</p><p>No caso da classe Retangulo, vamos considerar simplificadamente, dois atributos: base e</p><p>altura, ambos do tipo double. Além disso, é importante notar a questão da visibilidade dos</p><p>atributos que, nesse caso, serão private.</p><p>public class Retangulo {</p><p>private float base;</p><p>private float altura;</p><p>}</p><p>Importante</p><p>» Pelo princípio do encapsulamento, que é uma das características de OO, os atributos não devem ser visíveis por nenhum</p><p>objeto que não seja um objeto da própria classe ou de uma classe descendente ou filha (herança).</p><p>» Assim, devemos declarar nossos atributos sempre como protected ou private.</p><p>» Veremos herança em outro capítulo, quando será ensinado protected na prática.</p><p>Um atributo pode ser, explicitamente, inicializado da mesma forma que as variáveis. Note</p><p>que os atributos da classe Retangulo não foram inicializados. O que acontece neste caso? A</p><p>JVM (Java Virtual Machine) os inicializa, automaticamente, com valores default (padrão).</p><p>Importante</p><p>Quais os valores default usados para inicializar os atributos?</p><p>» boolean: false</p><p>» char: ‘\0’ (caracter nulo)</p><p>»</p><p>byte, short, int, long, float, double: 0</p><p>» referência para outro objeto: null</p><p>70</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>A classe é um molde a partir do qual podemos representar objetos reais, como criar os objetos</p><p>da classe Retangulo que terão os atributos base e altura?</p><p>Para criar objetos é preciso que a classe tenha um construtor.</p><p>Vemos que, no caso da classe Retangulo, não há nada escrito além dos atributos. Então, qual</p><p>será o mecanismo para criar objetos desta classe?</p><p>Usar o construtor default ou padrão da classe!</p><p>É o construtor da classe Retangulo que permitirá que retângulos de diferentes bases e alturas</p><p>sejam criados ou construídos.</p><p>Saiba mais</p><p>Veremos, em outro momento, que é possível escrever código no construtor para dizer que queremos criar objetos com</p><p>valores não default para seus atributos.</p><p>Como é o construtor default ou padrão da classe Retangulo, que neste caso, não precisa ser</p><p>explicitado?</p><p>public Retangulo() {</p><p>}</p><p>atenção</p><p>» O nome do construtor é sempre igual ao nome da classe.</p><p>» Os parênteses estão vazios, o que significa que o construtor não recebe nada, ou seja, não tem parâmetros.</p><p>» Dentro das chaves nada está escrito, visto que os atributos da classe serão inicializados com valores default.</p><p>A classe com o construtor padrão ou default:</p><p>public class Retangulo {</p><p>//atributos privados</p><p>private float base;</p><p>private float altura;</p><p>71</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>//construtor padrão ou default</p><p>public Retangulo() {</p><p>}</p><p>}</p><p>Agora veremos como criar retângulos, ou seja, objetos ou instâncias da classe Retangulo.</p><p>Para isso, iremos trabalhar na main. Lembra que é pela main que a execução começa? Note</p><p>que a main sempre será escrita dentro de uma classe pública. Neste caso, será a classe</p><p>TestaRetangulo.</p><p>public class TestaRetangulo {</p><p>public static void main(String[] args) {</p><p>Retangulo r;</p><p>r = new Retangulo();</p><p>}</p><p>}</p><p>Cria um objeto r da classe Retangulo, chamando o construtor no trecho</p><p>Retangulo(). Note o uso do operador new. É ele que permite a criação do</p><p>objeto ou instância da classe.</p><p>Define uma variável r do tipo Retangulo.</p><p>Inicialmente, essa variável não referencia</p><p>nenhum objeto, pois o objeto ainda não foi</p><p>criado.</p><p>Importante</p><p>» O operador new é usado para criar um objeto, ou seja, uma instância de uma classe.</p><p>» Ao declararmos uma variável do tipo de uma classe não estamos criando o objeto em si, mas somente uma referência para</p><p>o objeto.</p><p>» Em Retangulo r; ocorre o que ilustra a figura a seguir:</p><p>Figura 28. ao declarar r.</p><p>?</p><p>r</p><p>Fonte: elaborada pela autora.</p><p>72</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Ou seja, r referencia uma área de memória, sem ainda se ter um objeto da classe Retangulo.</p><p>» Em r = new Retangulo(); a variável r passa a referenciar o objeto criado. E como o construtor é o default, os valores dos</p><p>atributos do objeto são inicializados, na sua criação, com zero.</p><p>Figura 29. Objeto ou instância r com base e altura zero.</p><p>base = 0.0</p><p>altura = 0.0</p><p>r</p><p>Fonte: elaborada pela autora.</p><p>» Um retângulo com base e altura zero deve, após a sua criação, ter os valores de seus atributos ajustados para valores</p><p>realistas. Ou seja, valores maiores que zero. Mas como fazer isso? Usando métodos de acesso.</p><p>» Note que:</p><p>Retangulo r;</p><p>r = new Retangulo();</p><p>equivale a fazer Retangulo r = new Retangulo();</p><p>Podem existir várias formas diferentes de criar um objeto. Assim, podemos ter vários</p><p>construtores diferentes para uma mesma classe.</p><p>Sintaxe simplificada de construtores:</p><p>public NomeDaClasse( <parâmetros> ) {</p><p><corpo do construtor></p><p>}</p><p>Observe que:</p><p>» Construtores não tem nenhum tipo de retorno.</p><p>» Construtores podem receber parâmetros que são usados na inicialização do objeto.</p><p>Vamos escrever um construtor que receba, como parâmetros, os valores da base e da altura:</p><p>73</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>public Retangulo(int x, int y) {</p><p>base = x;</p><p>altura = y;</p><p>}</p><p>Parâmetros: x e y</p><p>Os parâmetros poderiam ter outros nomes, desde</p><p>que seguissem a regra para identificadores</p><p>Atributos: base e altura</p><p>Ao se instanciar a classe Retangulo, ou seja, ao se criar um objeto ou instância da classe</p><p>Retangulo, devem ser passados dois valores: o primeiro irá definir o valor da base e o</p><p>segundo será atribuído à altura.</p><p>Como criar, por exemplo, um retângulo s com base 3.5 e altura 118.3 usando o construtor</p><p>acima? Basta escrever na main:</p><p>Retangulo s = new Retangulo(3.5, 118.3);</p><p>Figura 30. Objeto ou instância s com base e altura previamente definidos.</p><p>base = 3.5</p><p>altura = 118.3</p><p>r</p><p>Fonte: elaborada pela autora.</p><p>Atenção! Se fizermos como mostrado na figura a seguir, ocorrerá erro!</p><p>Figura 31. Erro nas atribuições.</p><p>Fonte: elaborada pela autora.</p><p>É preciso identificar quais são os atributos do objeto e quais são os parâmetros do</p><p>construtor. Para isso, vamos usar a palavra reservada this, que é uma referência para o</p><p>objeto, que nesse caso, está sendo construído.</p><p>74</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Acertando com a referência this, temos:</p><p>public Retangulo(int base, int altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>}</p><p>A referência this é usada para informar que</p><p>estamos acessando os atributos ao invés dos</p><p>parâmetros.</p><p>Veja como estão as classes Retangulo e TestaRetangulo até o momento.</p><p>public class Retangulo {</p><p>//atributos privados</p><p>private double base;</p><p>private double altura;</p><p>//construtor padrão ou default</p><p>public Retangulo() { }</p><p>//outro construtor</p><p>public Retangulo(int base, int altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>}</p><p>} //fim da classe Retangulo</p><p>75</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>public class TestaRetangulo {</p><p>public static void main(String[] args) {</p><p>Retangulo r = new Retangulo();</p><p>Retangulo s = new Retangulo(3.5, 118.3);</p><p>} //fim main</p><p>} //fim da classe TestaRetangulo</p><p>Ambas as classes Retangulo e TestaRetangulo fazem parte de um mesmo projeto de nome</p><p>TestaRetangulo.</p><p>3.4 Métodos de acesso</p><p>Como acessar e alterar os valores dos atributos do objeto r que foi construído com base e</p><p>altura nulas, já que os atributos da classe Retangulo são privados?</p><p>A resposta é:</p><p>Métodos de acesso!</p><p>Métodos de acesso são usados para obter ou alterar atributos e usam os seguintes padrões:</p><p>public tipo get<nome do atributo>()</p><p>{</p><p>return atributo;</p><p>}</p><p>76</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>public void set<nome do atributo>(tipo novoValor)</p><p>{</p><p>atributo = novoValor;</p><p>}</p><p>Observe que os métodos getters irão retornar um valor de acordo com o tipo indicado</p><p>antes do nome do método. Já os setters não retornarão nada (void) e farão atribuições aos</p><p>atributos do objeto, pois recebem valor(es) passado(s) por parâmetro(s).</p><p>No caso da classe Retangulo, precisamos ter acesso à base e à altura para manipular seus</p><p>valores, seja alterando-os ou apenas usando-os. Nesse caso, teremos os métodos:</p><p>» getAltura: para obter o valor da altura.</p><p>» getBase: para obter o valor da base.</p><p>» setAltura: modificar o valor da altura.</p><p>» setBase: modificar o valor da base.</p><p>Veja a classe Retangulo atualizada, com mais esses métodos:</p><p>public class Retangulo {</p><p>//atributos privados</p><p>private double base;</p><p>private double altura;</p><p>//construtor padrão ou default</p><p>public Retangulo() {</p><p>}</p><p>77</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>//outro construtor...não padrão</p><p>public Retangulo(double base, double altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>}</p><p>//métodos de acesso</p><p>public void setAltura(double altura) { this.altura = altura; }</p><p>public void setBase(double</p><p>base) { this.base = base; }</p><p>public double getAltura() { return this.altura; }</p><p>public double getBase() { return this.base; }</p><p>} //fim da classe Retangulo</p><p>Agora é possível alterar e obter os valores dos objetos r e s, criados na classe TestaRetangulo.</p><p>Vejamos algumas possibilidades de uso para os getters e setters:</p><p>public class TestaRetangulo {</p><p>public static void main(String[] args) {</p><p>Retangulo r = new Retangulo(); // cria o retângulo r com base e altura zero</p><p>78</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Retangulo s = new Retangulo(3.5, 118.3); // cria o retângulo s</p><p>//Imprimindo a base e altura de r antes de alterá-los</p><p>System.out.println(“Com os valores default => Base de r = “ + r.getBase()</p><p>+ “ Altura de r = “ + r.getAltura());</p><p>//Alterando os valores dos atributos de r</p><p>r.setAltura(4.0);</p><p>r.setBase(2.5);</p><p>//Imprimindo os dados de r e s</p><p>System.out.println(“Apos alterar => Base de r = “ + r.getBase()</p><p>+ “ Altura de r = “ + r.getAltura());</p><p>System.out.println(“Base de s = “ + s.getBase() + “ Altura de s = “</p><p>+ s.getAltura());</p><p>//baseS e alturaS são duas variáveis locais à main</p><p>double baseS = s.getBase();</p><p>double alturaS = s.getAltura();</p><p>//Imprimindo a área do retângulo s</p><p>System.out.println(“Area de s = “ + (baseS * alturaS));</p><p>} //fim da main</p><p>} //fim da classe TestaRetangulo</p><p>79</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>Importante</p><p>Para chamar um método de uma classe para um objeto da classe, usa-se a regra:</p><p>objeto.método</p><p>No programa acima tivemos as chamadas para os setters e os getters para os objetos r e s da classe Retangulo.</p><p>3.5 Métodos de instância</p><p>Além dos getters e setters, uma classe tem outros métodos que permitirão que os objetos</p><p>ou instâncias da classe realizem as operações dentro do contexto do problema.</p><p>Imagine uma classe Robo, cujos atributos, para simplificar, sejam:</p><p>» marca</p><p>» numSerie (número de série)</p><p>» ano (ano de fabricação)</p><p>» preco (preço do robô)</p><p>Quais seriam os comportamentos desse robô, se fosse um robô voltado para tarefas</p><p>domésticas? Lavar, passar, cozinhar, limpar... Dessa forma, é possível ter, por exemplo, os</p><p>seguintes métodos:</p><p>» lavar;</p><p>» limpar;</p><p>» cozinhar;</p><p>» passar.</p><p>Voltando ao exemplo da classe Retangulo, que comportamentos os objetos ou instâncias</p><p>da classe podem ter?</p><p>Mover, desenhar, redimensionar,</p><p>calcular a área, calcular o perímetro,</p><p>imprimir os valores da base e da altura etc.</p><p>Com os atributos que usamos, vamos escrever os seguintes métodos: calcularArea,</p><p>calcularPerimetro e imprimirDados. Observe a seguir, a versão mais atualizada das classes</p><p>Retangulo e TestaRetangulo:</p><p>80</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>public class Retangulo {</p><p>//atributos privados</p><p>private double base;</p><p>private double altura;</p><p>//construtor padrão ou default</p><p>public Retangulo() { }</p><p>//outro construtor...não padrão</p><p>public Retangulo(double base, double altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>}</p><p>//métodos de acesso</p><p>public void setAltura(double altura) { this.altura = altura; }</p><p>public void setBase(double base) { this.base = base; }</p><p>public double getAltura() { return this.altura; }</p><p>public double getBase() { return this.base; }</p><p>81</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>//outros métodos</p><p>public double calcularArea() { return base * altura; }</p><p>public double calcularPerimetro() { return 2 * base + 2 * altura; }</p><p>public void imprimirDados() {</p><p>System.out.printf(“Base = %.2f Altura = %.2f”, base, altura);</p><p>}</p><p>} //fim da classe Retangulo</p><p>public class TestaRetangulo {</p><p>public static void main(String[] args) {</p><p>Retangulo r = new Retangulo();</p><p>Retangulo s = new Retangulo(3.5, 118.3);</p><p>//Imprimindo a base e altura de r antes de alterá-los</p><p>System.out.println(“Com os valores default => Base de r = “ + r.getBase()</p><p>+ “ Altura de r = “ + r.getAltura());</p><p>82</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>//Alterando os valores dos atributos de r</p><p>r.setAltura(4.0);</p><p>r.setBase(2.5);</p><p>//Imprimindo os dados de r e s</p><p>System.out.println(“Apos alterar => Base de r = “ + r.getBase()</p><p>+ “ Altura de r = “ + r.getAltura());</p><p>System.out.println(“Base de s = “ + s.getBase() + “ Altura de r = “</p><p>+ s.getAltura());</p><p>//baseS e alturaS são duas variáveis locais à main</p><p>double baseS = s.getBase();</p><p>double alturaS = s.getAltura();</p><p>//Imprimindo a área do retângulo s</p><p>System.out.println(“Area de s = “ + (baseS * alturaS));</p><p>//Imprimindo os dados dos retângulos r e s</p><p>System.out.println(“\nDados do retangulo r “);</p><p>r.imprimirDados();</p><p>System.out.println(“\nDados do retangulo s “);</p><p>s.imprimirDados();</p><p>//Imprimindo as áreas e os perímetros, chamando os métodos</p><p>83</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>System.out.println(“\n\nArea de r = “ + r.calcularArea());</p><p>System.out.println(“Area de s = “ + s.calcularArea());</p><p>System.out.println(“\n\nPerimetro de r = “ + r.calcularPerimetro());</p><p>System.out.println(“Perimetro de s = “ + s.calcularPerimetro());</p><p>} //fim da main</p><p>} //fim da classe TestaRetangulo</p><p>3.6 Sobrecarga de métodos e de construtores</p><p>Java permite que tenhamos, na mesma classe, métodos com o mesmo nome, mas com</p><p>parâmetros diferentes. Isso é chamado sobrecarga de métodos (overload de métodos).</p><p>No exemplo da classe Retângulo, podemos definir um método para redimensionar o</p><p>retângulo:</p><p>public void redimensionar(double sx, double sy) {</p><p>if (sx > 0 && sy > 0) {</p><p>base = (int) (sx / 100 * base);</p><p>altura = (int) (sy / 100 * altura);</p><p>}</p><p>}</p><p>Mas é possível escrever, na mesma classe Retangulo, um outro redimensionar que receba</p><p>valores inteiros:</p><p>public void redimensionar(int larg, int alt) {</p><p>if (larg > 0 && alt > 0) {</p><p>largura = larg;</p><p>84</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>altura = alt;</p><p>}</p><p>}</p><p>Os dois métodos para redimensionar o retângulo têm o mesmo nome, mas se diferenciam</p><p>pelos tipos dos parâmetros: double e int.</p><p>A linguagem Java não confunde os dois métodos porque eles têm assinaturas diferentes.</p><p>Assinatura diferente significa que os métodos têm:</p><p>» quantidades de parâmetros diferentes,</p><p>» tipos dos parâmetros diferentes, ou</p><p>» ordem dos parâmetros diferente.</p><p>atenção</p><p>E no seguinte caso:</p><p>public void redimensionar(int larg, int alt) { ... }</p><p>public boolean redimensionar(int larg, int alt) { ... }</p><p>Haverá erro de compilação. Apesar de um método não retornar nada (void) e o outro retornar um boolean, ambos recebem</p><p>dados inteiros. Por essa razão, são considerados métodos iguais.</p><p>Além de sobrecarga de métodos, é possível haver sobrecarga de construtores. Na classe</p><p>Retangulo foram escritos dois construtores que se diferenciavam pelos parâmetros: um</p><p>nada recebia e o outro recebia dois valores do tipo double (base e altura). Reveja apenas o</p><p>trecho da classe com os dois construtores:</p><p>public class Retangulo {</p><p>//atributos privados</p><p>private double base;</p><p>private double altura;</p><p>//construtor padrão ou default</p><p>public Retangulo() { }</p><p>85</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>//outro construtor...não padrão</p><p>public Retangulo(double base, double altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>}</p><p>//métodos de acesso e outros métodos...</p><p>} //fim da classe Retangulo</p><p>3.7 Classes pré-definidas: Math e String</p><p>No Java existe uma classe bastante usada que implementa funções matemáticas chamada</p><p>Math. Todos os métodos dessa classe são estáticos (static), isto é, não dependem de</p><p>nenhum objeto para serem executados.</p><p>public class Math {</p><p>public static double sqrt(double x) { ... }</p><p>public static long round(double x) { ... }</p><p>public static double pow(double x, double y) { ... }</p><p>//Outros métodos</p><p>}</p><p>Importante</p><p>» sqrt é um método estático (static) que deve receber um valor double (veja o parâmetro x) e retornar um valor double.</p><p>» round também é estático, recebe um valor double e retorna um long.</p><p>» pow recebe dois valores do tipo double e retorna um valor double.</p><p>A principal diferença entre os métodos estáticos e os métodos de instância está na sua</p><p>chamada.</p><p>86</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Importante</p><p>Nos métodos estáticos não precisamos do objeto para chamar o método.</p><p>Em vez disso, usamos o próprio nome da classe para denominá-los.</p><p>Exemplos:</p><p>double x = 12.2;</p><p>double y = Math.sqrt(x); // calcula a raiz quadrada de x</p><p>long z = Math.round(y); // arredonda o valor de y</p><p>atenção</p><p>Note como fazer a chamada de um método static: Classe.Método</p><p>Figura 32. Métodos da classe Math.</p><p>Fonte: elaborada pela autora.</p><p>Uma outra classe super importante é a String. A classe String é pré-definida e está na</p><p>biblioteca de classes da linguagem. Portanto, note que a linguagem Java não possui um</p><p>tipo primitivo string como em algumas outras linguagens de programação.</p><p>A declaração de um objeto String segue o mesmo padrão de declaração das variáveis de</p><p>tipos básicos:</p><p>87</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>String mensagem;</p><p>String nome = "Joao da Silva";</p><p>String saudacao = "Olá " + nome;</p><p>String vazia = "";</p><p>A concatenação de strings é feita</p><p>com o operador +</p><p>Importante</p><p>Repare que não precisamos do operador new para criar o objeto String. O Java chama implicitamente esse operador.</p><p>A classe String tem mais de 60 métodos para manipulação de strings. Alguns dos métodos</p><p>mais usados são definidos na figura a seguir:</p><p>Figura 33. Métodos da classe String.</p><p>Fonte: elaborada pela autora.</p><p>Exemplo: Considere o trecho em Java a seguir:</p><p>String str = “Programação Orientada a Objetos”;</p><p>char c;</p><p>boolean ok;</p><p>c = str.charAt(2);</p><p>c = str.charAt(7);</p><p>ok = str.isEmpty();</p><p>88</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Cada caractere possui uma posição dentro da string, que é, na verdade, o índice do elemento.</p><p>O 1º caractere está na posição 0, o 2º caracter na posição 1, o 3º caracter na posição 2 etc.</p><p>Então, podemos visualizar que em</p><p>Programação Orientada a Objetos</p><p>P está na posição 0, r está na posição 1, o está na posição 2, g está na posição 3, e assim</p><p>sucessivamente.</p><p>Analisando o trecho anterior, temos:</p><p>c = str.charAt(2); // c recebe o elemento de índice 2 de str, que é ‘o’</p><p>c = str.charAt(7); //c recebe o elemento de índice 7 de str, que é ‘a’</p><p>ok = str.isEmpty(); // ok recebe false</p><p>Exemplo: Considere o trecho escrito em Java a seguir:</p><p>String str = “Programação Orientada a Objetos”;</p><p>int p;</p><p>p = str.indexOf(‘a’);</p><p>p = str.indexOf(‘O’);</p><p>p = str.indexOf(‘x’);</p><p>p = str.lastIndexOf(‘a’);</p><p>p = str.length();</p><p>String nova = str.replace(‘o’, ‘-’);</p><p>Analisando o trecho anterior, temos:</p><p>p = str.indexOf(‘a’); // p recebe 5</p><p>p = str.indexOf(‘O’); // p recebe 12</p><p>p = str.indexOf(‘x’); // p recebe -1</p><p>p = str.lastIndexOf(‘a’); // p recebe 22</p><p>p = str.length(); // p recebe 31</p><p>89</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>String nova = str.replace(‘o’, ‘-’); // nova é “Pr-gramaçã- Orientada a Objet-s”</p><p>Exemplo: Considere os trechos a seguir:</p><p>String str = “Programação Orientada a Objetos”;</p><p>boolean ok;</p><p>ok = str.startsWith(‘Progra’);</p><p>ok = str.startsWith(‘grama’);</p><p>System.out.println(str.toUpperCase());</p><p>System.out.println(str.substring(0, 6));</p><p>System.out.println(str.substring(3, 8));</p><p>Analisando o trecho anterior, temos:</p><p>ok = str.startsWith(‘Progra’); // ok recebe true</p><p>ok = str.startsWith(‘grama’); // ok recebe false</p><p>System.out.println(str.toUpperCase());</p><p>// é impresso “PROGRAMAÇÃO ORIENTADA A OBJETOS”</p><p>System.out.println(str.substring(0, 6)); //é impresso “Progra”</p><p>System.out.println(str.substring(3, 8)); //é impresso “grama”</p><p>Exemplo: Considere os trechos abaixo em Java:</p><p>90</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>String nome = “ João da Silva “;</p><p>System.out.println(nome.trim());</p><p>System.out.println(nome.trim().toUpperCase());</p><p>Analisando o trecho anterior, temos:</p><p>System.out.println(nome.trim()); // É impresso: “João da Silva”</p><p>System.out.println(nome.trim().toUpperCase());</p><p>// É impresso “JOÃO DA SILVA”</p><p>Importante</p><p>» Strings, em Java, são imutáveis.</p><p>Isso significa dizer que, uma vez criada, não podemos alterar o conteúdo de uma string.</p><p>» Quando usamos um método que “altera” a string, na realidade estamos criando um outro objeto na memória.</p><p>Exemplo:</p><p>String disciplina = "Programação Orientada a Objetos";</p><p>String maiuscula = disciplina.toUpperCase();</p><p>String outra = maiuscula.replace(' ', '-');</p><p>"Programação Orientada a Objetos"</p><p>"PROGRAMAÇÃO ORIENTADA A OBJETOS"</p><p>"PROGRAMAÇÃO-ORIENTADA-A-OBJETOS"</p><p>Um detalhe muito importante da manipulação de strings é em relação à comparação de</p><p>strings. Como strings são objetos, se usarmos os operadores relacionais (==, !=, >, <, >= ou <=)</p><p>estaremos comparando as referências para as strings e não o conteúdo delas.</p><p>Para realizar a comparação do conteúdo devemos usar os métodos:</p><p>» equals()</p><p>» equalsIgnoreCase()</p><p>91</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>» compareTo()</p><p>» compareToIgnoreCase()</p><p>Exemplo: Seja o trecho em Java. Para testar, não esqueça de importar o pacote da classe</p><p>Scanner.</p><p>Scanner t = new Scanner(System.in);</p><p>String nome1 = t.nextLine();</p><p>String nome2 = t.nextLine();</p><p>String nome3 = nome1;</p><p>if (nome1.equals(nome2))</p><p>System.out.println("Igual");</p><p>else</p><p>System.out.println("Diferente");</p><p>Com o método equals() estamos</p><p>comparando os conteúdos.</p><p>Nesse caso vai imprimir "Igual"</p><p>Figura 34. Usando == e != com string.</p><p>"Joao"</p><p>"Joao"</p><p>nome1</p><p>nome3</p><p>nome2</p><p>nome1 == nome3</p><p>nome1 != nome2</p><p>Fonte: elaborada pela autora.</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» Classe é um molde a partir do qual criamos objetos ou instâncias.</p><p>» Todo objeto tem atributos e métodos que serão definidos na classe a qual o objeto pertence.</p><p>» Quanto à visibilidade, uma classe pode ser public, private ou package.</p><p>» As classes podem pertencer a um pacote, mas quando o pacote não é definido temos o default.</p><p>» Uma das características da Orientação a Objetos é o encapsulamento.</p><p>» Quanto à visibilidade, os atributos podem ser public, private, package ou protected.</p><p>» O construtor, sendo default ou não, permite a criação dos objetos.</p><p>» O operador new é usado para a criação de objetos.</p><p>» Para acessar os atributos privados de uma classe podemos contar com os getters e setters.</p><p>» Métodos de instância são usados com objetos criados de alguma classe.</p><p>» A sobrecarga (overload) pode ser de métodos ou de construtores.</p><p>» A classe Math tem vários métodos estáticos (static) que realizam as mais variadas tarefas matemáticas, como, por exemplo,</p><p>calcular a raiz quadrada, arredondamento etc.</p><p>» Para chamar um método static não é preciso instanciar a classe, ou seja, não é preciso criar um objeto da classe.</p><p>» A classe String tem um conjunto variado de métodos, como, por exemplo, pôr em letras maíusculas, pôr em minúsculas,</p><p>calcular o tamanho da string etc.</p><p>92</p><p>Introdução ao</p><p>capítulo</p><p>Neste capítulo você estará diante da criação de programas mais elaborados, através da</p><p>aplicação de conceitos mais aprofundados como, por exemplo, herança e polimorfismo.</p><p>Após este estudo, ficará registrado como a linguagem de programação Java nos permite</p><p>reaproveitar código, possibilitando, dessa forma, ganho de produtividade e tempo.</p><p>Objetivos do capítulo</p><p>» Realizar o estudo de vetor e suas aplicações em programas escritos em Java.</p><p>» Apresentar herança e polimorfismo na teoria e na prática usando a linguagem Java.</p><p>» Apresentar conceitos mais avançados, tais como classe abstrata e interface, na teoria</p><p>e na prática usando a linguagem Java.</p><p>4.1 vetor</p><p>Vetor ou array é um agregado de dados homogêneos, ou seja, dados do mesmo tipo.</p><p>O vetor é armazenado de forma contígua na memória e o acesso a cada elemento se dá através</p><p>do índice do vetor.</p><p>Importante</p><p>Em Java, vetores são objetos.</p><p>Para declarar um vetor, usamos o operador [ ] imediatamente após o tipo desejado. Exemplos:</p><p>int [ ] v;</p><p>float [ ] nota;</p><p>4</p><p>CAPÍTULO</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS</p><p>aPROFUnDaDa</p><p>93</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Outra diferença importante é que, ao declarar um vetor, NÃO definimos o seu tamanho. Isso</p><p>significa dizer que, ao declarar um vetor, o Java NÃO aloca espaço na memória para o vetor.</p><p>float [ ] nota;</p><p>NULO</p><p>Saiba mais</p><p>Outra forma de declarar vetor é colocando os colchetes após o nome da variável.</p><p>Exemplo: int[ ] v; é o mesmo que int v[ ];</p><p>float[ ] nota; é o mesmo que float nota[ ];</p><p>Como vetor é um objeto, precisamos criá-lo com o operador new. É nesse momento que</p><p>definimos o seu tamanho. Exemplo:</p><p>Figura 35. Exemplo de vetor de números reais.</p><p>float[ ] nota;</p><p>nota = new float[10];</p><p>Aqui definimos o</p><p>tamanho do vetor!</p><p>0 1 2 3 4 5 6 7 8 9</p><p>0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0</p><p>O índice</p><p>inicial é</p><p>sempre ZERO.</p><p>O índice final é sempre</p><p>o tamanho do vetor –</p><p>1. No caso, o índice</p><p>final é 9.</p><p>Os elementos do vetor</p><p>são inicializados</p><p>automaticamente da</p><p>mesma forma que os</p><p>atributos das classes.</p><p>Fonte: elaborada pela autora.</p><p>Importante</p><p>O tamanho do vetor pode ser definido usando uma</p><p>constante, variável ou uma expressão.</p><p>94</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Exemplo: Considere um projeto de nome TesteVetor com apenas uma classe, a classe</p><p>TesteVetor. Veja:</p><p>import java.util.Scanner;</p><p>public class TesteVetor {</p><p>public static void main(String[] args) {</p><p>Scanner t = new Scanner(System.in);</p><p>int tam;</p><p>float[ ] v; //declara v como um vetor de float</p><p>System.out.print("Qual o tamanho do vetor? ");</p><p>tam = t.nextInt();</p><p>v = new float[tam];</p><p>} //fim main</p><p>} //fim classe TesteVetor</p><p>Cria o vetor v usando como</p><p>tamanho a variável tam.</p><p>Importante</p><p>Uma vez definido o tamanho do vetor com o operador new não podemos mais alterar esse tamanho.</p><p>Em algumas linguagens, o índice inicial do vetor pode ser negativo. Em Java, no entanto, os</p><p>índices variam de zero em diante. Caso um índice que esteja fora dos limites do vetor seja</p><p>acessado, ocorrerá erro.</p><p>Exemplo: Seja um trecho em Java:</p><p>float [ ] nota;</p><p>nota = new float[10];</p><p>nota[-1] = 7.5;</p><p>nota[10] = 8.0;</p><p>Erro de execução:</p><p>ArrayIndexOutOfBoundsException</p><p>Assim como fazemos com variáveis comuns, também podemos inicializar vetores.</p><p>tipo[ ] nome = { lista de valores };</p><p>onde:</p><p>lista de valores é uma lista cujos elementos são separados por vírgula.</p><p>95</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Exemplos:</p><p>float[ ] nota = { 5.5, 6.5, 7.0, 9.0, 8.0 };</p><p>int[ ] idade = { 30, 22, 45, 12, 65, 48, 72 };</p><p>Cria automaticamente</p><p>um vetor de 5 posições.</p><p>Cria automaticamente</p><p>um vetor de 7 posições.</p><p>Para percorrer individualmente cada elemento do vetor, usamos o comando for.</p><p>O atributo length do vetor pode ser usado para recuperar o tamanho do vetor. Não</p><p>confunda com o método length() da classe String!</p><p>public class Vetor {</p><p>public static void main(String[] args) {</p><p>int[ ] v = { 2, 4, 6, 8, 10 };</p><p>for (int i = 0; i < v.length; i++)</p><p>System.out.println(v[i]);</p><p>v.length recupera o tamanho</p><p>do vetor, que é 5 nesse caso.</p><p>} //fim da main</p><p>} //fim da classe</p><p>Existe uma outra sintaxe do comando for para percorrer vetores: o for-each. Essa forma é</p><p>usada apenas para ler os dados do vetor, mas não serve para alterar os dados do vetor.</p><p>Usando essa nova sintaxe, o programa anterior poderia ser reescrito como:</p><p>public class Vetor {</p><p>public static void main(String[] args) {</p><p>int [ ] v = { 2, 4, 6, 8, 10 };</p><p>for (int n : v)</p><p>System.out.println(n);</p><p>}</p><p>}</p><p>int indica o tipo dos dados</p><p>armazenados no vetor v</p><p>n é uma variável auxiliar que</p><p>percorre o vetor v</p><p>A cada iteração, a variável</p><p>n recebe os valores</p><p>armazenados no vetor v,</p><p>do primeiro até o último.</p><p>96</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Quadro 4. Passo a passo.</p><p>1ª iteração: n = v[0]</p><p>imprimir n, ou seja, 2.</p><p>2ª iteração: n = v[1]</p><p>imprimir n, ou seja, 4.</p><p>3ª iteração: n = v[2]</p><p>imprimir n, ou seja, 6.</p><p>4ª iteração: n = v[3]</p><p>imprimir n, ou seja, 8.</p><p>5ª iteração: n = v[4]</p><p>imprimir n, ou seja, 10.</p><p>Fonte: elaborada pela autora.</p><p>Além de vetor de tipos primitivos (int, float, char...), como mostrado nos exemplos, é possível</p><p>termos vetor de objetos.</p><p>Quando usamos um vetor de objetos, ao criar o vetor não estamos criando os objetos em</p><p>si, apenas referências para os objetos. Além do vetor, cada objeto deve ser criado com o</p><p>operador new.</p><p>Exemplo: Considere um projeto de nome EditorGrafico com as classes EditorGrafico e</p><p>Retangulo (classe do capítulo anterior).</p><p>public class EditorGrafico {</p><p>public static void main(String[ ] args) {</p><p>Retangulo[ ] r; //declara r como vetor de objetos da classe Retangulo</p><p>r = new Retangulo[3]; //cria o vetor r para armazenar até 3 retângulos</p><p>//define cada componente do vetor r</p><p>r[0] = new Retangulo(40, 20);</p><p>r[1] = new Retangulo(20, 20);</p><p>r[2] = new Retangulo(10, 30);</p><p>}</p><p>}</p><p>97</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Figura 36. analisando o programa anterior passo a passo.</p><p>Retangulo [ ] r;</p><p>r = new Retangulo[3];</p><p>r[0] = new Retangulo(40,20);</p><p>r[1] = new Retangulo(20,20);</p><p>r[2] = new Retangulo(10,30);</p><p>Note que r[1] e r[2] são criados de forma análoga a r[0].</p><p>Ao declararmos o vetor, a variável local r</p><p>tem um valor indefinido.</p><p>r</p><p>indefinido !</p><p>Ao criarmos um vetor com 3 posições,</p><p>alocamos espaço para referenciar 3</p><p>retângulos. Essas referências são</p><p>inicializadas com null.</p><p>Atenção! Ainda não temos os</p><p>retângulos!</p><p>null null null</p><p>0 1 2</p><p>r</p><p>null null</p><p>0 1 2</p><p>base = 40</p><p>altura = 20</p><p>r</p><p>Quando criamos o primeiro retângulo,</p><p>este passa a ser referenciado por r[0].</p><p>0 1 2</p><p>base = 40</p><p>altura = 20</p><p>base = 20</p><p>altura = 20</p><p>base = 10</p><p>altura = 30</p><p>r</p><p>Fonte: elaborada pela autora.</p><p>98</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Vamos testar alguns métodos da classe Retangulo com os componentes do vetor r.</p><p>Atualizando a classe EditorGrafico, temos:</p><p>public class EditorGrafico {</p><p>public static void main(String[ ] args) {</p><p>Retangulo[ ] r; //declara r como vetor de objetos da classe Retangulo</p><p>r = new Retangulo[3]; //cria o vetor r</p><p>//define cada componente do vetor r</p><p>r[0] = new Retangulo(40, 20);</p><p>r[1] = new Retangulo(20, 20);</p><p>r[2] = new Retangulo(10, 30);</p><p>// Altera a base e altura do terceiro retângulo</p><p>r[2].setBase(100);</p><p>r[2].setAltura(200);</p><p>//</p><p>Imprimir TODOS os retângulos</p><p>for (int i = 0; i < r.length; i++)</p><p>r[i].imprimirDados();</p><p>} //fim main</p><p>} //fim classe</p><p>4.2 Relacionamento</p><p>Um objeto de uma classe pode estar relacionado a um objeto de outra classe ou a vários</p><p>objetos de outra classe. Ou ainda, vários objetos de uma classe podem estar relacionados a</p><p>vários objetos de outra classe.</p><p>99</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Exemplos:</p><p>» Professor leciona disciplina.</p><p>» Aluno cursa disciplina.</p><p>» Departamento oferece disciplina.</p><p>» Cliente faz pedidos.</p><p>» Transportadora entrega produtos.</p><p>» Ônibus transporta passageiros.</p><p>» Carro tem motor.</p><p>» Jogador faz parte de time.</p><p>» Livro tem capítulos.</p><p>Quando falamos que</p><p>Carro tem motor.</p><p>está sendo dito que Um carro tem um motor. Um objeto da classe Carro está relacionado a</p><p>um objeto da classe Motor. Neste caso, podemos pensar em um esboço da classe Carro da</p><p>seguinte forma:</p><p>public class Carro {</p><p>private String modelo;</p><p>private int ano;</p><p>private Motor motor;</p><p>}</p><p>Note, portanto que, na classe Carro temos um atributo da classe Motor.</p><p>4.3 Herança e Polimorfismo</p><p>Considere as duas classes a seguir:</p><p>100</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Figura 37. Exemplo com as classes Carro e Caminhao.</p><p>public class Carro {</p><p>private String placa;</p><p>private String modelo</p><p>private int anoFabricacao;</p><p>private int kilometragem;</p><p>private int qtdPassageiros;</p><p>private int capacidadeBagagem;</p><p>public float calculaConsumo() {...}</p><p>public float calculaIPVA() {...}</p><p>} //fim Carro</p><p>public class Caminhao {</p><p>private String placa;</p><p>private String modelo</p><p>private int anoFabricacao;</p><p>private int kilometragem;</p><p>private int cargaMaxima;</p><p>private int numeroEixos;</p><p>public float calculaConsumo() {...}</p><p>public float calculaIPVA() {...}</p><p>} //fim Caminhao</p><p>Fonte: elaborada pela autora.</p><p>Definindo dessa forma, teríamos que representar os atributos e métodos comuns nas duas</p><p>classes, o que indica duplicidade de código.</p><p>Uma das características da Orientação a Objetos que vem a sanar a questão acima chama-se</p><p>herança.</p><p>Importante</p><p>» Herança é o mecanismo pelo qual classes herdam atributos e métodos através de um relacionamento hierárquico.</p><p>» Na herança, temos sempre uma classe definida de forma genérica que, posteriormente, é refinada em classes mais</p><p>específicas.</p><p>Exemplos:</p><p>Um professor é um tipo de funcionário.</p><p>Um pentágono é um tipo de polígono.</p><p>Um carro é um tipo de veículo.</p><p>Um notebook é um tipo de computador.</p><p>Classes específicas</p><p>ou subclasses</p><p>Classes genéricas</p><p>ou superclasses</p><p>atenção</p><p>Observe a forma de dizer que uma classe “é um tipo de” outra classe quando configurado o relacionamento hierárquico.</p><p>É possível existirem várias classes específicas para uma mesma classe genérica.</p><p>Veja os exemplos:</p><p>Um professor é um tipo de funcionário.</p><p>Uma secretária é um tipo de funcionário.</p><p>101</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Um diretor é um tipo de funcionário.</p><p>Um pentágono é um tipo de polígono.</p><p>Um hexágono é um tipo de polígono.</p><p>Um carro é um tipo de veículo.</p><p>Um caminhão é um tipo de veículo.</p><p>Como dito antes, as classes específicas (filhas ou subclasses) herdam atributos e métodos</p><p>da sua classe genérica (mãe ou superclasse). Além disso, as classes específicas podem ter</p><p>atributos e métodos somente seus.</p><p>No exemplo:</p><p>Um carro é um tipo de veículo.</p><p>Um caminhão é um tipo de veículo.</p><p>A classe Veiculo vai conter os atributos e métodos comuns a todos os veículos e as classes</p><p>Carro e Caminhao vão conter os atributos e métodos específicos de carros e caminhões,</p><p>respectivamente.</p><p>Redefinindo o exemplo anterior usando herança:</p><p>Figura 38. Classe Veiculo e suas classes filhas Carro e Caminhao.</p><p>public class Carro {</p><p>private int qtdPassageiros;</p><p>private int capacidadeBagagem;</p><p>}</p><p>public class Caminhao {</p><p>private int cargaMaxima;</p><p>private int numeroEixos;</p><p>}</p><p>public class Veiculo {</p><p>protected String placa;</p><p>protected String modelo</p><p>protected int anoFabricacao;</p><p>protected int kilometragem;</p><p>public float calculaConsumo() {...}</p><p>public float calculaIPVA() {...}</p><p>}</p><p>Fonte: elaborada pela autora.</p><p>102</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Outro exemplo:</p><p>Figura 39. Classe Funcionario e suas classes filhas Professor e Diretor.</p><p>public class Professor {</p><p>private String titulacao;</p><p>private int cargaHoraria;</p><p>}</p><p>public class Diretor {</p><p>private float bonus;</p><p>}</p><p>public class Funcionario {</p><p>protected String matricula;</p><p>protected float salario;</p><p>}</p><p>Fonte: elaborada pela autora.</p><p>Em Orientação a Objetos, a herança pode ser:</p><p>» Simples: se a classe herda de apenas uma superclasse ou classe mãe.</p><p>» Múltipla: se a classe herda de diversas superclasses ou classes mães.</p><p>Exemplo: Carro anfíbio é um tipo de carro e barco, ao mesmo tempo.</p><p>O carro anfíbio tem características</p><p>de carro e de barco (herança múltipla).</p><p>Importante</p><p>A linguagem Java não tem herança múltipla, somente herança simples.</p><p>Para definir a herança entre duas classes devemos usar a palavra reservada extends na</p><p>definição da subclasse. Veja a sintaxe:</p><p>public class <nome da classe> extends <nome da superclasse></p><p>Exemplo: Vejamos as classes Veiculo, Carro e Caminhao.</p><p>103</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>public class Veiculo {</p><p>protected String placa;</p><p>protected String modelo;</p><p>protected int anoFabricacao;</p><p>protected int kilometragem;</p><p>public Veiculo(String placa, String modelo,</p><p>int anoFabricacao, int kilometragem)</p><p>{</p><p>this.placa = placa;</p><p>this.modelo = modelo;</p><p>this.anoFabricacao = anoFabricacao;</p><p>this.kilometragem = kilometragem;</p><p>} //fim do construtor</p><p>} //fim da classe Veiculo</p><p>Esboçando a classe Carro:</p><p>public class Carro extends Veiculo {</p><p>private int qtdPassageiros;</p><p>private int capacidadeBagagem;</p><p>}</p><p>Os atributos protected, assim como os</p><p>atributos private, não são visíveis para</p><p>quem usa a classe.</p><p>Os atributos protected são visíveis</p><p>apenas nas subclasses e classes do</p><p>pacote.</p><p>Note que a classe Carro</p><p>possui os atributos:</p><p>• placa</p><p>• modelo</p><p>• anoFabricacao</p><p>• kilometragem</p><p>• qtdPassageiros</p><p>• capacidadeBagagem</p><p>Como ficará o construtor da classe Carro, já que carro é um tipo de veículo?</p><p>Vejamos a versão final da classe Carro:</p><p>public class Carro extends Veiculo {</p><p>private int qtdPassageiros;</p><p>private int capacidadeBagagem;</p><p>public Carro(String placa, String modelo,</p><p>int anoFabricacao, int kilometragem,</p><p>int qtdPassageiros, int capacidadeBagagem)</p><p>104</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>{</p><p>super(placa, modelo, anoFabricacao, kilometragem);</p><p>this.qtdPassageiros = qtdPassageiros;</p><p>this.capacidadeBagagem = capacidadeBagagem;</p><p>} //fim construtor</p><p>} //fim classe Carro</p><p>Importante</p><p>Usamos a notação super() para executar o construtor da superclasse.</p><p>Após o uso de super, os atributos da classe Carro são inicializados no trecho:</p><p>this.qtdPassageiros = qtdPassageiros;</p><p>this.capacidadeBagagem = capacidadeBagagem;</p><p>E como ficará a classe Caminhao que é subclasse de Veiculo? Vejamos:</p><p>public class Caminhao extends Veiculo {</p><p>private long cargaMaxima;</p><p>private int numeroEixos;</p><p>public Caminhao(String placa, String modelo, int anoFabricacao,</p><p>int kilometragem, int cargaMaxima, int numeroEixos)</p><p>{</p><p>super(placa, modelo, anoFabricacao, kilometragem);</p><p>this.cargaMaxima = cargaMaxima;</p><p>this.numeroEixos = numeroEixos;</p><p>} //fim construtor de Caminhao</p><p>} //fim classe Caminhao</p><p>105</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Após o uso de super, os atributos da classe Caminhao são inicializados</p><p>no trecho:</p><p>this.cargaMaxima = cargaMaxima;</p><p>this.numeroEixos = numeroEixos;</p><p>Imagine um projeto de nome TestaVeiculo com as classes:</p><p>» TestaVeiculo (com a main),</p><p>» Veiculo (superclasse ou classe mãe),</p><p>» Carro (subclasse ou classe filha de Veiculo) e</p><p>» Caminhao (subclasse ou classe filha de Veiculo)</p><p>Para testar, podemos criar, por exemplo, dois objetos: ca e cm. Veja!</p><p>Carro ca = new Carro(“KNX-3428”, “Ford Focus”, 2015, 8560, 5, 350);</p><p>Caminhao cm = new Caminhao(“JRT-4983”, “VW Delivery”, 2012,</p><p>126385, 10000, 2);</p><p>Figura 40. visualizando o exemplo anterior.</p><p>placa = "KNX-3428"</p><p>modelo = "Ford Focus"</p><p>anoFabricacao = 2015</p><p>quilometragem = 8560</p><p>qtdPasssageiros = 5</p><p>capacidadeBagagem = 350</p><p>ca</p><p>placa = "JRT-4983"</p><p>modelo = "VW Delivery"</p><p>anoFabricacao = 2012</p><p>quilometragem = 126385</p><p>cargaMaxima = 10000</p><p>numeroEixos = 2</p><p>cm</p><p>Fonte: elaborada pela autora.</p><p>Importante</p><p>Como é possível perceber, herança permite um grande reaproveitamento de código.</p><p>Ao se falar de herança, é preciso aprender o que é polimorfismo. O polimorfismo pode ser</p><p>compreendido como:</p><p>106</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Um mesmo comportamento (método) pode se apresentar</p><p>de forma diferente em classes diferentes.</p><p>Figura 41. De onde vem polimorfismo?</p><p>Poli = vários</p><p>Morfismo = forma</p><p>Fonte adaptada: https://pixabay.com/pt/vectors/l%c3%a2mpada-el%c3%a9trica-id%c3%a9ia-</p><p>ilumina%c3%a7%c3%a3o-1926533/.</p><p>Dentro do contexto de herança, sabemos que quando definimos uma subclasse, ela herdará</p><p>os métodos da superclasse. Entretanto, a subclasse pode redefinir um método herdado, ou</p><p>seja, implementar o método herdado de outra forma.</p><p>Polimorfismo é um mecanismo no qual um método da superclasse é sobrescrito na</p><p>subclasse. Dessa forma, podemos ter o mesmo método implementado de duas ou mais</p><p>formas diferentes. O Java vai decidir qual método será chamado no momento da execução do</p><p>programa (ligação tardia ou late binding).</p><p>Importante</p><p>A palavra reservada super permite chamar o método da classe mãe que está sendo reescrito na classe filha (sobrescrita ou</p><p>overriding).</p><p>Exemplo: Considere as classes Veiculo e Carro já vistas. É possível escrevermos um</p><p>método imprimirDados na classe Veiculo e outro método imprimirDados na classe Carro,</p><p>caracterizando sobrescrita (overriding).</p><p>public class Veiculo {</p><p>protected String placa;</p><p>protected String modelo;</p><p>protected int anoFabricacao;</p><p>protected int kilometragem;</p><p>public Veiculo(String placa, String modelo,</p><p>int anoFabricacao, int kilometragem)</p><p>107</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>{</p><p>this.placa = placa;</p><p>this.modelo = modelo;</p><p>this.anoFabricacao = anoFabricacao;</p><p>this.kilometragem = kilometragem;</p><p>} //fim do construtor</p><p>public void imprimirDados() {</p><p>System.out.println(“Placa = “ + placa + “ Modelo = “ + modelo</p><p>+ “ Ano de fabricação = “ + anoFabricacao</p><p>+ “ Kilometragem= “ + kilometragem);</p><p>} //fim imprimirDados</p><p>} //fim da classe Veiculo</p><p>O método imprimirDados na classe filha Carro pode ser escrito da seguinte forma:</p><p>public void imprimirDados() {</p><p>System.out.println(“ Placa = “ + placa + “ Modelo = “ + modelo</p><p>+ “ Ano de fabricação = “ + anoFabricacao</p><p>+ “ Kilometragem= “ + kilometragem</p><p>+ “ Quantidade de passageiros = “ + qtdPassageiros</p><p>+ “ Capacidade de Bagagem = “ + capacidadeBagagem);</p><p>}</p><p>Observe que os atributos da classe mãe Veiculo estão sendo acessados sem getters, pois os</p><p>atributos de Veiculo são protected.</p><p>É possível, no entanto, escrever uma versão bem melhor do método imprimirDados da</p><p>classe filha Carro, se usarmos super! Veja a seguir a versão mais atualizada da classe Carro:</p><p>108</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>public class Carro extends Veiculo {</p><p>private int qtdPassageiros;</p><p>private int capacidadeBagagem;</p><p>public Carro(String placa, String modelo, int anoFabricacao,</p><p>int kilometragem, int qtdPassageiros, int capacidadeBagagem)</p><p>{</p><p>super(placa, modelo, anoFabricacao, kilometragem);</p><p>this.qtdPassageiros = qtdPassageiros;</p><p>this.capacidadeBagagem = capacidadeBagagem;</p><p>} //fim construtor</p><p>public void imprimirDados() {</p><p>//chama o método imprimirDados da superclasse Veiculo</p><p>super.imprimirDados();</p><p>//imprime os dados específicos de carro</p><p>System.out.println(“ Quantidade de passageiros = “ + qtdPassageiros</p><p>+ “ Capacidade de Bagagem = “</p><p>+ capacidadeBagagem);</p><p>} //fim imprimirDados</p><p>} //fim classe Carro</p><p>109</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Exemplo:</p><p>public class Animal {</p><p>public void emiteSom() { System.out.println("???"); }</p><p>} //fim da classe Animal</p><p>public class Gato extends Animal {</p><p>}</p><p>public class Cachorro extends Animal {</p><p>public void emiteSom() { System.out.println("latido"); }</p><p>} //fim da classe Cachorro</p><p>Vamos testar? Para isso, considere que foi criado o projeto Teste com as classes Teste</p><p>(com a main), Animal, Gato e Cachorro.</p><p>public class Teste {</p><p>public static void main(String[] args) {</p><p>Animal a1 = new Animal();</p><p>Gato a2 = new Gato();</p><p>Cachorro a3 = new Cachorro();</p><p>a1.emiteSom();</p><p>a2.emiteSom();</p><p>a3.emiteSom();</p><p>} //fim main</p><p>} //fim classe Teste</p><p>Método original</p><p>Método emiteSom() é sobrescrito.</p><p>Note que a assinatura do método</p><p>continua a mesma.</p><p>Saída do programa:</p><p>???</p><p>???</p><p>latido</p><p>Exemplo: E se usarmos o exemplo anterior com uma nova versão da classe Gato conforme</p><p>indicado a seguir?</p><p>public class Gato extends Animal {</p><p>public void emiteSom() {</p><p>System.out.println(“miado”);</p><p>}</p><p>} //fim Gato</p><p>110</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Neste caso, a saída será outra:</p><p>Figura 42. Qual é a saída do programa?</p><p>???</p><p>miado</p><p>latido</p><p>Fonte: elaborada pela autora.</p><p>Exemplo: Considere a seguinte versão da classe Teste, a última versão da classe Gato e a</p><p>versão da classe Cachorro já vista.</p><p>public class Teste {</p><p>public static void main(String[] args) {</p><p>Animal a1 = new Animal();</p><p>Animal a2 = new Gato();</p><p>Animal a3 = new Cachorro();</p><p>a1.emiteSom();</p><p>a2.emiteSom();</p><p>a3.emiteSom();</p><p>} //fim main</p><p>} //fim classe Teste</p><p>Saída do programa:</p><p>???</p><p>miado</p><p>latido</p><p>atenção</p><p>Apesar das variáveis a2 e a3 serem do tipo Animal, elas referenciam instâncias de Gato e Cachorro.</p><p>Assim, o Java decide qual método emiteSom() chamar baseado na instância que está sendo referenciada e não no tipo da</p><p>variável.</p><p>Exemplo: Considere as classes Animal, Gato (última versão) e Cachorro já vistas, mas uma</p><p>nova classe Teste como mostrado a seguir:</p><p>public class Teste {</p><p>public static void main(String[] args) {</p><p>Animal a;</p><p>a = new Animal();</p><p>a.emiteSom();</p><p>a = new Gato();</p><p>a.emiteSom();</p><p>a = new Cachorro();</p><p>a.emiteSom();</p><p>} //fim main</p><p>} //fim Teste</p><p>Saída do programa:</p><p>???</p><p>miado</p><p>latido</p><p>111</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Exemplo: Ainda considerando as classes Animal, Gato (última versão) e Cachorro já vistas,</p><p>segue uma nova versão da classe Teste usando vetor.</p><p>public class Teste {</p><p>public static void main(String[] args) {</p><p>Animal [ ] v = new Animal[3];</p><p>v[0] = new Animal();</p><p>v[1] = new Gato();</p><p>v[2] = new Cachorro();</p><p>for (int i = 0; i < v.length; i++)</p><p>v[i].emiteSom();</p><p>}</p><p>}</p><p>Note que o vetor é de Animal.</p><p>Entretanto, o vetor pode receber</p><p>instâncias das subclasses de</p><p>Animal (Gato e Cachorro).</p><p>Note que v[i] primeiro referencia</p><p>uma instância de Animal, depois</p><p>uma instância de Gato e, por último,</p><p>uma instância de Cachorro.</p><p>atenção</p><p>No momento da execução, o Java verifica o objeto referenciado por v[i] e decide qual método emiteSom() deve ser chamado.</p><p>Por isso, chama-se de ligação tardia.</p><p>Não confunda sobrecarga (overloading) com sobrescrita (overriding)!</p><p>Veja os exemplos na figura a seguir:</p><p>Figura 43. Exemplo de sobrecarga e sobrescrita.</p><p>public class Teste {</p><p>public void imprime() {</p><p>System.out.println("*");</p><p>}</p><p>public void imprime(int n) {</p><p>for (int i = 1; i <= n; i++)</p><p>System.out.println("*");</p><p>}</p><p>} //fim Teste</p><p>public class Animal {</p><p>public void emiteSom() {</p><p>System.out.println("???");</p><p>}</p><p>} //fim Animal</p><p>public class Gato extends Animal {</p><p>public void emiteSom() {</p><p>System.out.println("miado");</p><p>}</p><p>} //fim Gato</p><p>public class Cachorro extends Animal {</p><p>public void emiteSom() {</p><p>System.out.println("latido");</p><p>}</p><p>} //fim Cachorro</p><p>Fonte: elaborada pela autora.</p><p>112</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Importante</p><p>Existem diferenças fundamentais entre os conceitos OO de sobrecarga e sobrescrita como mostra o quadro a seguir:</p><p>Quadro 5. Sobrecarga x Sobrescrita.</p><p>Característica Sobrecarga Sobrescrita</p><p>Termo em inglês Overload. Override.</p><p>Local Métodos da mesma classe. Métodos em classes diferentes em uma</p><p>hierarquia de classes.</p><p>assinatura Métodos com assinaturas diferentes. Métodos com a mesma assinatura.</p><p>Chamada do método Em tempo de compilação ou ligação</p><p>precoce (early binding).</p><p>Em tempo de execução ou ligação tardia</p><p>(late binding).</p><p>Fonte: elaborado pela autora.</p><p>Exemplo: Uma outra maneira de programar a main da classe Teste é usando o comando</p><p>for-each e o operador instanceof.</p><p>public class Teste {</p><p>public static void main(String[] args) {</p><p>Animal [ ] v = new Animal[3];</p><p>v[0] = new Animal()</p><p>v[1] = new Gato();</p><p>v[2] = new Cachorro();</p><p>for (Animal a : v)</p><p>{</p><p>if (a instanceof Gato)</p><p>System.out.println("Eu sou um gato");</p><p>else if (a instanceof Cachorro)</p><p>System.out.println("Eu sou um cachorro");</p><p>a.emiteSom();</p><p>}</p><p>}</p><p>}</p><p>Saída:</p><p>???</p><p>Eu sou um gato</p><p>miado</p><p>Eu sou um cachorro</p><p>latido</p><p>atenção</p><p>A linha for (Animal a : v)</p><p>indica que “para cada a da classe Animal em v faça” ou</p><p>“para cada Animal a em v faça”</p><p>Veja que o vetor foi percorrido sem uso de índice.</p><p>Para verificarmos a instância referenciada por uma variável, em tempo de execução, usamos</p><p>o operador instanceof.</p><p>113</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Traduzindo: instância de</p><p>Vejamos o que acontece em cada if:</p><p>1º. if : se a é instância de Gato</p><p>2º. if : se a é instância de Cachorro</p><p>Sintaxe: <variável> instanceof <nome da classe></p><p>4.4 Classe abstrata</p><p>Considerando as classes Veiculo, Carro e Caminhao já estudadas, vimos que:</p><p>» Carro é um tipo de veículo.</p><p>» Caminhão é um tipo de veículo.</p><p>» Veículo tem placa, modelo e ano de fabricação</p><p>Agora, imagine uma concessionária e procure responder às seguintes perguntas:</p><p>» Se algum cliente entrar na concessionária e pedir para comprar um veículo, o</p><p>vendedor saberá o que deve vender?</p><p>» Se a concessionária anunciar que está vendendo um veículo, o cliente tem condições</p><p>de saber exatamente o que está comprando?</p><p>Isso ocorre porque Veiculo é uma abstração para Carro e Caminhao.</p><p>Classes Abstratas são classes que representam abstrações (conceitos) e não objetos</p><p>concretos do mundo que estamos representando. Elas são usadas como moldes para a</p><p>criação de outras classes e podem conter atributos e métodos.</p><p>No exemplo da concessionária, Veiculo é uma classe abstrata. Note que Veiculo define um</p><p>molde a partir do qual as classes concretas Carro e Caminhao são definidas.</p><p>Vejamos outros exemplos nas figuras a seguir:</p><p>Figura 44. Classe abstrata Poligono.</p><p>Poligono</p><p>Triangulo Retangulo Pentagono</p><p>Fonte: elaborada pela autora.</p><p>114</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Figura 45. Classes abstratas em laranja e classes concretas em amarelo.</p><p>Animal</p><p>Vertebrado Invertebrado</p><p>Mamifero Oviparo</p><p>Gato Cachorro Galinha Pombo</p><p>Fonte: elaborada pela autora.</p><p>E como indicar, durante a programação, que uma classe é abstrata? Usando a palavra</p><p>reservada abstract.</p><p>Importante</p><p>Classes abstratas são definidas em Java com o uso da palavra abstract na sua definição.</p><p>Exemplo: Considere a classe abstrata Veiculo</p><p>public abstract class Veiculo {</p><p>protected String modelo;</p><p>protected int anoFabricacao;</p><p>public Veiculo(String modelo, int anoFabricacao) {</p><p>this.modelo = modelo;</p><p>this.anoFabricacao = anoFabricacao;</p><p>} //fim construtor Veiculo</p><p>} //fim classe Veiculo</p><p>115</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Importante</p><p>Por não representarem elementos concretos, não é possível criar objetos a partir de classes abstratas. Ou seja, não é possível</p><p>instanciar uma classe abstrata.</p><p>Exemplo: Se na main, em uma classe de teste, fizermos:</p><p>Veiculo v = new Veiculo(“gol”, 2011);</p><p>ocorrerá erro de compilação.</p><p>atenção</p><p>Quando definimos uma classe abstrata, muitas vezes nos deparamos com métodos que fazem sentido para aquela classe,</p><p>mas não temos como implementá-lo, porque a classe abstrata representa apenas uma abstração.</p><p>Exemplo:</p><p>public abstract class Poligono {</p><p>public double area() {</p><p>???????</p><p>}</p><p>}</p><p>O cálculo da área de um</p><p>polígono faz sentido, mas</p><p>como implementar esse</p><p>cálculo aqui?</p><p>Então, neste caso, o método area é um método abstrato.</p><p>A versão atualizada da classe abstrata Poligono é a seguinte:</p><p>public abstract class Poligono {</p><p>public abstract double area();</p><p>}</p><p>Métodos abstratos não</p><p>têm implementação!</p><p>Importante</p><p>As classes concretas que herdam da classe abstrata devem, obrigatoriamente, implementar os métodos abstratos.</p><p>Exemplo: Imagine um projeto Java com a classe abstrata Poligono (última versão do</p><p>exemplo anterior) e a classe Retangulo a seguir:</p><p>116</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>public class Retangulo extends Poligono {</p><p>private double base, altura;</p><p>public Retangulo (double base, double altura) {</p><p>this.base = base;</p><p>this.altura = altura;</p><p>} //fim do construtor Retangulo</p><p>public double area() { return base * altura; }</p><p>} //fim da classe Retangulo</p><p>As classes concretas que</p><p>herdam de Poligono devem</p><p>implementar o método area</p><p>4.5 Interface</p><p>Imagine que analisamos o domínio de um problema e chegamos a três hierarquias mostradas</p><p>nas figuras a seguir:</p><p>Figura 46. Classe mãe Cliente e classes filhas ClientePF e ClientePJ.</p><p>Cliente</p><p>ClientePF ClientePJ</p><p>Fonte: elaborada pela autora.</p><p>Figura 47. Classe mãe Funcionario e filhas Diretor, Secretaria e Vendedor.</p><p>Funcionario</p><p>Diretor Secretaria Vendedor</p><p>Fonte: elaborada pela autora.</p><p>117</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>Figura 48. Classe mãe Fornecedor.</p><p>Fornecedor</p><p>Fornecedor</p><p>Internacional</p><p>Fornecedor</p><p>Nacional</p><p>Fonte: elaborada pela autora.</p><p>Note que, Cliente, Funcionario e Fornecedor precisam acessar o sistema usando um login</p><p>e uma senha. Por esta razão, é preciso implementar um método para verificar se, dado um</p><p>login e uma senha, esse usuário tem acesso ao sistema.</p><p>Além disso, considere que o algoritmo de autenticação do cliente é diferente do algoritmo de</p><p>autenticação do funcionário, que, por sua vez, é diferente do algoritmo de autenticação do</p><p>fornecedor.</p><p>Neste caso específico, o que se quer é que as classes Cliente, Funcionario e Fornecedor</p><p>implementem o método:</p><p>boolean autenticar(String login, String senha)</p><p>Apesar de serem classes</p><p>distintas, espera-se que todas as três classes sigam esse padrão</p><p>para autenticar os usuários, recebendo o login e a senha. Por esta razão, vamos definir uma</p><p>interface que todas essas classes devem implementar.</p><p>O método autenticar será implementado de forma diferente em cada caso, mas terá a mesma</p><p>assinatura.</p><p>atenção</p><p>Não confunda interface com interface gráfica. Interface gráfica lida com botão, caixas de texto etc.</p><p>A definição de interface é parecida com a de uma classe, mas note que ela não implementa</p><p>os métodos! Observe a interface Autenticavel a seguir:</p><p>public interface Autenticavel {</p><p>public boolean autenticar(String login, String senha);</p><p>}</p><p>118</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Repare que a interface só expõe o que o objeto deve fazer, e não como ele faz. Como ele faz</p><p>vai ser definido em uma implementação dessa interface, em cada classe que implementar</p><p>esta interface.</p><p>Assim como as classes, uma interface deve estar em um arquivo próprio, com o mesmo</p><p>nome da interface.</p><p>Exemplo: Considerando as classes Cliente e Funcionario das figuras anteriores, temos:</p><p>public class Cliente implements Autenticavel {</p><p>//considere código aqui</p><p>}</p><p>public class Funcionario implements Autenticavel {</p><p>//considere código aqui</p><p>}</p><p>atenção</p><p>Uma classe define que vai implementar</p><p>uma interface através da palavra implements.</p><p>Uma classe pode implementar várias interfaces. É só separar os nomes das interfaces por</p><p>vírgula. Exemplo:</p><p>public class Funcionario implements Autenticavel, Ordenacao {</p><p>//considere código aqui</p><p>}</p><p>atenção</p><p>É permitido que uma mesma classe use o extends e o implements ao mesmo tempo.</p><p>Ao implementar uma interface, a classe é obrigada a definir e, de preferência, implementar</p><p>todos os métodos definidos na interface, o que é semelhante ao conceito de método abstrato.</p><p>public class Cliente implements Autenticavel {</p><p>119</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>public boolean autenticar(String login, String senha) {</p><p>// aqui escreve o código que implementa o método</p><p>// para o cliente</p><p>}</p><p>}</p><p>public class Funcionario implements Autenticavel {</p><p>public boolean autenticar(String login, String senha) {</p><p>// aqui escreve o código que implementa o método</p><p>// para o funcionário</p><p>}</p><p>}</p><p>atenção</p><p>Interfaces não são classes.</p><p>Então, não é possível criar objetos usando interfaces.</p><p>Interfaces definem comportamentos que devem ser implementados.</p><p>Exemplo:</p><p>Autenticavel a;</p><p>a = new Autenticavel();</p><p>Erro de compilação.</p><p>Entretanto, é possível ter variáveis do tipo da interface referenciando objetos.</p><p>Exemplo:</p><p>Autenticavel a;</p><p>a = new Cliente();</p><p>a.autenticar(“joao”, “123”);</p><p>120</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Veja a figura 49 para saber o que pode e o que não pode ao definir uma interface.</p><p>Figura 49. Regras para definição de interfaces.</p><p>Interfaces não podem ter construtores.</p><p>Interfaces só podem ter membros públicos. Logo, private e</p><p>protected não são permitidos.</p><p>Interfaces não podem implementar métodos, somente</p><p>defini-los.</p><p>Interfaces não podem ter atributos, somente constantes</p><p>estáticas.</p><p>Uma interface pode estender outra interface (use extends)</p><p>para criar uma hierarquia de interfaces.</p><p>Fonte: elaborada pela autora.</p><p>atenção</p><p>As constantes definidas em uma interface são herdadas pelas classes que implementam essa interface. Entretanto, como elas</p><p>são públicas, podem ser usadas em qualquer lugar.</p><p>Para facilitar o seu aprendizado...</p><p>» Projeto TestaProfessor com as classes TestaProfessor (com a main) e Professor.</p><p>» Objetivo: Trabalhar com vetor de objetos.</p><p>» Observação: A classe Professor a seguir é praticamente a que foi estudada no vídeo da</p><p>Aula 3.</p><p>public class Professor {</p><p>//atributos privados</p><p>private int matricula;</p><p>private double salario;</p><p>121</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>private String nome;</p><p>private String titulacao;</p><p>//construtor</p><p>public Professor(int matricula, double salario, String nome, String titulacao) {</p><p>this.matricula = matricula;</p><p>this.salario = salario;</p><p>this.nome = nome;</p><p>this.titulacao = titulacao;</p><p>}</p><p>//métodos</p><p>public void setMatricula(int matricula) { this.matricula = matricula; }</p><p>public void setSalario(double salario) { this.salario = salario; }</p><p>public void setNome(String nome) { this.nome = nome; }</p><p>public void setTitulacao(String titulo) { this.titulacao = titulo; }</p><p>public int getMatricula() { return matricula; }</p><p>public double getSalario() { return this.salario; }</p><p>122</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>public String getNome() { return nome; }</p><p>public String getTitulacao() { return titulacao; }</p><p>public void imprimir() {</p><p>System.out.print(“\n” + titulacao.toUpperCase() + “ “ + nome</p><p>+ “ de matricula “ + matricula);</p><p>System.out.printf(“ recebe R$ %.2f de salario mensal\n”, salario);</p><p>} //fim imprimir</p><p>} //fim da classe Professor</p><p>import java.util.Scanner;</p><p>public class TestaProfessor {</p><p>public static void main(String[] args) {</p><p>int mat;</p><p>float salario;</p><p>String nome, titulo;</p><p>Scanner teclado = new Scanner(System.in);</p><p>Professor v[ ] = new Professor[3];</p><p>System.out.println(“\n\nEntrada de dados dos professores”);</p><p>123</p><p>CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa • CAPÍTULO 4</p><p>for(int i = 0; i < v.length; i++) {</p><p>System.out.print(“Matricula: “);</p><p>mat = teclado.nextInt();</p><p>teclado.nextLine(); //Atenção! Ver comentário adiante!</p><p>System.out.print(“Nome: “);</p><p>nome = teclado.nextLine();</p><p>System.out.print(“Titulacao: “);</p><p>titulo = teclado.nextLine();</p><p>System.out.print(“Salario: “);</p><p>salario = teclado.nextFloat();</p><p>v[i] = new Professor(mat,salario,nome,titulo);</p><p>}</p><p>System.out.println(“\nSaida de dados dos professores\n”);</p><p>for(int i = 0; i < v.length; i++) {</p><p>System.out.println(“Professor(a) “ + v[i].getTitulacao() +</p><p>“ “ + v[i].getNome() + “ de matricula “ +</p><p>v[i].getMatricula() + “ recebe “ +</p><p>v[i].getSalario() + “ por mes.\n”);</p><p>}// fim do for</p><p>} //fim main</p><p>} //fim classe TestaProfessor</p><p>atenção</p><p>A linha teclado.nextLine(); foi necessária para, durante a execução, ler o enter acionado logo após a entrada da matrícula.</p><p>Caso isso não fosse feito, não seria possível digitar com o nome.</p><p>124</p><p>CAPÍTULO 4 • CLaSSES E OBJETOS: UMa vISãO MaIS aPROFUnDaDa</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» Vetor ou array é um agregado de dados homogêneos, ou seja, dados do mesmo tipo, dispostos de forma contígua na</p><p>memória.</p><p>» Cada componente do vetor é acessado via índice.</p><p>» Os índices de um vetor em Java variam de zero em diante.</p><p>» Em Java, vetores são objetos. Por isso, usa-se o new para criá-los.</p><p>» Os vetores em Java podem ser de tipos primitivos (int, float, double ...) ou de objetos.</p><p>» Um ou vários objetos de uma classe podem estar relacionados com um ou vários objetos de outra classe.</p><p>» Herança é o mecanismo pelo qual classes herdam atributos e métodos por meio de um relacionamento hierárquico,</p><p>garantindo reaproveitamento de código.</p><p>» Em herança existem as classes genéricas (superclasses ou classes mães) e as classes específicas (subclasses ou classes</p><p>filhas).</p><p>» Herança pode ser simples ou múltipla. No entanto, Java não tem herança múltipla.</p><p>» Para definir a herança entre duas classes devemos usar a palavra reservada extends na definição da subclasse.</p><p>» A palavra reservada super permite chamar o construtor da classe mãe dentro do construtor da classe filha, possibilitando</p><p>reaproveitamento de código.</p><p>» A palavra reservada super permite também chamar o método da classe mãe que está sendo reescrito na classe filha,</p><p>possibilitando reaproveitamento de código.</p><p>» Polimorfismo</p><p>pode ser compreendido como um mesmo comportamento (método) pode se apresentar de forma diferente</p><p>em classes diferentes.</p><p>» Polimorfismo é um mecanismo no qual um método da superclasse é sobrescrito na subclasse.</p><p>» Sobrecarga e sobrescrita são conceitos distintos.</p><p>» Classes abstratas são usadas como moldes para a criação de outras classes e podem conter atributos e métodos.</p><p>» Classes abstratas não podem ser instanciadas.</p><p>» Usa-se a palavra reservada abstract para definir uma classe abstrata.</p><p>» Interfaces só expõem o que o objeto deve fazer, e não como ele faz.</p><p>» Interfaces não são classes. Portanto, não podem ser instanciadas.</p><p>» Uma classe define que vai implementar uma interface por meio da palavra implements.</p><p>» É possível uma classe herdar de uma classe mãe e implementar uma ou mais interfaces.</p><p>125</p><p>Introdução do capítulo</p><p>Neste capítulo estaremos diante de vários tipos de erros. Dentre eles, erros que podem</p><p>ocorrer durante a execução do programa e que, normalmente, fogem do nosso controle.</p><p>Imagine um programa que irá ler a sua idade, mas você sem querer, digita o seu nome. O que</p><p>ocorrerá? Uma exceção.</p><p>Objetivos do capítulo</p><p>» Conceituar exceção.</p><p>» Apresentar as principais classes de exceções.</p><p>» Tratar exceções.</p><p>5.1 Conceitos</p><p>Como tratar, em Java, por exemplo, as seguintes situações?</p><p>» Divisão por zero.</p><p>» Erro na conversão de tipos. Por exemplo, converter uma string que só contém letras</p><p>em um número inteiro.</p><p>Todas essas situações em Java são chamadas de exceções e existe um mecanismo específico</p><p>para tratá-las chamado de tratamento de exceções.</p><p>As exceções em Java estão organizadas em uma hierarquia de classes, como ilustrado pela</p><p>figura a seguir.</p><p>5CAPÍTULO</p><p>TRaTaMEnTO DE EXCEçÕES</p><p>126</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>Figura 50. Hierarquia de exceções.</p><p>Fonte: elaborada pela autora.</p><p>A partir da figura anterior vemos que, no topo da hierarquia, está a classe Throwable e</p><p>depois surgem dois grandes ramos de classes de exceção: o da classe Error e o da classe</p><p>Exception.</p><p>Um Error ocorre devido a problemas no sistema operacional (SO), na JVM ou no</p><p>hardware. Nesse caso, o melhor a fazer é deixar a JVM encerrar o programa.</p><p>O nosso interesse está na classe Exception. Essa é a classe mãe de todas as exceções que</p><p>nossos programas podem tratar. Ela está subdividida em dois ramos:</p><p>» RuntimeException:</p><p>› Pode ocorrer devido a um erro de programação, como, por exemplo: divisão por</p><p>zero, índice inválido do vetor, acesso a objeto nulo etc.</p><p>› Também são chamadas de exceções não verificadas (unchecked).</p><p>» Demais exceções:</p><p>› Ocorrem devido a um erro no programa causado por fatores externos, como, por</p><p>exemplo: erro na abertura de um arquivo, erro na impressão etc.</p><p>› Também são chamadas de exceções verificadas (checked).</p><p>Exemplo: Considere as classes públicas DividePorZero e TesteExcecao, cada uma em um</p><p>arquivo .java. Quando executamos o programa a seguir, observamos uma mensagem de</p><p>erro, visto que não é possível calcular divisão por zero.</p><p>1 public class DividePorZero {</p><p>127</p><p>TRaTaMEnTO DE EXCEçÕES • CAPÍTULO 5</p><p>2 public void exec(){</p><p>3 System.out.println(3/0);</p><p>4 System.out.println(«imprime»);</p><p>5 }</p><p>6 }</p><p>1 public class TesteExcecao {</p><p>2 public static void main(String args[]) {</p><p>3 DividePorZero d = new DividePorZero();</p><p>4 d.exec();</p><p>5 }</p><p>6 }</p><p>Como o programa não está tratando essa exceção (divisão por zero), o tratador padrão do</p><p>Java executa as seguintes tarefas:</p><p>» Imprime o nome da exceção e a mensagem de erro.</p><p>» Imprime a pilha de execução (sequência de chamadas dos métodos).</p><p>» Termina o programa.</p><p>Veja mais detalhadamente:</p><p>Figura 51. Entendendo uma exceção.</p><p>Exception in thread "main" java.lang.ArithmeticException: / by zero</p><p>at DividePorZero.exec(DividePorZero.java:3)</p><p>at TesteExcecao.main(TesteExcecao.java:4)</p><p>Esse é o nome da exceção</p><p>que ocorreu.</p><p>Essa é a pilha de execução, ou</p><p>seja, a sequência de chamadas dos</p><p>métodos exec (da classe</p><p>DividePorZero) e main (da classe</p><p>TesteExcecao) .</p><p>Essa é a descrição da</p><p>exceção, ou seja, a</p><p>mensagem de erro.</p><p>Fonte: elaborada pela autora.</p><p>128</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>5.2 Implementando tratadores de exceção</p><p>O tratamento de exceções é um mecanismo que permite que o programa defina como as</p><p>situações inesperadas serão tratadas.</p><p>Existem três comandos relacionados ao tratamento de exceções:</p><p>» Blocos try...catch...finally</p><p>» Comando throws</p><p>» Comando throw</p><p>Veremos agora o bloco try ...catch...</p><p>Figura 52. Entendendo o try...catch...</p><p>try {</p><p>// Código que pode gerar uma</p><p>// exceção</p><p>} catch (Exception e) {</p><p>// Código que será executado quando ocorrer a exceção</p><p>}</p><p>Se ocorrer uma exceção no bloco</p><p>do try então a execução é</p><p>automaticamente desviada para o</p><p>bloco catch.</p><p>No catch devemos definir a</p><p>exceção a ser tratada. Quando</p><p>definimos uma exceção estamos</p><p>tratando também todas as suas</p><p>subclasses.</p><p>A variável é</p><p>referência a</p><p>exceção que</p><p>ocorreu. Com ela é</p><p>possível acessar as</p><p>informações sobre</p><p>essa exceção.</p><p>Fonte: elaborada pela autora.</p><p>Saiba mais</p><p>try significa tentar;</p><p>catch significa capturar ou pegar.</p><p>129</p><p>TRaTaMEnTO DE EXCEçÕES • CAPÍTULO 5</p><p>A classe Exception implementa alguns métodos que podemos executar em nossos</p><p>programas. Dentre eles está o método:</p><p>» getMessage() que retorna a mensagem de erro armazenada na exceção. Nem toda</p><p>exceção tem mensagem de erro (nesse caso o método retorna null).</p><p>Exemplo: Considere um trecho em Java que trata uma única exceção.</p><p>import java.util.Scanner;</p><p>public class TesteExcecaoEx {</p><p>public static void main(String args[]) {</p><p>int a, b, c;</p><p>Scanner t = new Scanner(System.in);</p><p>try {</p><p>System.out.print("Digite um valor inteiro: ");</p><p>a = t.nextInt();</p><p>System.out.print("Digite outro valor inteiro: ");</p><p>b = t.nextInt();</p><p>c = a / b;</p><p>System.out.printf("%d / %d = %d\n", a, b, c);</p><p>} catch(Exception e) {</p><p>System.out.printf("Erro: %s\n", e.getMessage());</p><p>}</p><p>} //fim main</p><p>} // fim classe</p><p>Que exceções podem ocorrer?</p><p>1. Usuário digitar um valor</p><p>inválido para a</p><p>2. Usuário digitar um valor</p><p>inválido para b</p><p>3. Usuário digitar ZERO para b</p><p>Vamos testar cada caso mencionado acima. Veja:</p><p>» Exceção 1: Foi digitado um valor não inteiro, como mostra a figura a seguir. Nesse</p><p>caso, a variável a não poderá receber a letra r e ocorrerá desvio na execução para o</p><p>bloco do catch a fim de capturar a exceção. Por fim, uma mensagem é impressa</p><p>usando getMessage e o objeto e.</p><p>Figura 53. Tela de saída para a entrada r.</p><p>Fonte: elaborada pela autora.</p><p>130</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>» Exceção 2: Foi digitado valor inteiro e depois um valor não inteiro. Nesse caso,</p><p>a variável a receberá o valor 45 e a variável b não poderá receber o valor real</p><p>indicado na figura. Nesse momento ocorrerá desvio na execução para o bloco do</p><p>catch a fim de capturar a exceção. Por fim, uma mensagem é impressa usando</p><p>getMessage e o objeto e.</p><p>Figura 54. Tela de saída para a entrada 45 e depois 5,6.</p><p>Fonte: elaborada pela autora.</p><p>» Exceção 3: Foram digitados dois valores inteiros, sendo que o segundo valor</p><p>digitado e que será atribuído à variável b é o valor 0. Neste caso, ocorrerá erro</p><p>na divisão por zero e a atribuição c = a / b não será executada. Nesse momento,</p><p>portanto, ocorrerá desvio na execução para o bloco do catch a fim de capturar a</p><p>exceção. Por fim, uma mensagem é impressa usando getMessage e o objeto e.</p><p>Figura 55. Tela de saída para a entrada 56 e 0.</p><p>Fonte: elaborada pela autora.</p><p>É possível tratar várias exceções associando vários catch’s ao mesmo try. Nesse caso, a ordem</p><p>dos tratadores é importante: eles devem estar ordenados das subclasses para a superclasse.</p><p>Exemplo: Considere um trecho de código em Java destacando os catchs.</p><p>Figura 56. Entendendo o try..catch</p><p>e */ para comentários multilinhas</p><p>// para comentários em uma linha</p><p>Os comentários são uma boa prática de programação e servem como documentação do programa, orientando quem for ler</p><p>ou fazer a manutenção no programa.</p><p>9</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>1.2 Plataforma Java</p><p>O termo plataforma normalmente é usado para designar um conjunto:</p><p>Hardware + Sistema Operacional</p><p>Nas linguagens compiladas que geram código nativo (binário), é necessário um processo</p><p>de compilação para cada plataforma, pois o código gerado só executa naquela plataforma</p><p>específica.</p><p>A plataforma Java é definida apenas em software e tem dois componentes principais:</p><p>» Máquina Virtual Java (JVM – Java Virtual Machine)</p><p>» Conjunto de bibliotecas que implementam funções úteis (API Java)</p><p>Diferentemente das linguagens que são compiladas para código nativo, a linguagem Java é</p><p>compilada para bytecode (.class ou .jar) que é executado por uma JVM (Java Virtual Machine).</p><p>Saiba mais</p><p>API significa Application Programming Interface. Traduzindo: Interface de Programação de Aplicações.</p><p>A API Java oferece uma rica coleção de classes e métodos para, por exemplo:</p><p>» realizar cálculos matemáticos comuns;</p><p>» manipular sequências de caracteres (strings);</p><p>» verificar e tratar erros.</p><p>Figura 1. Plataforma Java.</p><p>Fonte: elaborada pela autora.</p><p>10</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Essa camada extra entre o Sistema Operacional e o programa permite que este seja</p><p>executado em diversas plataformas, sem a necessidade de alteração ou recompilação</p><p>(portabilidade). Na Figura 1, o mesmo programa teste.java (observe a extensão .java)</p><p>poderá ser executado, sem qualquer ajuste ou mudança, em um ambiente com Linux ou em</p><p>um ambiente com Windows 10.</p><p>Saiba mais</p><p>O compilador é um programa tradutor. No caso da linguagem de programação Java, o compilador é o javac.</p><p>Simplificadamente, o papel de qualquer compilador é traduzir o programa escrito em alguma linguagem de alto nível em</p><p>linguagem de máquina. As linguagens de alto nível têm instruções que se parecem, em geral, com o inglês do dia a dia. Já a</p><p>linguagem de máquina consiste em sequências de zeros e uns.</p><p>Veja o modelo de compilação e execução na figura 2. Note que o programa Java (arquivo</p><p>de extensão .java) é compilado para bytecode, gerando um arquivo com extensão .class.</p><p>Esse arquivo contém o código executável que independe da plataforma. Para executar esse</p><p>código é necessário uma máquina virtual (JVM), que irá traduzir e executar o bytecode no</p><p>ambiente desejado, seja ele Linux, Windows© ou MacOS©.</p><p>Figura 2. Modelo de compilação e execução.</p><p>Fonte adaptada: https://www.shutterstock.com/pt/image-photo/kazan-russia-april-11-2017-set-645421069.</p><p>Importante</p><p>Desenvolvedores Java devem fazer download do Java SE Development Kit (JDK), da Plataforma Java, no site https://www.</p><p>oracle.com/java/.</p><p>JDK é o Kit de Desenvolvimento Java para standard edition (SE) ou edição padrão. Tal kit inclui o ambiente de execução, que</p><p>é o JRE (Java Runtime Environment), além de ferramentas para desenvolvimento, debugging (depuração) e monitoramento</p><p>das aplicações Java. Note que o compilador Java (javac) encontra-se no JDK.</p><p>Para se escrever e executar um programa em Java são necessários um editor para escrevermos</p><p>o programa e um prompt de comando, para chamarmos o compilador (javac) e, por fim,</p><p>executarmos o programa. No entanto, existe uma forma mais amigável, através das IDEs,</p><p>de escrevermos e manipularmos programas em Java, seja para editar, compilar, depurar ou</p><p>executar.</p><p>11</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>IDE significa Integrated Development Environment, ou seja, Ambiente Integrado de</p><p>Desenvolvimento.</p><p>Para a linguagem Java, podem ser destacadas as seguintes IDEs:</p><p>» Eclipse;</p><p>» NetBeans;</p><p>» IntelliJ.</p><p>1.3 Tipos de dados</p><p>Java é classificada como uma linguagem fortemente tipada. Isso quer dizer que todos os</p><p>dados básicos manipulados por um programa Java estão associados a determinado tipo.</p><p>Quando realizamos qualquer operação com diversos dados diferentes, o Java usa o</p><p>tipo de cada dado para verificar se a operação é válida. Assim, se houver qualquer</p><p>incompatibilidade entre os tipos de dados, o compilador Java acusa como um erro.</p><p>A linguagem Java tem oito tipos primitivos de dados, como mostrado na Tabela 1.</p><p>Tabela 1. Tipos de dados.</p><p>Tipo Bits Valor mínimo Valor máximo</p><p>boolean 1 true ou false</p><p>char 16 até 65.536 caracteres</p><p>byte 8 -128 127</p><p>short 16 -32.768 32.767</p><p>int 32 -2.147.483.648 2.147.483.647</p><p>long 64 -9.223.372.036.854.775.808 9.223.372.036.854.775.807</p><p>float 32 ~ -1.4e-45 ~ 3.4e38</p><p>double 64 ~ -4.9e-324 ~ 1.7e308</p><p>Fonte: elaborada pela autora.</p><p>Saiba mais</p><p>O tamanho dos tipos de dados independe da arquitetura da máquina, ou seja, o tipo int terá sempre 32 bits, seja qual forda</p><p>máquina onde o programa Java estiver sendo executado.</p><p>1.4 variáveis e constantes</p><p>As variáveis irão armazenar dados que serão, muitas vezes, de um dos tipos de dados</p><p>apresentados na seção anterior. E como declaramos uma variável em Java? Vejamos alguns</p><p>exemplos:</p><p>12</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>int _a;</p><p>double $c;</p><p>char c1, c2, c3;</p><p>long nomeBastanteExtensoParaMinhaVariavel;</p><p>int i, j;</p><p>boolean achou;</p><p>atenção</p><p>Quando temos duas ou mais variáveis do mesmo tipo podemos declará-las juntas, separando-as por vírgula.</p><p>Pelos exemplos vistos, a declaração de uma variável em Java é:</p><p>TipoDeDados IdentificadorDaVariável;</p><p>Então, para declarar uma variável para armazenar a idade, por exemplo, teremos:</p><p>int idade;</p><p>onde int é o tipo de dados</p><p>idade é o nome ou identificador da variável</p><p>Que nomes podemos usar para variáveis?</p><p>Para nomear variáveis, usamos identificadores que seguem as seguintes regras:</p><p>» Os identificadores devem começar sempre com uma letra, $ ou</p><p>» underscore ( _ ).</p><p>» Após o primeiro caractere, são permitidos letras, $, _ , ou dígitos.</p><p>» Não há limite de tamanho para o identificador.</p><p>» Identificadores em Java são case-sensitive, ou seja, pessoa, PESSOA e Pessoa são</p><p>identificadores diferentes.</p><p>» Apesar de ser possível, não é recomendável o uso de caracteres de acentuação nos</p><p>identificadores (ç, á, é, í, ó, ú, â, ê, ô, à, ã, õ).</p><p>» Algumas palavras reservadas não são permitidas como identificadores: abstract,</p><p>boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else,</p><p>13</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface,</p><p>long, native, new, package, private, protected, public, return, short, static, strictfp,</p><p>super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while,</p><p>assert, enum</p><p>Importante</p><p>» Palavras reservadas não devem ser usadas para identificar variáveis ou constantes ou classes ou métodos.</p><p>» Use nomes sugestivos para as variáveis, considerando sempre o contexto do problema.</p><p>Podemos inicializar uma variável no momento da declaração. Para isso, é preciso atribuir um</p><p>valor à variável. Normalmente, no estudo de algoritmos, o operador de atribuição usado é ←.</p><p>Aqui em Java, o operador para atribuição é o = .</p><p>Exemplos:</p><p>double $c = 0.1;</p><p>char c1 = ‘A’, c2, c3;</p><p>long nomeBastanteExtensoParaMinhaVariavel = 1000L;</p><p>int i = 0, j = 1;</p><p>boolean achou = false;</p><p>Importante</p><p>» O operador = não é usado para testar igualdade em Java.</p><p>» Variáveis não inicializadas têm valor indefinido.</p><p>» Se você tentar usar uma variável antes de definir seu valor, o compilador Java vai acusar um erro.</p><p>E como se define e se inicializa uma constante em Java? A declaração e a inicialização de</p><p>constantes têm a mesma sintaxe da declaração e inicialização de variáveis, acrescidas da</p><p>palavra final. Exemplos:</p><p>final int MAXIMO = 100;</p><p>final float PI = 3.14159f;</p><p>final char FIM = ‘$’;</p><p>final boolean OK = true;</p><p>14</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>As constantes são, muitas vezes, definidas no programa por trazerem</p><p>com mais de uma exceção.</p><p>try {</p><p>// Código a ser tratado</p><p>} catch (ArithmeticException e3) {</p><p>System.out.printf("Erro de aritmetica: %s\n",e3.getMessage());</p><p>} catch(IOException e2) {</p><p>System.out.printf("Erro de E/S: %s\n", e2.getMessage());</p><p>} catch(Exception e1) {</p><p>System.out.printf("Erro desconhecido: %s\n", e1.getMessage());</p><p>}</p><p>Primeiro o catch da exceção mais</p><p>específica. Se ocorrer um erro de</p><p>aritmética, esse código será executado.</p><p>Por último o catch da exceção mais geral.</p><p>Para qualquer outro erro, esse código</p><p>será executado.</p><p>Se ocorrer um erro de E/S ou de qualquer de suas</p><p>subclasses, o código do 2º catch será executado.</p><p>Fonte: elaborada pela autora.</p><p>131</p><p>TRaTaMEnTO DE EXCEçÕES • CAPÍTULO 5</p><p>O que acontece quando ocorre uma exceção?</p><p>Tabela 12. O que acontece quando ocorre uma exceção.</p><p>O método cria um objeto do tipo Exception e o envia para a JvM:</p><p>» Esse processo é chamado de “disparar uma exceção” (throw an exception).</p><p>» O objeto Exception criado contém todas as informações sobre o erro: seu tipo, o local onde</p><p>ocorreu, uma mensagem de descrição, a pilha de chamadas, etc.</p><p>a JvM procura um bloco try...catch para tratar a exceção no método que gerou a exceção. Se</p><p>encontrar, desvia a execução para o catch.</p><p>Se não encontrar, procura um bloco try...catch para tratar a exceção na pilha de execução,</p><p>ou seja, nos métodos que chamaram o método que gerou a exceção. Se encontrar, desvia a</p><p>execução para o primeiro catch que encontrar.</p><p>Se não encontrou nenhum tratador na pilha de execução, desvia para o tratador padrão da JvM</p><p>que interrompe a execução do programa.</p><p>Fonte: elaborada pela autora.</p><p>O bloco try ...catch pode contar, opcionalmente, com o trecho do finally (significa</p><p>finalmente). Veja:</p><p>Figura 57. Uso do finally.</p><p>try {</p><p>// Código a ser tratado</p><p>} catch (Exception e) {</p><p>System.out.println("Erro: %s\n”, e.getMessage());</p><p>}</p><p>finally {</p><p>// Esse código será sempre executado, independente</p><p>// se houve exceção ou não</p><p>}</p><p>finally não é obrigatório e não serve para capturar exceção.</p><p>Deve ser usado para instruções de "limpeza".</p><p>v</p><p>Fonte: elaborada pela autora.</p><p>132</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>5.3 Exceções verificadas e não verificadas</p><p>As exceções na linguagem Java são classificadas como:</p><p>» checked (verificadas): são exceções verificadas pelo compilador, como veremos mais</p><p>adiante.</p><p>» unchecked (não verificadas): não são verificadas pelo compilador, ocorrendo em</p><p>tempo de execução. Nesse caso, contamos com a captura das exceções usando o</p><p>comando try ...catch já visto. Vale observar que alguns casos podem ser evitados se</p><p>for feita uma programação correta.</p><p>Para as exceções checked (verificadas), o Java nos obriga a:</p><p>Figura 58. Exceções checadas.</p><p>ou</p><p>Tratar as exceções no método onde ela pode ocorrer. Nesse</p><p>caso, implementamos o bloco try...catch visto anteriormente.</p><p>Avisar que estamos cientes de que aquela exceção pode ocorrer,</p><p>mas não desejamos tratá-la.</p><p>Nesse caso, usamos o comando throws.</p><p>Fonte: elaborada pela autora.</p><p>Exemplo: Considere um trecho de programa que lê e imprime um arquivo texto. Esse</p><p>código pode gerar exceções checked do tipo FileNotFoundException ou IOException. A</p><p>questão aqui é que o programa não compila.</p><p>133</p><p>TRaTaMEnTO DE EXCEçÕES • CAPÍTULO 5</p><p>public class ImprimeArquivo {</p><p>public static void main(String[] args) {</p><p>FileReader fr = new FileReader("arquivo.txt"); //abre o arquivo para leitura</p><p>BufferedReader f = new BufferedReader(fr);</p><p>String linha;</p><p>linha = f.readLine(); //lê uma linha do arquivo</p><p>while (linha != null) { //enquanto houver linha faça</p><p>System.out.println(linha); //imprime a linha na tela</p><p>linha = f.readLine(); //lê a próxima linha</p><p>}</p><p>f.close(); //fecha o arquivo</p><p>}</p><p>}</p><p>public class ImprimeArquivo {</p><p>public static void main(String[] args) throws</p><p>FileNotFoundException, IOException</p><p>{</p><p>FileReader fr = new FileReader("arquivo.txt"); //abre o arquivo para leitura</p><p>BufferedReader f = new BufferedReader(fr);</p><p>String linha;</p><p>linha = f.readLine(); //lê uma linha do arquivo</p><p>while (linha != null) { //enquanto houver linha faça</p><p>System.out.println(linha); //imprime a linha na tela</p><p>linha = f.readLine(); //lê a próxima linha</p><p>}</p><p>f.close(); //fecha o arquivo</p><p>} //fim main</p><p>} //fim classe</p><p>Para avisar ao compilador que não desejamos tratar esses erros, temos</p><p>que usar o comando throws. Assim, a compilação é realizada.</p><p>Veja a seguir como ficou o programa anterior com throws.</p><p>v</p><p>Saiba mais</p><p>» FileNotFoundException significa “exceção de arquivo não encontrado”</p><p>» IOException significa “exceção de IO”</p><p>» IO significa Input – Output, ou seja, Entrada – Saída</p><p>» Para separar exceções com throws usa-se vírgula, como mostrado no exemplo anterior. Reveja aqui apenas uma linha do</p><p>exemplo:</p><p>public static void main(String[] args) throws FileNotFoundException, IOException</p><p>134</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>Após estudarmos os comandos try...catch (para capturar exceção) e throws (para declarar</p><p>que uma exceção pode ocorrer), veremos agora o comando throw.</p><p>A palavra throw em Inglês, quando traduzida, significa lançar. O objetivo no uso do throw</p><p>é que a exceção seja disparada ou lançada para outra parte do programa. Normalmente,</p><p>throw é usado para lançar uma exceção que nós mesmos criamos.</p><p>atenção</p><p>Não confunda throws com throw. Enquanto throws declara que uma exceção pode ocorrer, throw lança uma exceção.</p><p>Exemplo: Se a base ou a altura forem menores ou iguais a zero, a execução do construtor</p><p>será interrompida e a exceção será disparada ou lançada.</p><p>public class Retangulo {</p><p>private int base, altura; //atributos</p><p>public Retangulo(int base, int altura) throws Exception {</p><p>if (base <= 0 || altura <= 0) {</p><p>Exception ex = new Exception(“Base e altura devem ser maiores que zero”);</p><p>throw ex; //lança a exceção ex</p><p>}</p><p>this.base = base;</p><p>this.altura = altura;</p><p>} //fim do construtor</p><p>} //fim da classe Retangulo</p><p>E para onde será lançada tal exceção criada no construtor da classe Retangulo? Irá para o</p><p>ponto onde o construtor foi chamado. Veja o próximo exemplo:</p><p>Exemplo: Capturando a exceção lançada no construtor da classe Retangulo.</p><p>135</p><p>TRaTaMEnTO DE EXCEçÕES • CAPÍTULO 5</p><p>?</p><p>r</p><p>Importante</p><p>Para indicar o uso de parâmetros inválidos ou ilegais é possível usar a exceção IllegalArgumentException em vez de</p><p>Exception.</p><p>Nesse caso, não é necessário usar o comando throws.</p><p>Exemplo: Construtor da classe Retangulo lançando uma exceção da classe</p><p>IllegalArgumentException.</p><p>public Retangulo(double base, double altura) {</p><p>if (base <= 0 || altura <= 0) {</p><p>throw new IllegalArgumentException(“Erro: Base e/ou altura <= 0”);</p><p>}</p><p>this.base = base;</p><p>this.altura = altura;</p><p>} //fim do construtor da classe Retangulo</p><p>Outra forma de escrever o trecho do if é:</p><p>if (base <= 0 || altura <= 0) {</p><p>IllegalArgumentException ex = new IllegalArgumentException(“Erro...”);</p><p>throw ex;</p><p>}</p><p>136</p><p>CAPÍTULO 5 • TRaTaMEnTO DE EXCEçÕES</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» Erros de lógica de programação, tais como acesso a índice fora dos limites do vetor, divisão por zero, entre outros, são</p><p>exceções.</p><p>» Erros devido a condições do ambiente de execução, que estão fora do controle do programador, mas podem ser</p><p>contornados em tempo de execução, tais como, arquivo não encontrado, rede fora do ar, entre outros, são exceções.</p><p>» Erros graves onde não adianta tentarmos</p><p>recuperação, pois fogem do controle do programador e não podem ser</p><p>contornados, tais como falta de memória, erro interno na JVM, são exemplos de exceção.</p><p>» Existe uma hierarquia de classes de exceção. Das exceções dessa hierarquia, usaremos a classe Exception e suas subclasses.</p><p>» Quando uma exceção ocorre, são informados o nome da exceção que ocorreu e seu pacote, uma pilha de execução com a</p><p>sequência de chamadas dos métodos e a descrição da exceção, que contém a mensagem de erro.</p><p>» O tratamento de exceções é um mecanismo que permite que o programa defina como as situações inesperadas serão</p><p>tratadas.</p><p>» Comandos para tratamentos de exceções: try ...catch (com ou sem finally), throws e throw.</p><p>» O comando try...catch (com ou sem finally) irá executar o trecho e, caso a exceção ocorra, irá capturar a exceção no bloco</p><p>do catch.</p><p>» O finally não captura exceção.</p><p>» É possível ter mais de um catch para um bloco try.</p><p>» As exceções podem ser verificadas (checked) ou não verificadas (unchecked).</p><p>» O comando throws é usado para declararmos que uma exceção pode ocorrer.</p><p>» O comando throw serve para lançar uma exceção para outro trecho do programa poder tratá-la.</p><p>137</p><p>Introdução do capítulo</p><p>A linguagem Java tem um conjunto de classes que servem para armazenar, na memória,</p><p>coleções de objetos.</p><p>Tais classes oferecem a vantagem de não termos que saber, de antemão, a quantidade de</p><p>elementos que iremos armazenar, o que é uma grande vantagem se compararmos com vetor.</p><p>Objetivos do capítulo</p><p>» Apresentar as principais interfaces e classes no estudo de coleções.</p><p>» Realizar um estudo teórico e prático da classe ArrayList.</p><p>» Identificar as classes Wrapper e seu papel na criação de listas de objetos.</p><p>6.1 Conceitos</p><p>As coleções em Java são divididas em três grandes grupos:</p><p>» Set: coleções de objetos que representam conjuntos de objetos.</p><p>» List: coleções de objetos que representam listas de objetos.</p><p>» Map: coleções de objetos que representam mapas ou dicionários.</p><p>Essas coleções em Java são definidas a partir de quatro interfaces principais:</p><p>» Collection: define métodos comuns a conjuntos e listas.</p><p>» Set: define métodos para manipulação de conjuntos de objetos.</p><p>» List: define métodos para manipulação de listas de objetos.</p><p>» Map: define métodos para manipulação de mapas ou dicionários.</p><p>6CAPÍTULO</p><p>COLEçÕES DE OBJETOS</p><p>138</p><p>CAPÍTULO 6 • COLEçÕES DE OBJETOS</p><p>Figura 59. Hierarquias de interfaces.</p><p>Fonte: elaborada pela autora.</p><p>A figura 60 representa as principais classes que implementam as interfaces Collection,</p><p>Set, List, SortedSet, Map e SortedMap, além de mostrar também a classe Collections.</p><p>Figura 60. Principais interfaces (em azul) e classes.</p><p>Fonte: elaborada pela autora.</p><p>atenção</p><p>Não confundir interface Collection com classe Collections.</p><p>Basicamente, temos que:</p><p>» Um Set nos remete a mesma ideia de conjuntos da matemática, ou seja, um conjunto</p><p>de objetos sem duplicidade de elementos. Assim, se tentarmos armazenar mais de</p><p>uma vez o mesmo objeto em um Set, não teremos objeto duplicado.</p><p>» Um List é uma lista de objetos com a possibilidade de duplicidade de elementos.</p><p>Assim, se tentarmos armazenar mais de uma vez o mesmo objeto em um List, ele</p><p>ficará duplicado na lista.</p><p>» Um Map é um objeto que mapeia chaves em valores. Um map não pode conter</p><p>chaves duplicadas, ou seja, cada chave pode ser mapeada em no máximo um valor.</p><p>139</p><p>COLEçÕES DE OBJETOS • CAPÍTULO 6</p><p>Importante</p><p>Todas as coleções estão definidas no pacote java.util.</p><p>6.2 Classe arrayList</p><p>ArrayList é uma classe concreta que implementa a interface List, ou seja, uma lista de objetos.</p><p>Cada objeto armazenado no ArrayList tem um índice e por meio desse índice, é possível</p><p>manipular o objeto da lista. Note que o índice inicial é zero.</p><p>Figura 61. algumas interfaces e classes.</p><p>Fonte: elaborada pela autora.</p><p>atenção</p><p>» A figura anterior mostra as interfaces List e Collection, além das classes LinkedList, ArrayList e Vector que implementam a</p><p>interface List.</p><p>» List é sub-interface de Collection.</p><p>A classe ArrayList conta com vários métodos importantes, como, por exemplo:</p><p>» void add(índice, Object): adiciona o objeto à coleção na posição do índice.</p><p>» boolean add(Object): adiciona o objeto sempre no final da lista.</p><p>» Object get(índice): recupera o objeto de determinada posição da lista usando o</p><p>índice.</p><p>» Object remove(índice): remove o objeto de determinada posição da lista e retorna o</p><p>objeto removido.</p><p>» boolean remove(Object): remove o objeto da lista e move os objetos subsequentes</p><p>para novas posições, ajustando a lista.</p><p>» int size(): retorna a quantidade de objetos presentes na lista.</p><p>140</p><p>CAPÍTULO 6 • COLEçÕES DE OBJETOS</p><p>Importante</p><p>Um objeto da classe ArrayList é uma lista redimensionável.</p><p>Exemplo: Criando uma lista com nomes e usando os métodos add e remove. Note que lista é</p><p>um objeto da classe ArrayList.</p><p>import java.util.ArrayList;</p><p>public class ExemploArrayList {</p><p>public static void main(String[] args) {</p><p>ArrayList lista = new ArrayList();</p><p>lista.add("Dinardo");</p><p>lista.add("Rosa");</p><p>lista.add("Dinardo");</p><p>lista.add("Rafael");</p><p>lista.add(2, "Carlos");</p><p>lista.add("Luís");</p><p>lista.remove("Carlos");</p><p>lista.remove("Rafael");</p><p>lista.remove("Dinardo");</p><p>lista.remove(2);</p><p>}</p><p>}</p><p>Cria uma lista vazia.</p><p>Insere no fim da lista.</p><p>Insere em uma posição específica.</p><p>Remove o objeto.</p><p>Remove o objeto dessa posição.</p><p>Observe o passo a passo do programa anterior:</p><p>Etapa 1: Após adicionar Dinardo, Rosa, Dinardo e Rafael</p><p>Dinardo → Rosa → Dinardo → Rafael</p><p>Etapa 2: Após adicionar Carlos na posição de índice 2</p><p>Dinardo → Rosa → Carlos → Dinardo → Rafael</p><p>Etapa 3: Após adicionar Luís</p><p>Dinardo → Rosa → Carlos → Dinardo → Rafael → Luís</p><p>141</p><p>COLEçÕES DE OBJETOS • CAPÍTULO 6</p><p>Etapa 4: Removendo Carlos, Rafael e Dinardo</p><p>Rosa → Dinardo → Luís</p><p>Note que a primeira ocorrência de Dinardo foi removida.</p><p>Etapa 5: Removendo o elemento da posição de índice 2.</p><p>Rosa → Dinardo</p><p>Exemplo: Criando uma lista de objetos de tipos diferentes.</p><p>import java.util.ArrayList;</p><p>public class ExemploArrayList {</p><p>public static void main(String[] args) {</p><p>ArrayList lista = new ArrayList();</p><p>lista.add("Dinardo");</p><p>lista.add("Rosa");</p><p>lista.add(10);</p><p>lista.add(2465);</p><p>lista.add(3.14159);</p><p>lista.add('A');</p><p>}</p><p>}</p><p>Definido dessa forma, o ArrayList</p><p>armazena objetos do tipo Object.</p><p>Exemplo: Podemos recuperar um elemento da lista pelo seu índice. Para isso, basta usar o</p><p>método get.</p><p>import java.util.ArrayList;</p><p>public class ExemploArrayList {</p><p>public static void main(String[] args) {</p><p>ArrayList lista = new ArrayList();</p><p>lista.add("Dinardo");</p><p>lista.add("Rosa");</p><p>lista.add(10);</p><p>lista.add(2465);</p><p>lista.add(3.14159);</p><p>lista.add('A');</p><p>System.out.println(lista.get(0));</p><p>System.out.println(lista.get(3));</p><p>System.out.println(lista.get(4));</p><p>System.out.println(lista.get(5));</p><p>}</p><p>}</p><p>O método get(i) recupera o elemento da</p><p>posição de índice i.</p><p>O índice inicial é ZERO, como no vetor.</p><p>142</p><p>CAPÍTULO 6 • COLEçÕES DE OBJETOS</p><p>Após adicionar com add os elementos à lista, temos:</p><p>Dinardo → Rosa → 10 → 2465 → 3.14159 → A</p><p>Depois, cada elemento da lista é acessado pelo índice usando o método get. Assim, por</p><p>exemplo, lista.get(0) obtém o 1º elemento do objeto lista e com o System.out.println,</p><p>ocorre a impressão na tela.</p><p>Figura 62. Saída do programa anterior.</p><p>Dinardo</p><p>2465</p><p>3.14159</p><p>A</p><p>Fonte adaptada: https://www.shutterstock.com/pt/image-photo/biophilia-workspace-home-office-room-</p><p>computer-1899736342.</p><p>Exemplo: Observe a melhoria na hora de percorrer a lista e imprimir seus dados. Para isso, foi</p><p>usado o método size.</p><p>import java.util.ArrayList;</p><p>public class TesteArrayList {</p><p>public static void main(String[] args) {</p><p>ArrayList lista = new ArrayList();</p><p>lista.add("Dinardo");</p><p>lista.add("Rosa");</p><p>lista.add(10);</p><p>lista.add(2465);</p><p>lista.add(3.14159);</p><p>lista.add('A');</p><p>for (int i= 0; i< lista.size(); i++)</p><p>System.out.println(lista.get(i));</p><p>}</p><p>}</p><p>Saída do programa:</p><p>Dinardo</p><p>Rosa</p><p>10</p><p>2465</p><p>3.14159</p><p>A</p><p>143</p><p>COLEçÕES DE OBJETOS • CAPÍTULO 6</p><p>No exemplo anterior, vimos que podemos percorrer um ArrayList com for. Note que também</p><p>é possível percorrer com for...each. Nesse caso, não usamos índice.</p><p>Como ficaria o trecho do for, do exemplo anterior, reescrito com for...each?</p><p>Veja:</p><p>for (Object obj : lista)</p><p>System.out.println(obj);</p><p>Podemos entender da seguinte forma:</p><p>para cada obj em lista imprima obj</p><p>6.3 Classes Wrapper</p><p>Em Java, os tipos básicos int, long, byte, short, float, double, char e boolean não são objetos.</p><p>Entretanto, a maioria das classes da biblioteca Java, como as classes que implementam as</p><p>coleções, por exemplo, trabalha somente com objetos.</p><p>Para resolver esse problema foram definidas classes wrapper, ou seja, classes que encapsulam</p><p>ou “embrulham” os tipos básicos para que estes possam ser tratados como objetos.</p><p>Tabela 13. Classes wrapper.</p><p>Classe wrapper Tipo armazenado na classe</p><p>Integer int</p><p>Long long</p><p>Byte byte</p><p>Short short</p><p>Float float</p><p>Double double</p><p>Character char</p><p>Boolean boolean</p><p>Fonte: elaborada pela autora.</p><p>Na maior parte das vezes, o Java converte o tipo básico em uma classe wrapper (boxing) ou</p><p>uma classe wrapper em um tipo básico (unboxing) de forma automática.</p><p>Exemplo:</p><p>int x = 10;</p><p>Integer a = 10;</p><p>144</p><p>CAPÍTULO 6 • COLEçÕES DE OBJETOS</p><p>Integer b = x + 1;</p><p>int y = a;</p><p>a = a + 1;</p><p>b++;</p><p>A partir daí e do último exemplo da seção anterior, vemos que, quando é adicionado um</p><p>valor qualquer, por exemplo, o inteiro 2465 à lista</p><p>lista.add(2465);</p><p>O valor 2465 é “embrulhado” com a classe wrapper adequada e é adicionado com o método</p><p>add à lista criada com ArrayList. Ou seja, tínhamos um valor inteiro para ser adicionado ou</p><p>inserido em uma lista de objetos e, com a classe wrapper, passamos a ter um objeto com o</p><p>valor inteiro para que a inserção na lista ocorresse.</p><p>Para adicionar o valor inteiro 2465 foi usada a classe wrapper Integer. E para os valores 3.14159</p><p>e ‘A’ do mesmo exemplo? Foram usadas, respectivamente, as classes Double e Character.</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» As coleções em Java são divididas em três grandes grupos: Set, List e Map.</p><p>» As coleções mencionadas são definidas a partir de quatro interfaces principais: Collection, Set, List e Map.</p><p>» A classe ArrayList implementa a interface List.</p><p>» A classe ArrayList permite criar listas redimensionáveis de objetos, cujos elementos podem ser acessados via índice.</p><p>» O índice inicial de uma lista é zero.</p><p>» As classes wrapper encapsulam os tipos básicos da linguagem.</p><p>» Classes wrapper: Integer, Long, Byte, Short, Float, Double, Character e Boolean.</p><p>» Na maior parte das vezes, o Java converte o tipo básico em uma classe wrapper (boxing) ou uma classe wrapper em um</p><p>tipo básico (unboxing) de forma automática.</p><p>145</p><p>Referências</p><p>DEITEL, Paul J.; DEITEL, Harvey M. Java: como programar. São Paulo: Pearson Education do Brasil, 2017. 10ª.</p><p>Edição.</p><p>ECKEL, Bruce. Java Platform Standard Edition Documentation. Disponível em: https://docs.oracle.com/</p><p>search/?q=Java%20plataform&pg=2&size=10&product=en%2Fjava&category=en%2Fjava&showfirstpage</p><p>=true&lang=en. Acesso em: 23 out. 2022.</p><p>ECKEL, Bruce. Thinking in Java. Prentice Hall, 5ª. Edição, 2022.</p><p>HORSTMANN, Cay S.; CORNELL, Gary. Core Java. Volume I – Fundamentos. São Paulo: Pearson Education do</p><p>Brasil, 2010.</p><p>Sites</p><p>https://www.shutterstock.com/pt/image-photo/kazan-russia-april-11-2017-set-645421069.</p><p>https://www.oracle.com/java/.</p><p>https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/.</p><p>www.eclipse.org.</p><p>https://www.shutterstock.com/pt/image-vector/business-man-character-has-take-difficult-357576257.</p><p>https://pixabay.com/pt/vectors/l%c3%a2mpada-el%c3%a9trica-id%c3%a9ia-ilumina%c3%a7%c3%a3o-1926533/.</p><p>https://pixabay.com/pt/vectors/casa-%c3%adcone-s%c3%admbolo-arquitetura-2492054/.</p><p>https://pixabay.com/pt/vectors/bmw-carro-roadster-carro-esporte-158703/.</p><p>https://www.shutterstock.com/pt/image-photo/happy-young-university-students-studying-books-522554425.</p><p>https://www.shutterstock.com/pt/image-photo/biophilia-workspace-home-office-room-computer-1899736342.</p><p>_Hlk107304517</p><p>_Hlk107306375</p><p>_Hlk114574997</p><p>_Hlk107082829</p><p>_Hlk107306630</p><p>_Hlk107307372</p><p>_Hlk114575254</p><p>_Hlk114575306</p><p>_Hlk114575452</p><p>_Hlk110700689</p><p>_Hlk110701110</p><p>_Hlk110701272</p><p>_Hlk34826608</p><p>_Hlk58327400</p><p>_Hlk34232318</p><p>_Hlk113362211</p><p>_Hlk58404309</p><p>_Hlk114576835</p><p>Organização do Livro Didático</p><p>Introdução</p><p>Capítulo</p><p>Introdução à linguagem de programação</p><p>Capítulo</p><p>Comandos da linguagem Java</p><p>Capítulo</p><p>Conceitos e Implementação usando Orientação a Objetos</p><p>Capítulo</p><p>Classes e objetos: uma visão mais aprofundada</p><p>Capítulo</p><p>Tratamento de exceções</p><p>Capítulo</p><p>Coleções de objetos</p><p>Referências</p><p>legibilidade e facilitarem</p><p>a manutenção. Mais adiante, em outro capítulo, haverá essa percepção.</p><p>Importante</p><p>Constantes não podem ter seu valor alterado durante o programa. Portanto, caso haja uma tentativa de alterar um desses</p><p>valores, o compilador Java acusará erro.</p><p>Pelo que foi visto até agora, as variáveis ou constantes podem receber valores inteiros, de</p><p>ponto flutuante, caracteres, booleanos e strings, conforme indicado a seguir:</p><p>» Valor inteiro</p><p>› Composto de dígitos de 0 a 9.</p><p>› Pode ser iniciado com sinal negativo (-)</p><p>› Exemplos:</p><p>19 → int</p><p>-3 → int</p><p>1265L → long (terminado com L maiúsculo)</p><p>-9876L → long (terminado com L maiúsculo)</p><p>» Valor ponto flutuante</p><p>› Devem conter sempre o ponto (para diferenciar das constantes inteiras)</p><p>› Exemplos:</p><p>0.234 → double</p><p>-125.65 → double</p><p>4.93f → float (terminado com f minúsculo)</p><p>-12.765f → float (terminado com f minúsculo)</p><p>» Valor caracter</p><p>› É uma letra ou símbolo entre aspas simples.</p><p>› Exemplos:</p><p>‘a’ ‘.’ ‘*’</p><p>15</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>» Valor booleano</p><p>› São representadas pelas palavras true ou false.</p><p>› Note: true significa verdadeiro e false significa falso</p><p>» Valor string</p><p>› Consiste de uma sequência de zero ou mais caracteres entre aspas duplas.</p><p>› Exemplos:</p><p>“Oba!”</p><p>“Rio de Janeiro”</p><p>“A resposta é:”</p><p>“a”</p><p>“Ela gritou \”Socorro !!!\””</p><p>Saiba mais</p><p>Quando as aspas fazem parte de uma string, precisamos usar \ antes da aspa. Isso ocorre porque as aspas são usadas para</p><p>delimitar uma string, ou seja, para abri-la e fechá-la.</p><p>Convenções</p><p>Apesar de não ser obrigatório, Java tem algumas convenções de nomenclatura que os</p><p>programadores seguem:</p><p>» Nomes de variáveis, atributos e métodos: utilizar o formato camelCase: primeira</p><p>letra minúscula e primeira letra das demais palavras em maiúscula. Exemplos:</p><p>nomeCliente</p><p>matriculaAluno</p><p>cpf</p><p>dataNascimento</p><p>» Nomes de constantes: devem ser definidas em caixa alta e usar o underscore como</p><p>separador. Exemplos:</p><p>LIMITE_SUPERIOR</p><p>MAX</p><p>16</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>» Nomes de classes: utilizar o formato PascalCase, ou seja, todas as primeiras letras</p><p>das palavras em maiúsculas. Exemplos:</p><p>AloMundo</p><p>Cliente</p><p>Disciplina</p><p>SistemaAcademico</p><p>AlunoBolsista</p><p>UnidadeEnsino</p><p>1.5 Entrada e Saída de Dados</p><p>Vejamos como fazer entrada e saída de dados em Java, por enquanto, sem muitos</p><p>formalismos.</p><p>Revisitando o exemplo do primeiro programa:</p><p>public class PrimeiroProg {</p><p>public static void main(String [] args)</p><p>{</p><p>System.out.println(“Meu primeiro programa.”);</p><p>} // fim do método main</p><p>} // fim da classe PrimeiroProg</p><p>teremos a saída do programa ilustrada na Figura 3.</p><p>Figura 3. Saída do programa.</p><p>Meu primeiro programa</p><p>Fonte: https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/ e autora.</p><p>17</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Observe o uso da classe System e o uso de out, que representa a saída de vídeo (output).</p><p>Além deles, usou-se o método println que imprime na tela e faz, em seguida, uma quebra</p><p>de linha (ln).</p><p>Classe System</p><p>» Pertence à biblioteca padrão do Java chamada java.lang.</p><p>» A classe System define, dentre outras coisas, os arquivos de entrada e saída padrões.</p><p>» O arquivo out representa a saída de vídeo.</p><p>» O arquivo in representa a entrada via teclado.</p><p>» Note que in e out são objetos e, por isso, podemos acessar seus métodos.</p><p>» Para a saída de dados via console (vídeo) usamos os métodos print, println ou printf</p><p>do objeto out.</p><p>Se a linha de código</p><p>System.out.println(“Meu primeiro programa.”);</p><p>fosse substituída por</p><p>System.out.print(“Meu primeiro programa.”);</p><p>a mensagem seria impressa na tela sem quebra de linha, pois o método print imprime na tela,</p><p>sem posicionar o cursor na próxima linha.</p><p>Para a entrada de dados via teclado, será usada a classe Scanner. Note que Scanner vem de</p><p>scan, que remete a “varredura”. Podem ser realizadas várias ações nessa “varredura”, como,</p><p>por exemplo: ler o próximo inteiro, ler o próximo valor real (tipos double ou float), entre</p><p>outros.</p><p>Classe Scanner</p><p>» É usada para a entrada de dados.</p><p>» Pertence à biblioteca do Java chamada java.util.</p><p>» Como a classe Scanner não está definida em uma biblioteca padrão, é necessário</p><p>informar onde ela se encontra. Para isso, é preciso usar o comando import: import</p><p>java.util.Scanner;</p><p>18</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Exemplo: Programa em Java que lê e imprime a idade na tela.</p><p>import java.util.Scanner;</p><p>public class Leitura {</p><p>public static void main(String [] args) {</p><p>int idade;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.println(“Qual a sua idade ? “);</p><p>idade = teclado.nextInt();</p><p>System.out.println(“Idade = “ + idade);</p><p>} // fim do metodo main</p><p>} // fim da classe</p><p>Figura 4. Saída do programa Leitura.</p><p>Qual a sua idade?</p><p>25</p><p>Idade = 25</p><p>Fonte: https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/ e autora.</p><p>Analisando cada linha do programa Leitura, considerando que foi digitado o valor 25 na</p><p>entrada padrão:</p><p>» O programa começa a execução pela main, que traduzindo, significa principal.</p><p>» A main é sempre escrita dentro de uma classe.</p><p>» Tanto a main, quanto a classe são abertas com { e fechadas com }</p><p>» A linha import java.util.Scanner; importa a classe Scanner para avisar ao</p><p>compilador Java onde ela está definida. Nesse caso, está definida no pacote java.util.</p><p>19</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>» A linha Scanner teclado = new Scanner(System.in); cria um objeto de nome</p><p>teclado e diz também que os dados serão “varridos” da entrada padrão (System.</p><p>in). Será através do objeto teclado (que poderia ter outro nome seguindo a regra</p><p>de identificador) que realizaremos as ações de “obter o próximo inteiro”, “obter o</p><p>próximo valor em ponto flutuante” etc.</p><p>» A linha System.out.println(“Qual a sua idade? “); imprime na tela do computador a</p><p>mensagem: Qual a sua idade?</p><p>Após a impressão da mensagem, o cursor é posicionado na linha seguinte, visto que</p><p>usou-se println e não print.</p><p>» A linha idade = teclado.nextInt(); irá obter o próximo inteiro (nextInt), usando.</p><p>para isso, o teclado criado. O valor inteiro lido é atribuído à variável idade, usando o</p><p>operador = de atribuição.</p><p>» A linha System.out.println(“Idade = “ + idade); imprime Idade = seguido do valor</p><p>armazenado na variável idade. Para isso, usou-se o operador + para concatenar</p><p>a string Idade = com o valor armazenado na variável idade. O valor da variável é</p><p>inteiro, mas para que ocorra a concatenação, ele é convertido para string.</p><p>Saiba mais</p><p>» Um pacote ou package em Java é um conjunto de classes localizadas na mesma estrutura de diretórios.</p><p>» O pacote pode ser padrão, como o java.lang ou não. O pacote java.util tem várias classes, entre elas, a classe Scanner.</p><p>» Quando o pacote é padrão não precisamos importá-lo com import.</p><p>Existem vários métodos na classe Scanner para fazer a entrada de dados:</p><p>» ler um int: nextInt()</p><p>» ler um double: nextDouble()</p><p>» ler um float: nextFloat()</p><p>» ler um caracter: nextLine().charAt(0)</p><p>» ler um long: nextLong()</p><p>» ler uma string: nextLine()</p><p>Exemplo: Programa em Java que lerá duas notas e imprimirá a média.</p><p>import java.util.Scanner;</p><p>public class Media {</p><p>20</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>public static void main(String [] args) {</p><p>float nota1, nota2, media;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.print(“Digite a primeira nota: “);</p><p>nota1 = teclado.nextFloat();</p><p>System.out.print(“Digite a segunda nota:”);</p><p>nota2 = teclado.nextFloat();</p><p>media = (nota1+nota2)/2;</p><p>System.out.println(“Média = “ + media);</p><p>} // fim do metodo main</p><p>} // fim da classe</p><p>Figura 5. Saída do programa Media para as entradas 6,7 e 9,8.</p><p>Digite a primeira nota: 6,7</p><p>Digite a segunda nota: 9,8</p><p>Média = 8.25</p><p>Fonte: https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/ e autora.</p><p>atenção</p><p>O ponto é o separador de casas decimais quando programamos e trabalhamos com float ou double.</p><p>Para entrada de dados, o usuário vai usar a vírgula, que é o separador padrão de decimais no sistema numérico brasileiro.</p><p>Note que a média foi impressa com duas casas decimais. E se quisermos especificar apenas</p><p>uma casa decimal? Nesse caso, é preciso usar o printf ao invés de print ou println. Assim, a</p><p>linha</p><p>21</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>System.out.println(“Media = “ + media);</p><p>ficará</p><p>System.out.printf(“Media = %.1f”, media);</p><p>O printf não trabalha com a concatenação (+) e precisa do formato de impressão. O formato</p><p>de impressão, que deverá estar sempre entre aspas, será “%.1f” indicando que se trata de</p><p>ponto flutuante (%f) e que se terá exatamente uma casa decimal (.1).</p><p>Saiba mais</p><p>O exemplo em que a idade foi impressa na tela com println:</p><p>System.out.println(“Idade = “ + idade);</p><p>pode ser reescrito com printf da seguinte forma:</p><p>System.out.printf(“Idade = %d\n”, idade);</p><p>O formato de impressão é o %d porque idade é uma variável inteira. Note ainda, o uso do código especial \n que indica nova</p><p>linha. Com printf é necessário usar \n, sempre entre aspas duplas, se quisermos ter uma nova linha após a impressão.</p><p>Existem outras sequências de escape comumente usadas. Veja na tabela 2 a seguir:</p><p>Tabela 2. Códigos especiais.</p><p>Sequência de escape Descrição</p><p>\n nova linha (new line): posiciona o cursor da tela no início da próxima linha</p><p>\t Tabulação (tab): move o cursor de tela para o próximo ponto de tabulação</p><p>\” aspas duplas (“)</p><p>\’ aspas simples (‘)</p><p>\\ Contrabarra (\)</p><p>\0 Caracter nulo</p><p>Fonte: elaborada pela autora.</p><p>1.6 Operadores e expressões</p><p>Nesta seção serão estudados o operador de atribuição, os operadores aritméticos e</p><p>aritméticos de atribuição.</p><p>1.6.1 Operador de atribuição</p><p>Como visto anteriormente, o sinal = realiza a operação de atribuição, equivalente ao ← usado</p><p>em algoritmos para pseudocódigo.</p><p>22</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Em Java, o operador de atribuição é responsável por colocar o resultado da expressão à</p><p>direita na variável à esquerda:</p><p>variável = expressão</p><p>A expressão à direita pode ser, por exemplo:</p><p>» Uma variável</p><p>» Uma constante</p><p>» Uma expressão</p><p>» Uma chamada de método</p><p>Podemos encadear várias atribuições a partir de uma única expressão:</p><p>variavel1 = variavel2 = variavel3 = ... = expressão</p><p>Exemplos:</p><p>int i, j, k;</p><p>double max, min;</p><p>i = j = k = 1; // Todas as variáveis recebem 1</p><p>max = min = 0.0; // As variáveis max e min recebem 0.0</p><p>1.6.2 Operadores aritméticos</p><p>A tabela 3 destaca os operadores aritméticos da linguagem Java.</p><p>Tabela 3. Operados aritméticos.</p><p>Operador Ação Tipos</p><p>+ Soma Inteiro e ponto flutuante</p><p>- Subtração Inteiro e ponto flutuante</p><p>* Multiplicação Inteiro e ponto flutuante</p><p>/ Divisão Inteiro e ponto flutuante</p><p>% Resto da divisão Inteiro</p><p>++ Incremento Inteiro e ponto flutuante</p><p>-- Decremento Inteiro e ponto flutuante</p><p>Fonte: elaborada pela autora.</p><p>23</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Exemplo: Considere o seguinte trecho de programa em Java:</p><p>int x, y, soma, produto, quociente, resto;</p><p>double z = 3.0; //atribuindo na declaração</p><p>x = 10;</p><p>y = 3;</p><p>soma = x + y;</p><p>produto = x * y;</p><p>quociente = x/y;</p><p>resto = x%y;</p><p>System.out.println(“x = “ + x + “ y = “ + y + “ soma = “ + soma);</p><p>System.out.println (“Produto = “ + produto);</p><p>System.out.println (“Quociente = “ + quociente);</p><p>System.out.println (“Resto = “ + resto);</p><p>System.out.println (“Resultado da divisão: “ + x/z);</p><p>Para montar o programa completo, executá-lo e obter a saída mostrada na figura 6, só é</p><p>necessário pôr as linhas de código acima dentro da main e por fim, a main dentro de uma</p><p>classe pública, como mostrado em exemplos anteriores.</p><p>Figura 6. Saída do programa.</p><p>x = 10 y = 3 soma = 13</p><p>Produto = 30</p><p>Quociente = 3</p><p>Resto = 1</p><p>Resultado da divisão:</p><p>3.3333333333333335</p><p>Fonte: https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/ e autora.</p><p>Temos no trecho desse programa várias expressões, a saber: x * y, x/y, x/z e x%y. Observe</p><p>que, como não foi usado printf, apareceram muitas casas decimais. Se a linha</p><p>System.out.println (“Resultado da divisão: “ + x/z);</p><p>24</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>for substituída por</p><p>System.out.printf (“Resultado da divisão: %.2f” , x/z);</p><p>a tela de saída ficará conforme ilustrado na Figura 7.</p><p>Figura 7. Saída do programa usando printf.</p><p>x = 10 y = 3 soma = 13</p><p>Produto = 30</p><p>Quociente = 3</p><p>Resto = 1</p><p>Resultado da divisão:</p><p>3.3333333333333335</p><p>Fonte: https://pixabay.com/pt/vectors/computador-port%c3%a1til-computador-2298286/ e autora.</p><p>Quando existem vários operadores em uma mesma expressão, é importante saber a ordem</p><p>de precedência, ou seja, que operação deve ser realizada primeiro e quais as próximas</p><p>operações a serem realizadas.</p><p>Tabela 4. Precedência e associação dos operadores.</p><p>Operadores Associação</p><p>++ -- Direita para esquerda</p><p>* / % Esquerda para direita</p><p>+ - Esquerda para direita</p><p>Fonte: elaborada pela autora.</p><p>Por exemplo, a multiplicação, a divisão e o cálculo do resto são feitos antes da soma e</p><p>subtração. E quando se faz a multiplicação, se lê a expressão da esquerda para a direita. E</p><p>quando se tem multiplicação e divisão em uma mesma expressão? Vale a regra matemática: a</p><p>operação que aparecer primeiro é feita primeiro.</p><p>Mas, note que, assim como na Matemática, é possível mudar a precedência das operações</p><p>usando parênteses nas expressões. Vejamos alguns exemplos:</p><p>float a, b, i = 10, j = 30, k = 40;</p><p>int z = 10;</p><p>a = i + j / k; // a = 10.75. Primeiro dividiu para depois somar.</p><p>b = (i + j) / k; // b = 1. Primeiro somou e depois dividiu.</p><p>z++; //z passará a valer 11. O efeito com ++z; seria o mesmo.</p><p>25</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Importante</p><p>» O operador / pode ser aplicado tanto a valores inteiros quanto a valores de ponto flutuante (float ou double).</p><p>» Quando todos os argumentos do operador / são inteiros, então o resultado será um número inteiro, ou seja, a parte</p><p>decimal é desprezada.</p><p>int i = 6, j = 3, k = 4, r;</p><p>r = i / j; r recebe o valor 2</p><p>r = i / k; r recebe o valor 1 e não 1.5</p><p>Vejamos agora os operadores de incremento e decremento, que são muito usados em Java.</p><p>Os operadores ++ e -- podem ser pré-fixados ou pós-fixados. Assim:</p><p>{ x++ usa o valor de x e depois incrementa x</p><p>++x incrementa x e depois usa o valor já incrementado</p><p>Analogamente, temos a mesma ideia para o operador de decremento, considerando</p><p>naturalmente, a diminuição de uma unidade.</p><p>Exemplo: Qual o valor final de i, j e k nas expressões abaixo?</p><p>int i, j, k;</p><p>i = 10;</p><p>j = i++;</p><p>k = ++j;</p><p>O trecho acima pode ser reescrito como:</p><p>i = 10;</p><p>j = i;</p><p>i++;</p><p>++j;</p><p>k = j;</p><p>Assim, i, j e k terão valor 11.</p><p>26</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Observe o seguinte:</p><p>» j = i++; usa incremento pós-fixado. Então, primeiro se atribui ( j = i; ) para depois</p><p>incrementar ( i++; )</p><p>» k = ++j; usa incremento pré-fixado. Então, primeiro se incrementa ( ++j; ) para</p><p>depois atribuir a variável k o valor resultante do incremento.</p><p>1.6.3 Operadores aritméticos de atribuição</p><p>Em programação é comum termos, por exemplo:</p><p>quantidade = quantidade + 10;</p><p>variável variável expressão</p><p>salario = salario - salario * percentual / 100;</p><p>variável variável expressão</p><p>Em Java, é muito comum combinar os operadores aritméticos com o operador de</p><p>atribuição. Veja a tabela a seguir:</p><p>Tabela 5. Operadores aritméticos de atribuição.</p><p>Expressão normal Expressão</p><p>var = var + expressão var += expressão</p><p>var = var - expressão var -= expressão</p><p>var = var * expressão var *= expressão</p><p>var = var</p><p>/ expressão var /= expressão</p><p>var = var % expressão var %= expressão</p><p>Fonte: elaborada pela autora.</p><p>Então, como ficarão os exemplos mostrados? Considere que as variáveis quantidade, salario e</p><p>percentual já foram previamente declaradas.</p><p>Quantidade = quantidade + 10; ficará quantidade += 10;</p><p>salario = salario – salario * percentual / 100;</p><p>ficará</p><p>salario -= salario * percentual / 100;</p><p>27</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Saiba mais</p><p>Sintaxe de uma linguagem de programação diz respeito às regras ou normas da linguagem. Por exemplo, toda declaração</p><p>de variável em Java é finalizada com ponto e vírgula. Isso é uma regra da linguagem, que pode ou não existir em outras</p><p>linguagens de programação.</p><p>Mais adiante veremos, dentro de outro contexto, os operadores relacionais e os lógicos.</p><p>1.7 Conversão de Tipos</p><p>Quando misturamos vários tipos em uma expressão, o Java tenta sempre converter os tipos</p><p>com valores menos significativos para tipos mais significativos para não haver perda de</p><p>dados durante o processamento.</p><p>Essa conversão se dá na seguinte ordem:</p><p>byte → short → int → long → float → double</p><p>Exemplos:</p><p>Se uma expressão envolve tipos byte e int, os valores das variáveis do tipo byte serão</p><p>convertidos para int antes de avaliar a expressão.</p><p>Se uma expressão envolve os tipos int, float e double, os valores das variáveis int e float serão</p><p>convertidos para double antes da avaliação.</p><p>Uma expressão só pode ser atribuída a uma variável se o tipo dessa expressão for igual</p><p>ou menos significativo que o tipo da variável. Caso contrário, será gerado um erro de</p><p>compilação. Assim, a atribuição deve ser feita obedecendo à seguinte ordem:</p><p>byte → short → int → long → float → double</p><p>Exemplos:</p><p>» Um expressão do tipo float pode ser armazenada em uma variável do tipo float ou</p><p>double.</p><p>» Uma expressão do tipo long pode ser armazenada em uma variável do tipo long,</p><p>float ou double. Se tentar atribuir a uma variável do tipo int, ocorrerá erro.</p><p>28</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>1.7.1 Operador de casting</p><p>Para forçarmos a conversão de um tipo para outro usamos o operador de casting. Existem</p><p>duas sintaxes:</p><p>(tipo) variável converte a variável para o tipo entre parênteses</p><p>(tipo) (expressão) converte o resultado da expressão para o tipo indicado.</p><p>Exemplos:</p><p>int i = 6, j = 3, k = 4;</p><p>(float) i / j converte i para 6.0 e o resultado é 2.0</p><p>(float)(i) / k converte i para 6.0 e o resultado é 1.5</p><p>(float)(i / k) converte 1 para 1.0, ou seja, só aplica o casting depois da divisão</p><p>Para facilitar o seu aprendizado...</p><p>O que é preciso instalar para começar a testar e a fazer os primeiros programas?</p><p>O JavaSE e alguma IDE de sua preferência, dentre as sugeridas.</p><p>» Para fazer o download do Java SE Development Kit, acesse a página: https://www.</p><p>oracle.com/java/ e siga os passos, seja para Linux, Windows ou macOS.</p><p>» Para instalar o Eclipse, por exemplo, acesse a página: www.eclipse.org e siga os</p><p>passos para o download.</p><p>» Uma vez que tudo foi devidamente instalado, como começar a usar o Eclipse?</p><p>Vamos focar no que é essencial, visto que o Eclipse tem muitas opções além do</p><p>que iremos usar aqui.</p><p>» Note que a disciplina é de programação. Então, o foco não é ensinar todos os</p><p>recursos de todas as IDEs. Quando se usa uma IDE, fica simples usar outras. Além</p><p>disso, à medida que se usa uma IDE, mais recursos são descobertos.</p><p>» Veja que o menu Help tem uma ajuda, inclusive com tutorial.</p><p>Passos para criar um programa Java (arquivo de extensão .java), compilar e executar na IDE</p><p>eclipse (Version: 2022-03 (4.23.0)):</p><p>Passo 1: Após abrir a IDE, clique em File – New – Java Project</p><p>29</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Figura 8. Criando o projeto Java.</p><p>Fonte: elaborada pela autora.</p><p>Passo 2: Dê o nome do projeto (Project name). No caso, PrimeiroProg. Em seguida, no final</p><p>da mesma janela, desmarque Create module-info.java file e logo depois, clique no botão</p><p>Finish. Note que Finish significa terminar/finalizar.</p><p>Figura 9. Criando o projeto Java.</p><p>Fonte: elaborada pela autora.</p><p>Passo 3: O efeito do passo anterior é a seguinte janela</p><p>Figura 10. O primeiro projeto.</p><p>Fonte: elaborada pela autora.</p><p>30</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Passo 4: Com o botão direito do mouse na pasta src, escolha New – File, para criar um novo</p><p>arquivo na pasta. Note que src vem de source, que significa fonte. Assim, na pasta src será</p><p>escrito o arquivo .java, que é o arquivo fonte.</p><p>Figura 11. Para criar um arquivo na pasta src.</p><p>Fonte: elaborada pela autora.</p><p>Passo 5: Aparecerá uma nova janela, na qual deverá ser digitado o nome do arquivo fonte,</p><p>que será PrimeiroProg. Logo em seguida, clique no botão Finish para finalizar a criação do</p><p>arquivo.</p><p>Figura 12. Criando arquivo em src com extensão .java.</p><p>Fonte: elaborada pela autora.</p><p>Passo 6: Foi criado um arquivo (ainda vazio) de nome PrimeiroProg dentro do pacote default</p><p>(padrão). Veja à direita, parte do arquivo .java onde serão escritas as linhas do programa.</p><p>31</p><p>InTRODUçãO À LIngUagEM DE PROgRaMaçãO • CAPÍTULO 1</p><p>Figura 13. Criado o arquivo no pacote default.</p><p>Fonte: elaborada pela autora.</p><p>Passo 7: Editando o primeiro programa na janela do editor à direita, conforme a Figura 13.</p><p>public class PrimeiroProg {</p><p>public static void main (String args[]) {</p><p>System.out.println(“Primeiro programa em Java.”);</p><p>}</p><p>}</p><p>Passo 8: Salvando, compilando e executando com Run. Note que apenas para salvar,</p><p>pode ser usado o ícone do disquete ou escolher File – Save. Para apenas compilar, escolha</p><p>Project – Build Project. Mas se você já está decidido que quer executar, escolha Run – Run,</p><p>pois o projeto será compilado e executado.</p><p>Note que para as opções do menu existem teclas de atalho.</p><p>Figura 14. Executando.</p><p>Fonte: elaborada pela autora.</p><p>32</p><p>CAPÍTULO 1 • InTRODUçãO À LIngUagEM DE PROgRaMaçãO</p><p>Observe a janela do Console, onde aparece o resultado da execução do programa.</p><p>Passo 9: Provocando um erro de sintaxe no arquivo. Veja que o erro já é apontado de imediato.</p><p>Apareceu a mensagem indicando “erro de sintaxe, insira ; para completar o bloco”. Nem foi</p><p>preciso compilar, neste caso.</p><p>Figura 15. Erro de compilação.</p><p>Fonte: elaborada pela autora.</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» Java é uma linguagem cuja grande característica é a portabilidade.</p><p>» A plataforma Java é definida apenas em software e tem dois componentes: a JVM e a API Java.</p><p>» JDK é o kit de desenvolvimento Java que inclui o compilador javac, o ambiente de execução (JRE), debugging, entre outros.</p><p>» As IDEs facilitam a criação, compilação, depuração e execução de programas em Java.</p><p>» Existem oito tipos de dados primitivos em Java: int, long, float, double, char, boolean, byte e short.</p><p>» Para definir uma constante usa-se a palavra reservada final.</p><p>» Toda declaração de variável em Java começa pelo tipo e é finalizada com ponto e vírgula.</p><p>» Para saída de dados usamos System.out.print ou System.out.println ou System.out.printf.</p><p>» Para entrada de dados podemos usar a classe Scanner, que precisa ser importada com import.</p><p>» A classe Scanner encontra-se no pacote java.util.</p><p>» Operador de atribuição: =</p><p>» Operadores aritméticos: +, - , *, /, %, ++ e - - (decremento)</p><p>» Operadores aritméticos de atribuição: +=, -=, *=, /= e %=</p><p>» Operador casting: (tipo) variável ou (tipo)(expressão)</p><p>33</p><p>Introdução ao capítulo</p><p>Neste capítulo serão estudados vários comandos da linguagem Java, a saber: comandos de</p><p>seleção (if, if/else e switch...case) e comandos de repetição (while, for e do/while). Além</p><p>disso, serão estudados os operadores relacionais e lógicos, entre outros, nos levando ao uso da</p><p>tabela verdade de cada operador lógico.</p><p>Objetivos do capítulo</p><p>» Apresentar os comandos da linguagem de programação Java.</p><p>» Escrever programas mais elaborados usando mais recursos da linguagem de</p><p>programação Java.</p><p>2.1 Comandos de seleção</p><p>Assim como acontece</p><p>no dia a dia, os programas em Java também usam condições para</p><p>decidir se determinadas instruções serão executadas ou não.</p><p>Figura 16. Decisão.</p><p>Fonte: https://www.shutterstock.com/pt/image-vector/business-man-character-has-take-difficult-357576257.</p><p>2CAPÍTULO</p><p>COManDOS Da LIngUagEM Java</p><p>34</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>As estruturas de seleção são usadas para decidir se um conjunto de instruções deve ou</p><p>não ser executado. Essa decisão está baseada em uma ou mais condições. Dessa forma,</p><p>podemos ter mais de um comando, conforme ilustrado pela figura 17.</p><p>Figura 17. Estruturas de seleção.</p><p>Estruturas</p><p>de Seleção</p><p>Seleção</p><p>Simples</p><p>Seleção</p><p>Composta</p><p>Seleção de</p><p>Múltipla</p><p>Escolha</p><p>Fonte: elaborada pela autora.</p><p>2.1.1 Comando condicional simples</p><p>A seleção simples é implementada pelo comando if. Note que if significa se.</p><p>Sintaxe:</p><p>if (expressão_lógica) comando;</p><p>if (expressão_lógica) {</p><p>bloco de instruções</p><p>}</p><p>Importante</p><p>» Um bloco de instruções é um conjunto de duas ou mais instruções.</p><p>» A expressão_lógica é uma expressão que pode ser verdadeira ou falsa.</p><p>Se for verdadeira, o comando ou o bloco de instruções será executado. Caso contrário, ou seja, se a expressão_lógica for</p><p>falsa, nem o comando e nem o bloco de instruções será executado.</p><p>» As expressões lógicas, ou seja, as expressões que podem ser verdadeiras ou falsas, podem fazer uso de operadores</p><p>relacionais e/ou lógicos.</p><p>35</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Vejamos exemplos com trechos de programa em Java.</p><p>int idade = 20;</p><p>if (idade >= 18)</p><p>System.out.println(“Maior de idade.”);</p><p>System.out.println(“Continuando... “);</p><p>Análise do exemplo: Primeiro a variável idade recebe o valor 20. Em seguida, é feito um teste:</p><p>idade é maior ou igual a 18? Verdadeiro ou falso? Note o uso do operador relacional >= (maior</p><p>ou igual).</p><p>Vejamos:</p><p>» Se o teste lógico for verdadeiro, a instrução System.out.println(“Maior de idade.”);</p><p>será executada e segue-se para a próxima instrução após o if. Então, nesse caso, será</p><p>impresso na tela:</p><p>Maior de idade</p><p>Continuando...</p><p>» Se o teste lógico for falso, a instrução System.out.println(“Maior de idade.”); não será</p><p>executada e segue-se para a próxima instrução após o if, Nesse caso, será impressa na</p><p>tela apenas a mensagem Continuando...</p><p>Vejamos outro exemplo, usando um bloco de instruções.</p><p>int idade = 20;</p><p>if (idade >= 18)</p><p>{</p><p>System.out.println(“Maior de idade.”);</p><p>System.out.println(“Você pode tirar carteira de motorista.”);</p><p>}</p><p>A única diferença deste último exemplo para o anterior é que as duas instruções, a saber:</p><p>System.out.println(“Maior de idade.”);</p><p>System.out.println(“Você pode tirar carteira de motorista.”);</p><p>36</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>serão executadas caso a condição (idade >= 18) seja verdadeira e depois o fluxo da execução</p><p>seguirá para a próxima instrução após o bloco. Caso a condição seja falsa, nada no bloco</p><p>será executado e o fluxo da execução seguirá para a primeira instrução após o fim do bloco.</p><p>atenção</p><p>Note que todo bloco, visto aqui ou com qualquer outro comando, terá duas ou mais instruções que deverão ser postas,</p><p>obrigatoriamente, entre chaves.</p><p>Qualquer comando, além do comando condicional simples, que trabalhe com expressões lógicas poderá ou não fazer uso de</p><p>operadores relacionais e lógicos.</p><p>Nos dois últimos exemplos foi usado o operador relacional >= (maior igual). Para podermos</p><p>comparar valores ou expressões ou conteúdo de variáveis, por exemplo, a linguagem Java</p><p>oferece os operadores relacionais. Além estes, existem os operadores lógicos que nos</p><p>permitem escrever expressões lógicas mais interessantes.</p><p>» Operadores relacionais</p><p>Tabela 6. Operadores relacionais.</p><p>Operador Significado</p><p>> Maior que</p><p>< Menor que</p><p>>= Maior ou igual a</p><p><= Menor ou igual a</p><p>== Igual a</p><p>!= Diferente de</p><p>Fonte: elaborada pela autora.</p><p>» A sintaxe das operações relacionais é a seguinte:</p><p>expressão_arimética_1 op_relacional expressão_aritmética_2</p><p>onde op_relacional é um dos operadores da tabela anterior.</p><p>» Os operadores aritméticos têm precedência sobre os operadores relacionais.</p><p>Assim, se colocarmos esses dois tipos de operadores em uma mesma expressão, os</p><p>operadores aritméticos serão avaliados primeiro e, em seguida, os relacionais.</p><p>Exemplos:</p><p>1 + 3 >= 3 + 6 equivale a (1 + 3) >= (3 + 6), que equivale a 4 >= 9</p><p>5.0 / 3 <= 10 / (4 + 1) equivale a (5.0 / 3) <= (10 / (4 + 1))</p><p>37</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>» Operadores lógicos</p><p>Tabela 7. Operadores lógicos.</p><p>Operador Significado</p><p>&& E (anD)</p><p>|| OU (OR)</p><p>! nEgaçãO (nOT)</p><p>Fonte: elaborada pela autora.</p><p>» A sintaxe das operações lógicas é:</p><p>expressão_relacional_1 op_lógico expressão_relacional_2</p><p>Exemplos de trecho de programa em Java com operadores relacionais e lógicos:</p><p>int numero1 = 10, numero2 = 20;</p><p>if (numero1 < numero2)</p><p>System.out.println(“O primeiro número é menor que o segundo. “);</p><p>int numero1 = 10, numero2 = 20;</p><p>if (numero1 < numero2 && numero2 < 100 )</p><p>System.out.println(“O primeiro número é menor que o segundo e o segundo número é</p><p>menor que 100 “);</p><p>Note que a condição numero1 < numero2 é verdadeira, em ambos os trechos. Considerando</p><p>o 2º exemplo, temos que a condição numero2 < 100 também é verdadeira. Nesse caso, temos</p><p>que a condição é inteiramente verdadeira e, assim, a instrução</p><p>System.out.println(“O primeiro número é menor que o segundo e o segundo número é</p><p>menor que 100 “);</p><p>será executada.</p><p>Para podermos trabalhar com expressões que usam operadores lógicos, é preciso que se tenha</p><p>conhecimento da tabela verdade desses operadores. Vamos, então, relembrar!</p><p>» Tabela Verdade</p><p>Considere que Expr1 e Expr2 são duas expressões que podem ser verdadeiras ou falsas,</p><p>sendo V para verdadeiro e F para falso.</p><p>38</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>Tabela 8. Tabela verdade do e lógico.</p><p>&& que é o E lógico</p><p>Expr1 Expr2 Expr1 && Expr2</p><p>v v v</p><p>v F F</p><p>F v F</p><p>F F F</p><p>Fonte: elaborada pela autora.</p><p>Tabela 9. Tabela verdade do ou lógico.</p><p>|| que é o OU lógico</p><p>Expr1 Expr2 Expr1 || Expr2</p><p>v v v</p><p>v F v</p><p>F v v</p><p>F F F</p><p>Fonte: elaborada pela autora.</p><p>Tabela 10. Tabela verdade do não lógico.</p><p>! que é o NÃO</p><p>Expr ! Expr</p><p>v F</p><p>F v</p><p>Fonte: elaborada pela autora.</p><p>Exemplos para analisar se a expressão é verdadeira ou falsa:</p><p>float x = 3.0f, y = 1.5f;</p><p>int a = 2, b = 4, c = 3;</p><p>x > 0 || y > 0 é verdadeira</p><p>a + b > c && x – y >= 0 é verdadeira</p><p>a > b || b > c && a <= c || c == b é verdadeira</p><p>b * b - 4 * a * c >= 0 && 2 * a > 0 é falsa</p><p>(a + x > 0 && 2 * y – a > 0) || b * c > x * y é verdadeira</p><p>Qual foi o raciocínio? Vejamos, considerando aqui, para facilitar, V para verdadeiro e F para</p><p>falso:</p><p>39</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>» x > 0 || y > 0 V ou V → verdadeira</p><p>» a + b > c && x – y >= 0 6 > 3 e 1.5 >= 0</p><p>V e V → verdadeira</p><p>» a > b || b > c && a <= c || c == b F ou V e V ou F</p><p>→ V e V → verdadeira</p><p>» b * b - 4 * a * c >= 0 && 2 * a > 0</p><p>Então: 16 – 24 >= 0 e 4 > 0</p><p>→ -8 >= 0 e 4 > 0</p><p>→ F e V</p><p>→ falsa</p><p>» (a + x > 0 && 2 * y – a > 0) || b * c > x * y</p><p>Então: 5.0 > 0 e 3.0-2 >0) ou 12 > 4.5</p><p>→ (V e V) ou V</p><p>→ V ou V → verdadeira</p><p>Até agora vimos muitos tipos de operadores: aritméticos, de atribuição, de casting, relacionais,</p><p>lógicos etc. Como fica a precedência quando temos vários operadores em uma grande</p><p>expressão? Para responder a essa pergunta, temos que ver a tabela 11, que também mostra</p><p>como associar esses operadores: da direita para a esquerda (←) ou da esquerda para a direita</p><p>(→).</p><p>Tabela 11. Precedência e associatividade dos operadores.</p><p>Operador Descrição Associatividade</p><p>1º -</p><p>(tipo</p><p>!</p><p>Menos unário</p><p>Conversão de tipo</p><p>nãO lógico</p><p>←</p><p>2º *</p><p>/</p><p>%</p><p>Multiplicação</p><p>Divisão</p><p>Resto</p><p>→</p><p>3º +</p><p>-</p><p>Soma</p><p>Subtração</p><p>→</p><p>4º ></p><p><</p><p>>=</p><p><=</p><p>Maior</p><p>Menor</p><p>Maior ou igual</p><p>Menor ou igual</p><p>→</p><p>40</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>Operador Descrição Associatividade</p><p>5º ==</p><p>!=</p><p>Igual</p><p>Diferente</p><p>→</p><p>6º && E lógico →</p><p>7º || OU lógico →</p><p>8º = atribuição ←</p><p>Fonte: elaborada pela autora.</p><p>2.1.2 Comando condicional composto</p><p>Considere que seja preciso calcular a média de duas notas e a partir daí, dar uma das</p><p>mensagens: “Aprovado” ou “Reprovado”. Vamos considerar que a média para aprovação seja</p><p>7.0.</p><p>Para este problema, precisamos usar o comando condicional composto. Em Java, é o</p><p>comando if ...else. Note que if significa se e else significa senão.</p><p>Sintaxe:</p><p>if (expressão_lógica)</p><p>comando1;</p><p>else</p><p>comando2;</p><p>if (expressão_lógica)</p><p>bloco1 de instruções</p><p>else</p><p>bloco2 de instruções</p><p>if (expressão_lógica1)</p><p>comando1;</p><p>else if (expressão_lógica 2)</p><p>comando2;</p><p>else</p><p>comando3;</p><p>41</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Importante</p><p>» Um bloco de comandos/instruções é formado por duas ou mais instruções e deve estar entre chaves.</p><p>» Em um bloco de comandos, seja no if ou no else, é possível termos outro comando condicional, simples ou composto,</p><p>bem como qualquer outra instrução, como uma atribuição, por exemplo.</p><p>» O último retângulo mostra o comando if/else aninhado ou encadeado. Nesse caso, no lugar de qualquer um dos</p><p>comandos (comando1 ou comando2 ou comando3) é possível também termos blocos de instruções.</p><p>Exemplo: Para fazer um programa para o problema proposto, será adicionado o trecho com if/</p><p>else a um exemplo já visto.</p><p>import java.util.Scanner;</p><p>public class Media {</p><p>public static void main(String [] args) {</p><p>float nota1, nota2, media;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.println(“Digite a primeira nota: “);</p><p>nota1 = teclado.nextFloat();</p><p>System.out.println(“Digite a segunda nota: “);</p><p>nota2 = teclado.nextFloat();</p><p>media = (nota1+nota2)/2;</p><p>System.out.println(“Media = “ + media);</p><p>if (media >= 7.0)</p><p>System.out.println(“Aprovado “);</p><p>else</p><p>42</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>System.out.println(“Reprovado “);</p><p>} //fim main</p><p>} //fim classe</p><p>O comando condicional composto pode ser substituído por uma versão mais enxuta se for</p><p>usado o operador ternário ? : . Portanto, tal operador é usado em expressões condicionais e</p><p>sua sintaxe é:</p><p>condição ? expressão_1 : expressão_2</p><p>A avaliação dessa expressão é feita da seguinte forma:</p><p>se condição for verdadeira então</p><p>o resultado da expressão é expressão_1</p><p>senão</p><p>o resultado da expressão é expressão_2</p><p>Exemplo: Seja um trecho de programa em Java.</p><p>int menor, i, j;</p><p>if (i < j)</p><p>menor = i;</p><p>else menor = i < j ? i : j;</p><p>menor = j;</p><p>Exemplo: Como reescrever trecho com if/else de um programa anterior?</p><p>Vejamos a versão com if/else e a versão com o operador ? :</p><p>» Com if/else</p><p>if (media >= 7.0)</p><p>System.out.println(“Aprovado “);</p><p>else</p><p>System.out.println(“Reprovado “);</p><p>43</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>» Com o operador ? :</p><p>System.out.println(media >= 7.0 ? “Aprovado “ : “Reprovado “);</p><p>Exemplo: Qual é o valor de i em cada expressão?</p><p>int i = 1, j = 2, k = 3;</p><p>i = i > k ? i : k; // Resposta: 3</p><p>i = i > 0 ? j : k; //Resposta : 2</p><p>i = j > i ? ++k : --k; // Resposta: 4</p><p>Exemplo: Considere um trecho de programa em Java com o comando if...else encadeado</p><p>ou aninhado.</p><p>int num;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.println(“Digite um número:”);</p><p>num = teclado.nextInt();</p><p>if (num < 0)</p><p>System.out.println(“Valor negativo. “);</p><p>else</p><p>if (num == 0)</p><p>System.out.println(“Valor nulo. “);</p><p>else</p><p>System.out.println(“Valor positivo. “);</p><p>2.1.3 Comando switch</p><p>Considere um trecho de código em Java com vários testes em igualdade. Pode ser ruim ler</p><p>ou dar manutenção a um programa deste tipo? Sim! Imagine se o programa tiver muito mais</p><p>linhas de código.</p><p>44</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>// Trecho de um programa em Java</p><p>int num;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.println(“Digite um numero: “);</p><p>num = teclado.nextInt();</p><p>if (num == 10)</p><p>System.out.println(“Valor 10.”);</p><p>else</p><p>if (num == 20)</p><p>System.out.println(“Valor 20.”);</p><p>else</p><p>if (num == 30)</p><p>System.out.println(“Valor 30.”);</p><p>else</p><p>if (num == 40)</p><p>System.out.println(“Valor 40.”);</p><p>else</p><p>System.out.println(“Nenhum valor dentre o esperado.”);</p><p>Figura 18. Então, qual é a solução?</p><p>Usar o comando</p><p>switch.</p><p>Fonte: https://pixabay.com/pt/vectors/l%c3%a2mpada-el%c3%a9trica-id%c3%a9ia-ilumina%c3%a7%c3%a3o-1926533/.</p><p>45</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Veja o trecho anterior reescrito com switch:</p><p>int num;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.println(“Digite um número: “);</p><p>num = teclado.nextInt();</p><p>switch (num) {</p><p>case 10: System.out.println(“Valor 10. “);</p><p>break;</p><p>case 20: System.out.println(“Valor 20. “);</p><p>break;</p><p>case 30: System.out.println(“Valor 30. “);</p><p>break;</p><p>case 40: System.out.println(“Valor 40. “);</p><p>break;</p><p>default: System.out.println(“Nenhum valor dentre o esperado. “);</p><p>break; //este break é opcional, pois está no default</p><p>} //fim do switch</p><p>Observe o seguinte:</p><p>» O valor de num pode ou não estar de acordo com um dos valores constantes (10</p><p>ou 20 ou 30 ou 40). Caso não esteja, a opção default (padrão) será executada.</p><p>» Quando o comando break é executado, o switch termina.</p><p>» O default é opcional, mas quando é escrito no código, é o último trecho dentro do</p><p>switch.</p><p>46</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>» Quando nenhum case é alcançado, o default é executado e o switch termina. Daí a</p><p>razão do break ser opcional no default.</p><p>Importante</p><p>O comando switch:</p><p>» É um comando de seleção semelhante ao if-else, porém ele é mais recomendado quando temos muitos caminhos</p><p>possíveis a partir de uma única condição.</p><p>» A expressão do switch deve ser do tipo caractere (char) ou inteiro (byte, short, int ou long) ou String.</p><p>» O comando break é usado para terminar o switch.</p><p>Sintaxe:</p><p>switch(expressão) {</p><p>case valor1: comando1; //pode ter 1 ou mais comandos</p><p>comando2;</p><p>break;</p><p>case valor2: comando3; //pode ter 1 ou mais comandos</p><p>break;</p><p>case valor3: comando4; //pode ter 1 ou mais comandos</p><p>comando5;</p><p>break;</p><p>default: comando6; //pode ter 1 ou mais comandos</p><p>break; //opcional no default</p><p>}</p><p>atenção</p><p>» valor1, valor2, valor3, etc., podem ser variáveis ou constantes.</p><p>» Quando o switch encontra uma opção igual ao valor da expressão, ele executa todos os comandos daí em diante até</p><p>encontrar o comando break.</p><p>» É possível não se ter comandos em cases.</p><p>47</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Exemplo: Trecho de programa em Java com o comando switch. Considere a variável caracter</p><p>previamente declarada char caracter; e definida.</p><p>switch (caracter) {</p><p>case ‘a’:</p><p>case ‘e’:</p><p>case ‘i’:</p><p>case ‘o’:</p><p>case ‘u’: System.out.println(“É uma vogal”);</p><p>break;</p><p>case ‘x’: System.out.println(“Letra X”);</p><p>default: System.out.println(“Letra inválida”);</p><p>break;</p><p>}</p><p>Vamos simular algumas execuções!</p><p>1ª execução: Suponha que o caracter seja o e. Neste caso, o case e é alcançado e como está</p><p>vazio, segue-se em frente, “invadindo” os cases seguintes, até encontrar um break e o switch</p><p>terminar.</p><p>Então, será impressa a mensagem É uma vogal e depois, o switch termina. Note que o mesmo</p><p>ocorrerá para qualquer vogal.</p><p>2ª execução: Suponha que o caracter seja o x. Neste caso, o case x é alcançado e</p><p>é impresso</p><p>Letra X . Como não tem break neste case, a execução continua e invade o trecho a seguir, que</p><p>é o default. Então, logo em seguida é impressa Letra inválida e, por fim, o switch termina.</p><p>3ª execução: Suponha que caracter armazene um valor que não tenha em nenhum case.</p><p>Neste caso, a opção default será executada, imprimindo a mensagem Letra inválida, para</p><p>logo em seguida o switch terminar.</p><p>48</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>2.2 Comandos de repetição</p><p>Há três comandos de repetição:</p><p>» while</p><p>» for</p><p>» do...while</p><p>2.2.1 Comando while</p><p>Avalia uma expressão lógica e executa um bloco de comando enquanto a expressão lógica</p><p>for verdadeira, sendo que o bloco é executado ZERO ou mais vezes. Note que while significa</p><p>enquanto.</p><p>Sintaxe:</p><p>while (expressão_lógica)</p><p>bloco de comandos;</p><p>while (expressão_lógica)</p><p>comando;</p><p>Exemplo: Considere o trecho de programa em Java que imprime os números de 1 até 3.</p><p>int num;</p><p>num = 1;</p><p>while (num <= 3) //enquanto num for menor ou igual a 3</p><p>{</p><p>System.out.println(num); //imprime na tela o valor de num</p><p>num++; //pega o próximo número</p><p>}</p><p>Observe o passo a passo no quadro a seguir:</p><p>49</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Quadro 1. Teste de mesa.</p><p>num num <= 3 O que é impresso na tela?</p><p>1 1<= 3 ? verdadeiro 1</p><p>2</p><p>3</p><p>2 2 <= 3 ? verdadeiro</p><p>3 3 <= 3 ? verdadeiro</p><p>4 <= 3 ? Falso</p><p>Fonte: elaborado pela autora.</p><p>2.2.2 Comando for</p><p>Este comando executa um bloco de comando enquanto uma expressão lógica for verdadeira.</p><p>Sintaxe:</p><p>for (inicialização; expressão_lógica; incremento e/ou decremento)</p><p>comando;</p><p>for (inicialização; expressão_lógica; incremento e/ou decremento)</p><p>bloco de comandos;</p><p>A execução do for se dá da seguinte forma:</p><p>1. Executa a expressão de inicialização.</p><p>2. Testa a expressão lógica. Se for FALSA termina o for.</p><p>3. Executa o bloco de comandos.</p><p>4. Executa a expressão de incremento e/ou decremento.</p><p>5. Volta para o passo 2.</p><p>O comando for é equivalente ao comando while. De forma geral, podemos ter:</p><p>for (inicialização; expressão_lógica; incremento/decremento) {</p><p>comando1;</p><p>comando2;</p><p>}</p><p>50</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>Reescrevendo com o comando while:</p><p>inicialização;</p><p>while (expressão_lógica) {</p><p>comando1;</p><p>comando2;</p><p>incremento/decremento;</p><p>}</p><p>Saiba mais</p><p>O for é constituído de três partes: inicialização, expressão lógica e incremento/decremento. Entretanto, nenhuma dessas</p><p>partes é obrigatória.</p><p>Exemplo: Considere o trecho de programa em Java que imprime os números de 1 até 3.</p><p>Equivale ao trecho escrito anteriormente com while.</p><p>int num;</p><p>for (num = 1; num <= 3; num++)</p><p>System.out.println(num); //imprime na tela o valor de num</p><p>Observe que:</p><p>» num = 1 é a inicialização da variável num</p><p>» num <= 3 é a expressão ou teste lógico</p><p>» num++ é o incremento da variável num</p><p>» System.out.println(num); é a instrução/comando</p><p>Exemplo: O exemplo anterior pode ser reescrito das seguintes formas:</p><p>int num;</p><p>for (num = 1; num <= 3; ) {</p><p>System.out.println(num); //imprime na tela o valor de num</p><p>num++; //incrementa num</p><p>}</p><p>51</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Ou ainda:</p><p>int num = 1;</p><p>for ( ; num <= 3; ) {</p><p>System.out.println(num);</p><p>num++;</p><p>}</p><p>2.2.3 Comando do...while</p><p>No caso deste comando é necessário primeiro fazer (do) para depois testar. Então, podemos</p><p>ler: faça o bloco de comandos enquanto for verdade a condição ou expressão lógica. Dessa</p><p>forma, o bloco é executado uma ou mais vezes.</p><p>Sintaxe:</p><p>do {</p><p>// uma ou mais linhas de código</p><p>} while (expressão_logica);</p><p>É interessante usar este comando quando, por exemplo, o usuário entra com um valor</p><p>inválido e queremos dar outra(s) chance(s) para que a entrada seja corretamente fornecida.</p><p>Exemplo: Seja um programa em Java para ler um valor inteiro maior que zero e depois</p><p>imprimir os números de 1 até o valor fornecido na entrada.</p><p>Para este programa serão usados dois comandos de repetição diferentes:</p><p>1. Para tratar a entrada do valor inteiro que deve ser maior que zero será usado o</p><p>comando do...while.</p><p>2. Para imprimir os números de 1 até o valor inteiro positivo é possível usar for ou</p><p>while. Vejamos com for.</p><p>import java.util.Scanner;</p><p>public class Lista {</p><p>public static void main(String args[]) {</p><p>52</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>int n, i;</p><p>Scanner teclado = new Scanner(System.in);</p><p>do {</p><p>System.out.print(“Digite um valor > 0: “);</p><p>n = teclado.nextInt();</p><p>if (n <= 0)</p><p>System.out.println(“Entrada invalida. “);</p><p>} while (n <= 0);</p><p>System.out.println(“Imprime valores de 1 a “ + n);</p><p>for (i = 1; i <= n; i++)</p><p>System.out.println(i);</p><p>} //fim da main</p><p>} //fim da classe Lista</p><p>Figura 19. Saída do programa anterior.</p><p>Fonte: elaborada pela autora.</p><p>53</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Alguns comentários sobre o programa anterior:</p><p>1. A execução do trecho</p><p>do {</p><p>System.out.print(“Digite um valor > 0: “);</p><p>n = teclado.nextInt();</p><p>if (n <= 0)</p><p>System.out.println(“Entrada invalida. “);</p><p>} while (n <= 0);</p><p>é repetida enquanto o valor de n for menor ou igual a 0. Quando for digitado um</p><p>valor > 0, ou seja, positivo, o teste lógico do comando do...while será falso e a</p><p>repetição terminará.</p><p>2. Considere que o 1º valor digitado para n foi -1. Então n recebeu -1. Em seguida, o</p><p>teste do if é executado. Ou seja, -1 <= 0 ? Sim! Verdadeiro. Então, a instrução dentro</p><p>do if é executada e é impressa na tela a mensagem Entrada inválida. Em seguida, a</p><p>condição do do...while é testada e também é verdadeira. Isso faz com que o fluxo da</p><p>execução volte para o do (faça) e entre no bloco do comando.</p><p>3. Considere que o 2º valor digitado para n foi 3. Então n recebeu 3. Em seguida, o</p><p>teste do if é executado. Ou seja, 3 > 0 ? Não! Falso. Assim, a instrução dentro do if</p><p>não é executada e segue-se para o teste do do...while, que também é falso. Nesse</p><p>momento, a repetição com do..while termina e o fluxo da execução segue para o</p><p>trecho:</p><p>System.out.println(“Imprime valores de 1 a “ + n);</p><p>for (i = 1; i <= n; i++)</p><p>System.out.println(i);</p><p>que primeiramente, imprime na tela a mensagem Imprime valores de 1 a 3 e</p><p>depois faz a repetição com for, que será explicada no passo a seguir.</p><p>4. Para entender o trecho do for, veja o quadro a seguir:</p><p>54</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>Quadro 2. Teste de mesa.</p><p>i n i <= n TELA</p><p>1</p><p>2</p><p>3</p><p>1 3 1 <= 3? verdadeiro</p><p>2 2 <= 3? verdadeiro</p><p>3 3 <= 3? verdadeiro</p><p>4 4 <= 3? Falso. Sai do for</p><p>Fonte: elaborado pela autora.</p><p>5. O trecho</p><p>for (i = 1; i <= n; i++)</p><p>System.out.println(i);</p><p>poderia ter sido reescrito com while da seguinte forma:</p><p>I = 1;</p><p>while (i <= n) {</p><p>System.out.println(i);</p><p>i++;</p><p>}</p><p>Além dos comandos de seleção e repetição, veremos os comandos break e continue.</p><p>Conforme já estudado, o comando break pode ser usado nos cases do comando switch para</p><p>permitir a saída do switch. Mas existe outro uso: a saída de loops, ou seja, dos blocos de</p><p>repetição escritos com for, while ou do...while.</p><p>O trecho com do...while, do exemplo anterior, pode usar o comando break da seguinte forma:</p><p>do {</p><p>System.out.print““Digite um valor > 0:““);</p><p>n = teclado.nextInt();</p><p>if (n <= 0)</p><p>System.out.println““Entrada invalida.““);</p><p>else</p><p>break; //sai da repetição com do...while</p><p>} while (n <= 0);</p><p>55</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Assim, se o valor de n for maior que zero, por exemplo 5, o teste do if será falso e o trecho</p><p>do else será executado. Ou seja, o break será executado, interrompendo o loop. Nesse caso, a</p><p>expressão lógica do do...while não será alcançada.</p><p>Se por um lado o comando break termina o loop, o comando continue força o início da</p><p>próxima iteração do loop de um comando de repetição. Vejamos um exemplo.</p><p>Exemplo:</p><p>for (i = 5; i >= 1; i--) {</p><p>if (i == 3)</p><p>continue; //volta para a linha do for</p><p>System.out.println(i);</p><p>}</p><p>Vamos fazer um teste de mesa no quadro 3:</p><p>Quadro 3. Teste de mesa.</p><p>i i >= 1 i == 3 TELA</p><p>5</p><p>4</p><p>2</p><p>1</p><p>5 5 >= 1? verdadeiro Falso</p><p>4 4 >= 1? verdadeiro Falso</p><p>3 3 >= 1? verdadeiro verdadeiro</p><p>Obs.: Executa o continue, que direciona a execução</p><p>para a linha do for, não imprimindo o valor 3.</p><p>2 2 >= 1? verdadeiro Falso</p><p>1 1 >= 1? verdadeiro Falso</p><p>0 0 >= 1? Falso (sai do for)</p><p>Fonte: elaborado pela autora.</p><p>Para facilitar o seu aprendizado...</p><p>Vejamos alguns exemplos de programa em Java usando Eclipse, seguindo um outro possível</p><p>caminho diferente do mostrado no Capítulo 1.</p><p>Passo a passo:</p><p>1. Clique em File → New → Java Project.</p><p>Dê o nome do projeto e desmarque Module – Create module-info.java file</p><p>Clique no botão Finish.</p><p>56</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>2. Com o botão direito do mouse no nome do projeto (janela criada à esquerda), clique</p><p>em New → Class.</p><p>Aparecerá uma janela onde deverá ser escrito o nome da classe (Name: ) e depois,</p><p>deverá ser marcada a opção public static void main(String [] args). Por fim, clique</p><p>em Finish.</p><p>3. Aparecerá um arquivo .java com a classe e o método main.</p><p>4. Copie o conteúdo da main dos exemplos e teste!</p><p>Exemplo: Programa para ler um valor inteiro e dizer se o valor é par ou ímpar.</p><p>import java.util.Scanner;</p><p>public class TestaParImpar {</p><p>public static void main(String[] args) {</p><p>int num;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.print(“Digite um valor inteiro: “);</p><p>num = teclado.nextInt();</p><p>if (num % 2 == 0)</p><p>System.out.println(num + “ eh par”);</p><p>else</p><p>System.out.println(num + “ eh impar”);</p><p>}//fim main</p><p>}//fim classe</p><p>Observações:</p><p>» Acentos estão sendo evitados para impressão na tela.</p><p>57</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>» O teste do if verifica o resto da divisão de um número por 2. Sabe-se que um</p><p>número é par se o resto da divisão dele por 2 é zero. Se o número não for par, ele só</p><p>poderá ser ímpar. No caso de ser ímpar, o resto da divisão do número por 2 é 1.</p><p>Exemplo: Programa para ler um valor inteiro e dizer se ele é múltiplo de 3.</p><p>import java.util.Scanner;</p><p>public class Multiplo3 {</p><p>public static void main(String[] args) {</p><p>int num;</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.print(“Digite um valor inteiro: “);</p><p>num = teclado.nextInt();</p><p>if (num % 3 == 0)</p><p>System.out.println(num + “ eh multiplo de 3”);</p><p>else</p><p>System.out.println(num + “ nao eh multiplo de 3”);</p><p>}//fim main</p><p>}//fim classe</p><p>Exemplo: Programa para ler um valor inteiro e dizer se ele é múltiplo de 3 e de 5.</p><p>import java.util.Scanner;</p><p>public class Multiplo3_5 {</p><p>public static void main(String[] args) {</p><p>int num;</p><p>58</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>Scanner teclado = new Scanner(System.in);</p><p>System.out.print(“Digite um valor inteiro: “);</p><p>num = teclado.nextInt();</p><p>if (num % 3 == 0 && num % 5 == 0 )</p><p>System.out.println(num + “ eh multiplo de 3 e de 5”);</p><p>else</p><p>System.out.println(num + “ nao eh multiplo de 3 e de 5”);</p><p>}//fim main</p><p>}//fim classe</p><p>Exemplo: Programa para imprimir os pares de 1 até 50.</p><p>Observação: Se fosse para imprimir ímpares, o teste do if nas soluções 1 e 2 a seguir,</p><p>poderia ser:</p><p>if (i % 2 == 1)</p><p>ou</p><p>if (i % 2 != 0)</p><p>//Solução 1: com for e com teste do if</p><p>public class Pares {</p><p>public static void main(String[] args) {</p><p>int i;</p><p>System.out.println(“Numeros pares de 1 a 50”);</p><p>for (i = 1; i <= 50; i++)</p><p>if (i % 2 == 0)</p><p>System.out.println(i);</p><p>} //fim main</p><p>} //fim classe</p><p>59</p><p>COManDOS Da LIngUagEM Java • CAPÍTULO 2</p><p>Observação: A variável i poderia ter sido inicializada com 2, visto que 1 é ímpar.</p><p>//Solução 2: com while e com teste do if</p><p>public class Pares {</p><p>public static void main(String[] args) {</p><p>int i;</p><p>System.out.println(“Numeros pares de 1 a 50”);</p><p>i = 1;</p><p>while (i <= 50) {</p><p>if (i % 2 == 0) //testa se é par</p><p>System.out.println(i);</p><p>i++; //note que i++; está fora do if</p><p>} //fim while</p><p>} //fim main</p><p>} //fim classe</p><p>//Solução 3: com for e sem teste do if. Note o uso do operador +=</p><p>import java.util.Scanner;</p><p>public class Pares {</p><p>public static void main(String[] args) {</p><p>int i;</p><p>60</p><p>CAPÍTULO 2 • COManDOS Da LIngUagEM Java</p><p>System.out.println(“Numeros pares de 1 a 50”);</p><p>for (i = 2; i <= 50; i += 2)</p><p>System.out.println(i);</p><p>} //fim main</p><p>} //fim classe</p><p>Observação: i += 2 equivale a i = i + 2</p><p>Sintetizando</p><p>Síntese do capítulo:</p><p>» Os comandos de decisão são: if, if/else, switch.</p><p>» O comando if/else pode ser encadeado ou aninhado.</p><p>» O operador ternário ? : permite reescrever trechos com if/else.</p><p>» Para terminar o switch usa-se o comando break.</p><p>» O default é opcional no switch.</p><p>» while, for e do...while são comandos de repetição.</p><p>» No while o teste lógico é no início.</p><p>» No do...while o teste lógico é no final.</p><p>» Pode-se usar o comando break para terminar um loop com qualquer um dos três comandos.</p><p>» O comando continue força o início da próxima interação do loop de um comando de repetição.</p><p>61</p><p>Introdução do capítulo</p><p>De forma simplificada, podemos dizer que desenvolver um sistema é criar uma solução</p><p>computacional para um problema do mundo real.</p><p>O sistema orientado a objetos pressupõe que o mundo é composto por objetos, que integram</p><p>dados e funções. Os sistemas são criados a partir de objetos que existem no domínio do</p><p>problema, isto é, os sistemas são modelados como um conjunto de objetos que interagem</p><p>entre si.</p><p>A Orientação a Objeto (OO) é um paradigma de análise, projeto e programação baseado na</p><p>interação entre diversas unidades de software chamadas objetos.</p><p>Saiba mais</p><p>Paradigma significa modelo ou padrão.</p><p>Objetivos do capítulo</p><p>» Apresentar algumas das principais características de OO: classificação, abstração e</p><p>encapsulamento.</p><p>» Aplicar os conceitos de OO na implementação das primeiras classes.</p><p>3.1 Classes e objetos</p><p>Um objeto é a representação computacional de um elemento ou processo do mundo real.</p><p>Vejamos alguns exemplos:</p><p>martelo carro piloto casa</p><p>disciplina computador cliente aluno</p><p>3</p><p>CAPÍTULO</p><p>COnCEITOS E IMPLEMEnTaçãO</p><p>USanDO ORIEnTaçãO a OBJETOS</p><p>62</p><p>CAPÍTULO 3 • COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS</p><p>Figura 20. Objeto casa.</p><p>Fonte: https://pixabay.com/pt/vectors/casa-%c3%adcone-s%c3%admbolo-arquitetura-2492054/.</p><p>Figura 21. Objeto carro.</p><p>Fonte: https://pixabay.com/pt/vectors/bmw-carro-roadster-carro-esporte-158703/.</p><p>Para cada um dos objetos citados, é possível pensar nas características e nos comportamentos.</p><p>Cada característica é chamada de atributo do objeto.</p><p>Alguns exemplos de atributos do objeto carro:</p><p>» Cor</p><p>» Marca</p><p>» Ano de fabricação</p><p>» Tipo de combustível</p><p>É possível associar um conjunto de valores aos atributos. No caso do objeto carro, a cor do</p><p>carro pode ser vermelha, azul, verde, entre outras.</p><p>Cada comportamento é chamado de método do objeto.</p><p>Um comportamento representa uma reação ou resposta de um objeto a uma ação ou evento</p><p>do mundo real.</p><p>63</p><p>COnCEITOS E IMPLEMEnTaçãO USanDO ORIEnTaçãO a OBJETOS • CAPÍTULO 3</p><p>Alguns exemplos de comportamentos do objeto carro:</p><p>» Acelerar;</p><p>» Frear;</p><p>» Ligar farol;</p><p>» Desligar farol;</p><p>» Estacionar.</p><p>atenção</p><p>Figura 22. atributos e métodos.</p><p>característica</p><p>comportamento</p><p>atributo</p><p>método</p><p>Mundo real Mundo computacional</p><p>Fonte: elaborada pela autora.</p><p>Objetos com as mesmas características e comportamentos são agrupados em uma classe,</p><p>sendo que cada classe define um conjunto infinito de objetos.</p><p>Exemplo: Imagine os alunos de uma instituição de ensino.</p><p>» Que características você consegue observar nesses alunos?</p><p>› Nome: João, Maria, André, Ana, Felipe, Cátia, ...</p>