Baixe o app para aproveitar ainda mais
Prévia do material em texto
2 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Sumário APRESENTAÇÃO ..............................................................................................................3 VISÃO GERAL DO DESENVOLVIMENTO COM JAVA ....................................................4 VARIÁVEIS EM JAVA ........................................................................................................20 TIPOS PRIMITIVOS ...........................................................................................................27 OPERADORES ..................................................................................................................39 DECLARAÇÕES DE CONTROLE DE FLUXO .................................................................68 ARRAYS .............................................................................................................................94 RESUMO ............................................................................................................................103 MAPAS MENTAIS ..............................................................................................................112 GABARITO ........................................................................................................................146 REFERÊNCIAS ..................................................................................................................148 www.grancursosonline.com.br 3 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Apresentação Fala, meu (minha) consagrado(a) concurseiro(a)? Tudo beleza com você? Sou o professor Rogério Araújo. Sou formado em Bacharelado em Ciência da Computa- ção pela Universidade Estadual do Piauí (UESPI), especialista em Governança em TI pela Unieuro e em Desenvolvimento de Sistemas Baseados em Software Livre pela Universidade da Amazônia (UNAMA). Atualmente, estou cursando o MBA Data Science e Analytics pela USP/Esalq. Possuo as certificações Certified ScrumMaster, COBIT 4.1 Foundation Certified e Sun Certified Associate for J2SE (SCJA). Sou autor de artigos no site www.rogeraoaraujo. com.br e no blog do Gran Cursos Online (https://blog.grancursosonline.com.br/author/roge- rio-araujo/) e tenho meu canal no Youtube (www.youtube.com/rgildoaraujo). Sou professor de cursos na área de Tecnologia da Informação para concursos. Quanto à minha carreira como servidor público, atualmente trabalho na Secretaria do Tesouro Nacional, vinculada ao Ministério da Economia, exercendo o cargo de Auditor Federal de Finanças e Controle, na área de Governança de TI. Também já passei pelo Tribunal Regio- nal Federal (TRF) 1ª Região, exercendo o cargo de Analista Judiciário, na especialidade de Analista de Sistemas, e pelo Ministério Público Federal (MPF), como Técnico de Informática. Como concurseiro, fui aprovado em alguns concursos, tais como, em ordem decrescente de ano, STN 2013 (nomeado e onde estou hoje), TST 2012 (nomeado), TSE 2012 (aproveitado e nomeado no TRF 1ª Região), TRE/PE 2011 (classificado), TRT 19ª Região 2011 (classificado), MPU 2010 (classificado), STM 2010 (classificado), SERPRO 2008 (nomeado), TRT 18ª Região 2008 (classificado), MPU 2006 (classificado), BACEN 2005 (classificado), TRE/MA 2005 (classi- ficado), TRT 16ª Região 2005 (classificado), TCE/PI 2005 (classificado) e MPU 2004 (nomeado). Professor Rogerão Araújo – @profRogeraoAraujo www.grancursosonline.com.br http://www.rogeraoaraujo.com.br http://www.rogeraoaraujo.com.br https://blog.grancursosonline.com.br/author/rogerio-araujo/ https://blog.grancursosonline.com.br/author/rogerio-araujo/ http://www.youtube.com/rgildoaraujo 4 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 1. VISÃO GERAL DO DESENVOLVIMENTO COM JAVA 1.1. COMPILAÇÃO DOS ARQUIVOS.JAVA E INTERPRETAÇÃO E EXECUÇÃO DOS ARQUIVOS.CLASS Na linguagem de programação Java: • O código-fonte é escrito em arquivos texto com a extensão.java. • Esses arquivos são então compilados em arquivos.class pelo compilador javac; • Um arquivo.class: – Não contém código nativo para um processador específico; – Contém bytecodes, que é uma linguagem da Máquina do Virtual Java (JVM); – É interpretado e executado pelo comando java para criar uma instância da JVM. Detalhando o processo, temos duas fases (figuras 1.1 e 1.2): • Fase de compilação das classes Java; • Fase de interpretação e execução dos bytecodes. Na fase de compilação, compilamos nossas classes Java (arquivos texto de exten- são.java) com um compilador Java (chamado pelo comando javac seguido do nome do arquivo.java) que vem junto com um JDK (kit de desenvolvimento Java). O resultado da com- pilação das classes Java são arquivos de extensão.class que contêm bytecodes. ATENÇÃO Os bytecodes gerados a partir de uma classe são únicos: não estão em linguagem de máquina específica de uma plataforma. Temos agora a fase de interpretação e execução dos bytecodes (contidos nos arqui- vos de extensão .class). Nessa fase, os bytecodes são interpretados e executados pela Máquina Virtual Java (JVM) no cliente, onde nossa aplicação irá rodar. Usamos o comando java seguido do nome do arquivo.class para a interpretação e execução dos bytecodes. Para termos a nossa JVM, é necessário instalar no cliente um ambiente de execução Java (JRE) para o tipo específico da plataforma desse cliente. O JRE conterá a JVM. www.grancursosonline.com.br 5 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 1.1: Compilação das classes Java e interpretação e execução dos bytecodes. ATENÇÃO O JRE traz consigo a JVM. Esta interpretará e executará os bytecodes (através do coman- do java). Para cada plataforma onde iremos rodar nossa aplicação, teremos JRE e JVM específicos daquela plataforma. Não precisamos recompilar a aplicação para que possamos rodá-la em plataformas diferen- tes. Compilamos uma vez nossas classes para termos um conjunto único de bytecode e cada JVM para uma plataforma específica saberá interpretar e executar esse conjunto nessa plataforma. Assim, meu amigo, a tecnologia Java nos oferece a portabilidade! Escreva sua aplicação apenas uma vez e execute-a em qualquer lugar! www.grancursosonline.com.br 6 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 1.2: Portabilidade com a tecnologia Java. Figura 1.3: Arquivos.java e.class. www.grancursosonline.com.br 7 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 1. (FGV/2018/BANESTES/ANALISTA EM TECNOLOGIA DA INFORMAÇÃO/SUPORTE E INFRAESTRUTURA) Considere a compilação de um ou mais programas por meio da linha de comando, num ambiente Java. Nesse caso, o comando que está corretamente formado para esse fim é: a. compile teste.java –type java b. java teste.java c. javac *.java d. jvm Teste1.java teste2.java e. parse java teste.java COMENTÁRIO Compilamos nossas classes Java (arquivos texto de extensão.java) com um compi- lador Java: javac *.java O resultado da compilação das classes Java são arquivos de extensão.class que contêm bytecodes. 2. (FGV/2013/TJ/AM/ASSISTENTE JUDICIÁRIO/PROGRAMADOR) Observe a figura a seguir, que representa o ambiente Java. O arquivo.class não contém código que é nativo para seu processador, mas sim a lin- guagem de máquina da Java Virtual Machine (Java VM), conhecida por a. framecode. b. bytecode. c. bitcode. d. zipcode. e. microcode. www.grancursosonline.com.br 8 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br COMENTÁRIO O arquivo.class não contém código nativo para um processador específico. Ele contém bytecodes, que é uma linguagem da Máquina do Virtual Java (JVM) e é interpretado e exe- cutado pelo comando java para criar uma instância da JVM. 3. (FGV/2012/SENADO FEDERAL/ANALISTA LEGISLATIVO/ANÁLISEDE SUPORTE DE SISTEMAS) Observe a figura abaixo, associada à linguagem Java. Para permitir que um mesmo programa seja executado em vários sistemas operacio- nais, a plataforma java gera códigos genéricos *.class e os traduz para o código da máquina local, *.exe ou *.bin, somente no momento da execução. Nesse contexto, os códigos específicos para a máquina virtual Java, e não para a má- quina local, recebem o nome de: a. microcode. b. scriptcode. c. framecode. d. bytecode. e. javacode. www.grancursosonline.com.br 9 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br COMENTÁRIO A questão trouxe uma figura parecida com a figura 1.2. Na linguagem de programação Java: • O código-fonte é escrito em arquivos texto com a extensão.java; • Esses arquivos são então compilados em arquivos.class pelo compilador javac; • Um arquivo.class: – Não contém código nativo para um processador específico; – Contém bytecodes, que é uma linguagem da Máquina do Virtual Java (JVM); e – É interpretado e executado pelo comando java para criar uma instância da JVM. Na imagem, o JDK contém o compilador Java (chamado pelo comando javac). Também te- mos o JRE na imagem. Nesse caso, como sabemos, o JRE traz a JVM, que irá interpretar e executar os bytecodes. Só uma observação: o resultado da compilação em bytecodes de um arquivo.java é um arquivo.class, e não arquivo.jar, como está na imagem. Os arquivos.jar são pacotes que contêm vários arquivos.class. Agora, respondendo a questão, ela fala dos bytecodes. 1.2. JDK, JRE, JVM E JIT O Java Development Kit (JDK) é o conjunto de ferramentas necessárias para realizar o desenvolvimento de aplicações Java. O JDK inclui: • Java Runtime Environment (JRE); e • Ferramentas de programação: – javac: compilador; – java: interpretador; – appletviewer: visualizador de applets; – javadoc: gerador de documentação; – jar: empacotador de aplicações. Por sua vez, o Java Runtime Environment (JRE) é a plataforma Java. Ele é composto por dois componentes: • Java Virtual Machine (JVM); • Java Application Programming Interface (Java API): – É uma biblioteca de componentes que possui vários recursos úteis e é utilizada para execução de aplicações Java. www.grancursosonline.com.br 10 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br ATENÇÃO É necessário instalar um JRE específico de uma plataforma, pois junto com ele vem uma JVM que saberá lidar com essa plataforma e conseguirá executar aplicações Java naquele ambiente. Explicando a figura 1.4, temos: • Na camada mais baixa, temos o hardware específico; • Na camada mais acima, temos a plataforma Java ou o JRE; – Junto com o JRE vem a JVM e a API Java; e • Na última camada, temos a nossa aplicação Java. Figura 1.4: Onde uma classe Java é executada. Agora chegou a vez de conhecermos a Java Virtual Machine (JVM). A máquina virtual Java é a peça-chave para fornecer capacidade de multiplataforma para as aplicações Java. É o segredo da frase “Write once, run everywhere”. A JVM está disponível em muitos sistemas operacionais diferentes. Com isso, os mesmos arquivos .class são capazes de funcionar nesses sistemas operacionais: Microsoft Windows, Solaris OS, Linux, Mac OS etc. Essa máquina virtual pode ser desenvolvida por qualquer organização, desde que siga as especificações para construção de uma JVM. Ela é responsável por interpretar e executar o bytecode. Também possui a função de ser provedora de formas e meios de o aplicativo conversar com o sistema operacional. No tempo de execução, a JVM: • carrega os arquivos de classe; • determina a semântica de cada bytecode individual; e • executa a computação apropriada. www.grancursosonline.com.br 11 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Mas nem tudo são flores. O uso adicional do processador e da memória durante a inter- pretação significa que um aplicativo Java executa mais lentamente do que um aplicativo nativo. Nesse caso, para ajudar na melhora do desempenho de aplicativos Java no tempo de execução, utilizamos o Compilador Just-in-time (JIT). O JIT é um componente do JRE que ajuda a melhorar o desempenho de programas Java, compilando bytecodes no código de máquina nativo no tempo de execução. O compilador JIT é ativado quando um método Java é chamado e compila os bytecodes desse método no código de máquina nativo. Quando um método tiver sido compilado, a JVM chama o código compilado desse método diretamente, em vez de interpretá-lo. ATENÇÃO Teoricamente, se a compilação não tiver requerido tempo de processador e uso de memó- ria, compilar cada método pode permitir que a velocidade do programa Java se aproxime àquela de um aplicativo nativo. Resumindo, temos (figura 1.5): • A JVM é o coração da ideia da portabilidade usando a tecnologia Java; • Ela vem junto com o JRE, que também é composto; – pela API Java; e – pelo Compilador JIT. • O JRE deve ser instalado no ambiente dos usuários onde nossas aplicações Java rodarão. • Para os desenvolvedores, instala-se o JDK; – Que, além de trazer o JRE, inclui, entre outras ferramentas, o compilador de classes para bytecodes. www.grancursosonline.com.br 12 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 1.5: JDK, JRE, JVM e Compilador JIT. De forma geral, a plataforma JSE possui a seguinte estrutura (figura 1.6): • O JDK, que: – vai da linguagem Java até a JVM; – também inclui ferramentas e APIs para desenvolvimento de aplicações. • O JRE, que vai da API JSE até a JVM. • Inúmeras plataformas onde podemos instalar: – JDK, caso queiramos desenvolver utilizando nossa plataforma preferida; ou – JRE, onde as aplicações serão executadas. Vamos ver agora um exemplo de classe Java? www.grancursosonline.com.br 13 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 1.6: Plataforma Java Standard Edition. Exemplo: public class PrimeiroExemplo { public static void main(String[] args) { System.out.println(“As árveres somos nozes e o jardinheiro é Zezus!”); } } Resultado da execução do exemplo acima: As árveres somos nozes e o jardinheiro é Zezus! No exemplo acima, temos uma classe Java executável chamada PrimeiroExemplo. A classe possui um método especial: método main. Esse método transforma uma classe Java em uma classe executável. Entretanto, nem todas as classes precisam desse método. Para haver a compilação da nossa classe em bytecodes, utilizamos o comando javac: javac PrimeiroExemplo.java Sendo que o nome-classe deve ser o mesmo nome do arquivo. Para haver a interpretação e execução do arquivo .class resultante da compilação ante- rior utilizando o comando java: java PrimeiroExemplo www.grancursosonline.com.br 14 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Ao executarmos a classe, temos a seguinte saída: As árveres somos nozes e o jardi- nheiro é Zezus! DIRETO DO CONCURSO 4. (FGV/2016/COMPESA/ANALISTA DE GESTÃO/ADMINISTRADOR DE BANCO DE DADOS/ADAPTADO) Sobre as características da linguagem Java, analise a afirmati- va a seguir. Requer a existência de uma máquina virtual para rodar. COMENTÁRIO A JVM é responsável por interpretar e executar os bytecodes de uma aplicação Java. Tam- bém possui a função de ser provedora de formas e meios de a aplicação conversar com o sistema operacional. 5. (FGV/2010/FIOCRUZ/TECNOLOGISTA EM SAÚDE/ENGENHARIA DE PRODUÇÃO) Selecione a opção correspondente a uma linguagem de programação multiplataforma: a. C# b. Delphi c. Fox Pro d. Java e. Visual Basic COMENTÁRIO A JVM é a peça-chave para fornecer capacidade de multiplataforma para as aplicações Java. É o segredo da frase “Write once, run everywhere”. Ela está disponível em muitos sistemas operacionais diferentes. Com isso, os mesmos ar- quivos .class são capazes de funcionar nesses sistemas operacionais:Microsoft Windows, Solaris OS, Linux, Mac OS etc. E essa ideia de portabilidade é oferecida pela linguagem Java, o que faz a letra “d” ser o nosso gabarito. www.grancursosonline.com.br 15 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 1.3. Fases de uma aplicação Java Figura 1.7: Fases de uma aplicação Java. São cinco fases pelas quais passa uma aplicação Java (figura 1.7): • edição; • compilação; • carregamento; • verificação; e • execução. Figura 1.8: Fases edição e compilação de uma aplicação Java. www.grancursosonline.com.br 16 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Explicando as duas primeiras fases (figura 1.8): • Edição: – Primeiro, editamos nossas classes; – Provavelmente utilizaremos uma IDE como NetBeans ou Eclipse; – Com a edição delas, que são arquivos com extensão.java, as classes são salvas na memória secundária. • Compilação: – O compilador irá pegar os arquivos.java e os compilará, gerando os bytecodes, criando assim arquivos com extensão .class; – Os arquivos .class também são armazenados na memória secundária. As três últimas fases são (figura 1.9): • Carregamento: – O programa deve ser primeiramente colocado na memória antes de ser executado; – Isso é feito pelo carregador de classe, que pega o arquivo (ou arquivos) .class que contém os bytecodes e o transfere para a memória. • Verificação: – Antes que o interpretador Java execute os bytecodes, eles são verificados pelo veri- ficador de bytecode; – Isso assegura que os bytecodes são válidos e não violam as restrições de segu- rança do Java. • Execução: – Finalmente, a JVM lê os bytecodes e os interpreta para uma linguagem que o com- putador pode entender (linguagem de máquina); – Possivelmente armazenando valores dos dados enquanto executa o programa. www.grancursosonline.com.br 17 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 1.9: Fases carregamento, verificação e execução de uma aplicação Java. O PULO DO GATO Para ajudar a memorizar as fases, podemos usar o mnemômico ECo CaVEx: (E) edição, (Co) compilação, (Ca) carregamento, (V) verificação e (Ex) execução. A tabela 1.1 traz um resumo das fases de uma aplicação Java. Tabela 1.1: Resumo da descrição das fases de uma aplicação Java. Fase Descrição Edição O programa é criado no editor e armazenado em disco. Compilação O compilador cria bytecodes e os armazena em disco. Carregamento O carregador de classe coloca bytecodes na memória principal. Verificação O verificador de bytecodes confirma que todos os bytecodes são válidos e não violam restrições de segurança de Java. Execução A JVM lê os bytecodes e os interpreta para uma linguagem que o computador pode entender (linguagem de máquina), possivelmente armazenando valores dos dados enquanto executa o programa. www.grancursosonline.com.br 18 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br DIRETO DO CONCURSO 6. (FGV/2010/CODESP/SP/ANALISTA DE SISTEMAS/TIPO 1) A figura abaixo mostra as cinco fases para execução de programa Java O processo de execução ocorre da seguinte forma: • Na edição, o programa é criado no editor e armazenado em disco. • Na compilação, o compilador gera um PRODUTO e o armazena em disco. • Na carga, o carregador de classe coloca o PRODUTO na memória. • Na verificação, o verificador checa que o PRODUTO é válido e não viola as restrições de segurança do Java. • Na interpretação, o interpretador lê o PRODUTO e faz a tradução para uma lingua- gem que o computador pode entender, possivelmente armazenando valores de dados enquanto executa o programa. Nesse processo, PRODUTO representa o seguinte componente: a. Bytecode. b. Framework. c. Firmware. d. Framecode. e. Bytework. www.grancursosonline.com.br 19 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br COMENTÁRIO Uma aplicação Java passa pelas seguintes fases: • Edição: – O programa é criado no editor e armazenado em disco. • Compilação: – O compilador cria bytecodes e os armazena em disco. • Carregamento: – O carregador de classe coloca bytecodes na memória principal. • Verificação: – O verificador de bytecodes confirma que todos os bytecodes são válidos e não violam restrições de segurança de Java • Execução: – A JVM lê os bytecodes e os interpreta para uma linguagem que o computador pode entender (linguagem de máquina), possivelmente armazenando valores dos dados enquanto executa o programa. Então, a palavra PRODUTO citada na questão representa os bytecodes, ou seja, letra “a”. www.grancursosonline.com.br 20 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 2. VARIÁVEIS EM JAVA 2.1. INTRODUÇÃO Os programas de computadores são compostos por dados (variáveis) e código (instruções). As variáveis são recipientes (endereços de memória) que armazenam informações de um determinado tipo, para que seja possível a manipulação delas pelos programas. Também temos as constantes: • As informações contidas nas variáveis podem ser modificadas no decorrer do programa; • Enquanto as informações relacionadas a constantes não podem ser modificadas dessa maneira. Faremos uma analogia entre variáveis e constantes com garagens de carros: • Os dados são os carros. • Tanto as variáveis quanto as constantes são as garagens: – As variáveis são garagens com rotatividade de carros de mesma marca e de mesmo modelo, mas nem sempre teremos o mesmo carro estacionado. – As constantes, por sua vez, são garagens de carros de um colecionador, onde cada garagem recebe um carro de mesma marca e de mesmo modelo: uma vez um carro estacionado na garagem, ele não sai mais. • O nome das variáveis e das constantes é a identificação das garagens; • O tipo das variáveis e das constantes define qual a marca e qual o modelo de carros as garagens podem receber. Se definirmos que, em nossas garagens, caibam apenas carros do tipo Fiat Uno, para nossa tristeza, não poderemos estacionar uma Dodge Ram. Definimos o tipo da garagem para receber modelo de carro de pequeno porte, e não um modelo de carro maior. Seria como tentarmos atribuir um valor de ponto flutuante (Dodge Ram) para uma variável (gara- gem) do tipo int (Fiat Uno). 2.2. DECLARAÇÃO DE VARIÁVEIS EM JAVA Agora vamos entender as variáveis em Java. Ao declararmos uma variável, determinamos: • seu nome; • seu tipo; e • um possível valor inicial. www.grancursosonline.com.br 21 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 2.1: Esquema da declaração de variáveis em Java. O valor literal é o valor que uma variável pode receber de acordo com seu tipo. É a nossa história da garagem para receber um Fiat Uno e que não pode receber uma Dodge Ram. Na figura 2.1, o valor 15 pode ser recebido perfeitamente pela variável x que do tipo int, pois esse valor está no rol de valores recebidos por uma variável desse tipo. ATENÇÃO Para identificarmos onde uma variável foi declarada, basta vermos no código onde foi de- finido seu tipo (int x = 15;). As variáveis em Java também são chamadas de campos. Temos quatro classificações de variáveis na linguagem Java: • Variáveis de instância; • Variáveis de classe; • Variáveis locais; • Parâmetros. As variáveis de instância, também chamadas de campos não estáticos, são variáveis que mantêm informações específicas e individuais de cada objeto (ou instância) de uma classe. Quando instanciamos uma classe, ou seja, quando criamos um objeto a partir dela, os valores das variáveis de instância desse objeto pertencem apenas a ele. www.grancursosonline.com.br 22 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br O escopo dessas variáveis é de classe, ou seja, ao declararmos uma variável de classe, ela poderá ser vista em todoo corpo dessa classe (figura 2.2). As variáveis de classe são também chamadas de campos estáticos. Elas possuem o modificador static. Esse modificador informa ao compilador que haverá apenas uma cópia da variável, não importando quantas instâncias a classe tenha. As variáveis de classe são variáveis que mantêm informações da classe e não de instân- cias dessa classe e o escopo delas também é de classe (figura 2.2). Figura 2.2: Escopo das variáveis de classe e de instância. ATENÇÃO Para variáveis de classe e de instância, o escopo delas é de classe: isso significa que elas são enxergadas em qualquer ponto dentro da classe, seja dentro de um método ou dentro de um controle de fluxo qualquer dentro do limite da classe. As variáveis locais são variáveis criadas dentro do escopo de construtores, de méto- dos ou de controle de fluxos. Essas variáveis possuem escopo dessas estruturas, ou seja, são vistas apenas dentro da estrutura onde foram declaradas (figura 2.3), ou seja, as variá- veis locais podem possuir escopo de construtor, método ou controle de fluxo. Apenas antecipando, um construtor nada mais é que um método especial com o nome igual ao nome da classe e que não possui nenhum tipo de retorno onde podemos fazer devi- das inicializações de variáveis de instância quando criamos um objeto de uma classe, ou seja, quando instanciamos uma classe. www.grancursosonline.com.br 23 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 2.3: Escopo das variáveis locais. Os parâmetros são valores passados para construtores, para métodos ou para cláusula catch em um bloco try-catch, cada vez que uma exceção é capturada. A declaração dos parâ- metros é feita na assinatura dessas estruturas e eles possuem escopo dessas estruturas, ou seja, são vistos apenas dentro da estrutura onde foram declarados (figura 2.5): construtor, método ou cláusula catch em um bloco try-catch, cada vez que uma exceção é capturada. Figura 2.4: Escopo dos parâmetros. www.grancursosonline.com.br 24 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Quando declaramos variáveis, como já vimos, citamos seu tipo, seu nome e possivel- mente um valor inicial: int x = 15; Normalmente, em cada linha, temos uma declaração de variável, porém, podemos ter múl- tiplas declarações em uma linha apenas, onde usamos vírgulas para separar as declarações: int x = 15, y = 10; Recomenda-se ter uma declaração por linha. Fica muito mais fácil de manter os códigos. Importante dizer que a declaração de uma variável pode ser feita em qualquer lugar do código: int x = 15; System.out.println(x); int y = 10; Entretanto, se quiser, ao invés de “x”, imprimir o valor de “y”, no nosso exemplo, eu deve- ria declarar “y” antes do System.out.println: int x = 15; int y = 10; System.out.println(y); Para declararmos uma variável de classe, basta usar o modificador static: public static int quantidadePortas = 2; Quando desejo que uma variável tenha apenas um valor e que esse valor não possa ser modificado, ou seja, que seja uma constante, utilizo o modificador final. Com isso, teremos uma variável final. Podemos aplicar esse modificador nos seguintes tipos de variáveis em Java: • Variáveis de classe; • Variáveis de instância; • Variáveis locais; • Parâmetros. Exemplos: public static final String NOME_CLASSE = “Pessoa”; final int x = 3; public nomeMetodo(final int y) { ... } www.grancursosonline.com.br 25 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Para finalizarmos, deixarei um exemplo de classe, tendo variável de instância, variável de classe, variável final, parâmetro e variável local: public class Main { private int variavelInstancia = 15; private static int variavelClasse = 20; private static final int variavelFinal = 25; public void metodo(int parametro) { int variavelLocal = 35; System.out.println(variavelInstancia); System.out.println(variavelClasse); System.out.println(variavelFinal); System.out.println(parametro); System.out.println(variavelLocal); // A variavel i é uma variável local da estrutra de repetição. Ela só pode ser vista dentro dessa estrutura. for (int i = 0; i < 5; i++) { System.out.println(i); } public static void main(String[] args) { Main vo = new Main(); vo.metodo(30); } Resultado da execução do exemplo acima: 15 20 25 30 35 0 1 2 3 4 www.grancursosonline.com.br 26 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br DIRETO DO CONCURSO 7. (FGV/2018/BANESTES/ANALISTA EM TECNOLOGIA DA INFORMAÇÃO/SUPORTE E INFRAESTRUTURA) Analise o código Java a seguir. A execução desse código provoca: a. a exibição dos números 012. b. a exibição dos números 0122. c. a exibição dos números 0123. d. erro em tempo de compilação. e. erro em tempo de execução. COMENTÁRIO A classe Test é uma classe pública. Ela possui o método chamado method(). É um método público, sem parâmetros e não retorna nada (void). Esse método possui uma estrutura de repetição for. Dentro dela, há uma variável local i declarada dentro da estrutura (int i = 0). Ou seja, não podemos citar essa variável fora da estrutura de repetição. Veja que, após a estrutura for, há uma linha onde se imprime o valor da variável local i no console do usuário. Porém, essa variável tem escopo apenas dentro da estrutura for, o que faz gerar um erro em tempo de compilação, o que faz a letra “d” ser nosso gabarito. www.grancursosonline.com.br 27 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 3. TIPOS PRIMITIVOS 3.1. Introdução A linguagem de programação Java é uma linguagem: • de tipagem estática; • fortemente tipada. O que isso significa? Quando se diz que uma linguagem é de tipagem estática, significa dizer que temos de declarar o tipo da variável, pois esse tipo deve ser conhecido no tempo de compilação: int x = 15; No nosso exemplo, declaramos a variável x com o tipo int. Já o conceito de linguagem fortemente tipada é mais relacionado ao valor que uma variável pode receber de acordo com o tipo dela, ou seja, quando há a exigência de que os valores armazenados em uma variável sejam compatíveis com o tipo dela: int x = 15; No nosso exemplo, a variável x pode receber o valor 15, pois esse valor está entre os aceitos para o tipo int. Figura 3.1: Linguagem estática e fortemente tipada. Juntando os dois conceitos, temos o conceito da tipagem estaticamente forte que ajuda a detectar erros em tempo de compilação. Como vimos, atribuir o valor 15 para uma variável do tipo int: perfeito! Se eu fiz uma gara- gem para caber um Fiat Uno e eu estacionei um, então está tudo certo. Agora, atribuir um valor de ponto flutuante para uma variável do tipo int: OPA!!! Temos um problema detectado pelo compilador: esse valor não é compatível com o tipo int. Se minha garagem comporta apenas carros do porte do Fiat Uno, como vou comprar uma Dodge Ram e tentar estacionar lá? Claro, apenas se eu serrar algumas partes desse carrão para ele caber na garagem. Chamamos isso de casting: moldamos o valor de ponto flutuante para ficar compatível com o tipo inteiro, porém, perderemos as casas decimais, assim como perdemos partes da Dodge Ram quando a serramos. www.grancursosonline.com.br 28 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Se se atribuir uma String para uma variável do tipo int, nem o casting resolve essa atribuição. ATENÇÃO Podemos encontrar fontes citando que uma linguagem fortemente tipada é uma linguagem em que os tipos das variáveis são conhecidos em tempo de compilação. Esse conceito é o da linguagem ser de tipagem estática. O conceito de fortemente tipada é relacionado ao valor que uma variável pode receber em relação ao tipo dela. 3.2. Tipos primitivos na linguagem Java Em Java, nós temos oito tipos primitivos. Podemos dividiros tipos em dois grandes grupos: tipos numéricos e o tipo boolean, que é um tipo primitivo propriamente dito. Dentro dos tipos numéricos, temos duas subdvisões: tipos integrais e tipos de ponto flutuante. Nos tipos integrais, temos os tipos byte, short, int, long e char. Nos de ponto flutuante, temos float e double. O tipo boolean aceita apenas dois valores: true e false. true e false são os únicos valo- res aceitos por variáveis do tipo boolean. Tabela 3.1: Sobre os tipos primitivos na linguagem Java – Parte I. Tipo Bits Possui sinal Tipo de valor byte 8 Sim Inteiro short 16 Sim Inteiro int 32 Sim Inteiro long 64 Sim Inteiro boolean 1? Não Boolean char 16 Não Caracteres UNICODE float 32 Sim Ponto flutuante double 64 Sim Ponto flutuante www.grancursosonline.com.br 29 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br A primeira coluna da tabela 3.1 representa o tipo primitivo. A segunda representa quantos bits são necessários para representar cada tipo. Fiz uma ordenação crescente até a metade da tabela, de modo que os quatro tipos numéricos (exceto o char) ficassem agrupados e depois reiniciei, colocando o restante dos tipos (boolean, char, float, double). Note que os valores dos bits da primeira metade da tabela são idênticos aos da outra metade, ou seja, 16, 32, 64 e 16, 32, 64. Isso vai facilitar na memorização dos bits utilizados na representação dos tipos primitivos. Temos uma exceção na segunda metade da tabela, que é a quantidade de bits para representar o tipo boolean: esse tipo representa, normalmente, um bit de informação. Friso que é normalmente porque seu tamanho não é precisamente definido. A terceira coluna da tabela 3.1 informa se um tipo possui sinal para representar números negativos e positivos, e a quarta mostra o tipo de valor que cada tipo primitivo pode aceitar. Tabela 3.2: Sobre os tipos primitivos na linguagem Java – Parte II. Tipo Faixa de valores Valor padrão byte -27 a 27 – 1 -128 a 127 0 short -215 a 215 – 1 -32.768 a 32.767 0 int -231 a 231 – 1 -2.147.483.648 a 2.147.483.647 0 long -263 a 263 – 1 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 0L boolean true ou false – false char '\u0000' a '\uffff' – 'u\0000' float +/-3.4E-38 a +/- 3.4E+38 – 0.0f double +/-1.7E-308 a +/- 1.7E+308 – 0.0 A segunda e a terceira colunas da tabela 3.2 representam a faixa de valores que um tipo pode abranger. Essa coluna é derivada da quantidade de bits da segunda coluna da tabela 3.1. A última coluna da tabela 3.2 informa o valor padrão que uma variável pode receber de acordo com seu tipo. São três pontos que precisamos ter mais atenção, em ordem decrescente de cobrança (tabela 3.3). www.grancursosonline.com.br 30 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Tabela 3.3: Principais pontos sobre tipos primitivos para concursos. Ponto Título Descrição Primeiro ponto Quais são os tipos primitivos byte, short, int, long, boolean, char, float, doublé As bancas perguntam muito sobre isso. Temos de aprender quais são esses oito tipos Segundo ponto Quais as faixas de valores para os tipos numéricos integrais byte, short, int e long Apenas como observação, o tipo char também é numérico integral, mas as faixas de valores mais cobradas são as dos tipos numéricos integrais citados. Terceiro ponto Quantos bits (ou bytes) são usados para representar cada tipo (segunda coluna) Sendo que as quantidades de bits mais cobradas são as dos tipos numéricos integrais byte, short, int e long. Vamos entender as tabelas 3.1 e 3.2 e os principais pontos dela com uma série de esquemas. 3.2.1. Intervalos dos tipos numéricos integrais (esquema do BSIL 1329) Neste esquema, vou mostrar como aprender a memorizar quais as faixas de valores para os tipos numéricos integrais byte, short, int e long. • Primeira parte da dica: – Imagine uma criança gripada tentando dizer “psiu”: ela provavelmente dirá BSIL =) • Segunda parte da dica: – O número 1.329. • Fechando nossa dica: BSIL 1.329! www.grancursosonline.com.br 31 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 3.2: Esquema do BSIL 1.329. Explicando melhor (figura 3.2): • BSIL: – byte; – short; – int; – long. • 1.329: Cada algarismo representa o primeiro algarismo dos números da faixa de valo- res de cada tipo: – 1: -128 a 127; – 3: -32.768 a 32.767; – 2: -2 bilhões e alguma coisa a 2 bilhões e alguma coisa; e – 9: -9 trocentos e lá vai pedra a 9 trocentos e lá vai pedra. A sequência BSIL 1.329 facilita a memorização das faixas de valores de cada tipo e, se ocorrer de nos depararmos com uma questão que aborte esse tópico, usaremos essa sequência, que é uma forma de resgatarmos a informação com tranquilidade. Responderemos nossa questão sem medo e rapidamente e passaremos para frente, pois teremos muitas outras questões para responder! www.grancursosonline.com.br 32 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 3.2.2. Intervalos dos tipos numéricos integrais (esquema do 2x) Bora avançar mais um pouco na memorização da tabela dos tipos primitivos? Figura 3.3: Esquema de quantos de bits e bytes cada tipo representa. Agora aprenderemos como memorizar: • quais são os oito tipos primitivos; e • quantos bits e bytes cada tipo representa. Com esse esquema (figura 3.3), fechamos os três itens mais cobrados dos tipos primitivos. O tipo byte possui um byte de tamanho, como o próprio nome indica. Um byte possui quantos bits? Oito bits. Para o restante do grupo BSIL, basta seguir para a próxima letra multiplicando o número de bytes e de bits por 2: • short: 2 bytes ou 16 bits; • int: 4 bytes ou 32 bits; e • long: 8 bytes ou 64 bits. Agora veremos o grupo BCFD (boolean, char, float e double). O tipo boolean representa um bit de informação, mas seu tamanho não é precisa- mente definido. www.grancursosonline.com.br 33 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Esse tipo é uma exceção dos valores do grupo BCFD, porém, do segundo tipo em diante desse grupo, a sequência é a mesma do grupo BSIL: • char: 2 bytes ou 16 bits; • float: 4 bytes ou 32 bits; e • double: 8 bytes ou 64 bits. 3.2.3. Intervalos dos tipos numéricos integrais (números negativos e números positivos) Quantos bits são necessários para representar um valor negativo e outro positivo para cada tipo do grupo BSIL? Começaremos explicando sobre quantos bits são necessários para representar os números negativos. Primeiro, reservamos um bit para representar o bit de sinal. Esse bit é o bit mais à esquerda dos números binários. Para números negativos na base binária, o bit de sinal tem o valor 1. O restante da quantidade de bits que cada tipo contém representa os bits do valor (figura 3.4). Figura 3.4: Esquema de números negativos e números positivos de cada tipo. Para os números positivos, faremos o mesmo: reservamos um bit para representar o bit de sinal. No caso dos números positivos na base binária, o bit de sinal possui o valor 0. O restante da quantidade de bits que cada tipo contém representa os bits do valor (figura 3.4). www.grancursosonline.com.br 34 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Vamos explicar a quantidade de bits do tipo byte. O tipo byte possui oito bits de representação: • um bit de sinal para informar que o valor é negativo; • sete bits para representar o valor; • um bit de sinal para informar que o valor é positivo; e • sete bits para representar o valor; Para o restante do grupo BSIL, temos: • short, 16 bits de representação: – Sendo 1 para bit de sinal e 15 para representar o valor. • int, 32 bits de representação: – Sendo 1 para bit de sinal e 31 para representar o valor. • long, 64 bits de representação: – Sendo 1 para bit de sinal e 63 para representaro valor. 3.2.4. Intervalos dos tipos numéricos integrais (limites negativo e positivo) Quais são os valores limites negativo e positivo que cada tipo pode comportar? Figura 3.5: Esquema de valores limites negativo e positivo que cada tipo pode comportar. www.grancursosonline.com.br 35 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Explicando o esquema da figura 3.5: • Primeiro, temos a coluna do BSIL; • A segunda informará quantos bits cada tipo comporta; • A terceira coluna informa o valor do limite inferior do tipo; – É calculado pela fórmula -2(quantidade de bits que representa os valores). • A quarta informa o valor do limite superior do tipo; – É calculado pela fórmula 2(quantidade de bits que representa os valores) -1. O tipo byte, por exemplo, comporta oito bits de informação, então: • O menor valor negativo é -27 (-128); – Sete, porque dos oito bits, o primeiro bit representa o sinal do número; • O maior valor positivo é 27 - 1 (127); – Sete, porque dos oito bits, o primeiro bit representa o sinal do número. ATENÇÃO Para o cálculo do valor do limite positivo, usamos a fórmula 2(quantidade de bits que representa os valores) - 1. Essa subtração acontece porque o valor 0 (zero) faz parte dos valores positivos. Por isso, uma variável do tipo byte, por exemplo, pode receber de -128 a 127. São 128 valores negativos (-128 a -1) e 128 valores positivos (de 0 a 127). Para o restante do grupo BSIL, faremos a mesma coisa. 3.2.5. Intervalos dos tipos numéricos integrais (intervalo total) Com tudo o que vimos, falta apenas sabermos o intervalo total de cada tipo numérico integral. Esse esquema será fácil porque já entendemos os esquemas anteriores. www.grancursosonline.com.br 36 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 3.6: Esquema do intervalo total de cada tipo. Iniciando pelo tipo byte, temos (figura 3.6): • No lado negativo, de -128 a -1; – Ou seja, temos 128 valores negativos. • No lado positivo, de 0 a 127; – Ou seja, temos também 128 valores positivos. Frisando, 0 está no lado dos positivos, por isso, no cálculo do valor do limite supe- rior há um -1. Ao todo, uma variável do tipo byte pode receber 256 (128 negativos e 128 positivos) valo- res únicos diferentes no decorrer da execução de um programa. Agora é explicar os outros tipos do grupo BSIL: • Para o tipo short: – O valor limite negativo é -32.768; – O valor limite positivo é 32.767; – Temos então 65.536 valores diferentes para uma variável desse tipo. • Para o tipo int: – O valor limite negativo é -2 bilhões e final 648; – O valor limite positivo é 2 bilhões e final 647; – Temos então 4 bilhões e alguma coisa de valores diferentes para uma variável desse tipo. www.grancursosonline.com.br 37 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br • Para o tipo long: – O valor limite negativo é -9 lá vai pedra e final 808; – O valor limite positivo é 9 lá vai pedra e final 807; – Temos então um número grande para dedéu de valores diferentes para uma vari- ável desse tipo. 3.2.6. Simplificando a tabela de tipos primitivos • Quantos são os tipos primitivos? – Oito tipos primitivos. • Quais são os tipos primitivos? – BSIL: byte, short, int e long; e – BCFD: boolean, char, float e double. • Intervalos dos tipos numéricos integrais BSIL (exceto char): 1.329. • O tipo boolean representa um bit de informação. – Mas seu tamanho não é precisamente definido. • O tipo char também é um tipo numérico integral. 3.2.7. Inicialização das variáveis Ao declarar com algum tipo primitivo, as variáveis de escopo de classe (variáveis de instân- cia e variáveis estáticas) são inicializadas automaticamente com valores padrões desses tipos: • 0 (zero); ou • false. As variáveis locais necessitam ser explicitamente inicializadas. Se as utilizarmos sem serem inicializadas, ocorrerá um erro de compilação. DIRETO DO CONCURSO 8. (FGV/2022/TJ/TO/TÉCNICO JUDICIÁRIO/INFORMÁTICA) Na linguagem Java, o item que NÃO é parte dos tipos de dados (data types) primitivos é: a. boolean. b. decimal. c. double. d. long. e. short. www.grancursosonline.com.br 38 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br COMENTÁRIO Quantos e quais são os tipos primitivos da linguagem Java: são oito tipos primitivos: • BSIL: byte, short, int e long; e • BCFD: boolean, char, float e double. O único tipo citado na questão que não faz parte do BSIL BCFD é decimal. Portanto, a letra “b” é o nosso gabarito. 9. (FGV/2015/PGE/RO/ANALISTA DA PROCURADORIA/ANALISTA DE SISTEMAS – DESENVOLVIMENTO) São tipos primitivos na linguagem de programação Java: a. int, float, double, char, boolean. b. int, double, string, char, boolean. c. integer, real, byte, char, boolean. d. byte, word, short, integer, char. e. int, real, char, string, boolean. COMENTÁRIO Quantos e quais são os tipos primitivos da linguagem Java: são oito tipos primitivos: • BSIL: byte, short, int e long; e • BCFD: boolean, char, float e double. A letra “a” foi a única que trouxe um subconjunto correto dos tipos primitivos da linguagem Java: int, float, double, char, boolean. string, integer, real e word não são tipos primitivos dessa linguagem. Esses tipos foram citados pelas outras alternativas da questão. www.grancursosonline.com.br 39 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 4. OPERADORES 4.1. Operadores aritméticos 4.1.1. Visão geral Temos os seguintes operadores aritméticos (figura 4.1): • Adição +; • Subtração -; • Multiplicação *; • Divisão /; e • Módulo ou resto da divisão %. Figura 4.1: Operadores aritméticos. Tabela 4.1: Exemplos do uso dos operadores aritméticos. Operador Nome Exemplo + Adição x + y - Subtração x – y * Multiplicação x * y / Divisão x / y % Módulo ou resto da divisão x % y www.grancursosonline.com.br 40 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br ATENÇÃO Na linguagem Java, não há um operador de exponenciação. Para essa operação, utiliza- mos o método pow() da classe Math (Math.pow(x, y). Exemplo da operação de exponenciação em Java: int x = 2; int y = 3; System.out.println(Math.pow(x, y)); // 8.0 Esses operadores são bem tranquilos de ser aplicados, porém, há alguns detalhes que precisamos estudar. É o que veremos nos próximos tópicos. 4.1.2. Tipos dos resultados das operações aritméticas Antes de vermos detalhes de alguns operadores, é importante entendermos os tipos dos resultados das operações aritméticas (tabela 4.2). De acordo com a tabela 4.2, temos: • O tipo do resultado é int quando os dois operadores são dos tipos byte, short e int. • O tipo do resultado é long quando: – pelo menos um operador for do tipo long; e – o outro for um tipo menos preciso. • O tipo do resultado é float quando: – pelo menos um operador for do tipo float; e – o outro for um tipo menos preciso. • O tipo do resultado é doublé quando: – pelo menos um operador for do tipo doublé; e – o outro for um tipo menos preciso. www.grancursosonline.com.br 41 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Tabela 4.2: Resumo da descrição das fases de uma aplicação Java. Tipo do operando 1 Tipo do operando 2 Tipo de resultado da operação byte byte int short short int int int int Pelo menos um deles é do tipo long e o outro é do mesmo tipo ou de um tipo menos preciso. long Pelo menos um deles é do tipo float e o outro é do mesmo tipo ou de um tipo menos preciso. float Pelo menos um deles é do tipo double e o outro é do mesmo tipo ou de um tipo menos preciso. double Exemplo 1: byte j = 15; byte l = 20; byte m = (byte) (j + l); No Exemplo 1, os dois operandos j e l são do tipo byte e o resultado da operação de adição dos dois operandos é do tipo int. Com isso, houve a necessidade de sefazer casting para que a variável m do tipo byte pudesse receber o resultado da operação. Exemplo 2: int n = 15; long o = 20; int p = (int) (n - o); No Exemplo 2, o operando o é do tipo long e o tipo do operando n é de um tipo menos preciso que o primeiro operando. Então o resultado da operação de adição dos dois ope- randos é do tipo long. A variável p é do tipo int e, para que ela pudesse receber o resultado, houve a utilização de casting. Exemplo 3: float q = 15.5f; double r = 20.7; float s = (float) (q * r); double é o tipo retorno pela multiplicação da variável q do tipo float pela variável r do tipo double. Isso acontece porque um dos operandos é double e outro é de um tipo menos preciso do que double, tipo float. Por isso temos de fazer casting para que a variável s do tipo float possa receber o resultado da operação. www.grancursosonline.com.br 42 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Exemplo 4: byte t = 19; int u = 3; double v = t / u; No Exemplo 4, temos dois operandos: t do tipo byte e u do tipo int. A variável t recebeu o valor 19, e a variável u, o valor de 3. Temos também a declaração da variável v do tipo double recebendo o resultado da operação de divisão das variáveis t e u. Com isso, v receberá 6.0. Como ambos os operandos são do grupo dos tipos numéricos integrais, então o resultado da divisão no exemplo é do tipo int 6, mas a variável v é do tipo double, então haverá a con- versão automática de 6 para double (6.0). Exemplo 5: double w = 19.0; int x = 3; double y = w / x; No exemplo 5, temos dois operandos w e x, sendo a variável w do tipo double e a variável x do tipo int. Com isso, o resultado da operação de divisão entre essas variáveis será do tipo double (6.333333333333333). Como a variável y é do tipo double, então ela vai receber esse valor. 4.1.3. Operador de adição + O operador de adição + possui duas funções (figura 4.2): • Função 1: adição entre tipos numéricos; e • Função 2: concatenação de strings. Como concatenador de strings, basta que um dos operandos seja do tipo String para que o resultado da operação seja uma string concatenada. ATENÇÃO Se forem usados vários operadores de adição e vários operandos, a partir do primeiro operando do tipo String, terão a função de concatenar strings o operador de adição antes desse operando e todos os operadores de adição após ele. Exemplo: String z = 15 + 8 + “Kal-El” + 15 + 8; // z terá valor de “23Kal-El158” // 15 + 8 antes do operando “Kal-El” foram somados (23) // 15 + 8 depois do operando “Kal-El” foram concatenados (158) www.grancursosonline.com.br 43 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Figura 4.2: Funções do operador de adição +. 4.1.4. Operador de divisão / O operador de divisão / representa a divisão de: • números inteiros; e • números de ponto flutuante. No caso de divisão de números inteiros, ou seja, quando os operandos são do tipo do grupo BSIL (byte, short, int e long): • o tipo do resultado é int quando os dois operandos são dos tipos byte, short e int; • o tipo do resultado é long quando: – pelo menos um dos operandos for do tipo long; e – o outro for de um tipo igual ou menos preciso. Exemplo: int x = 15 / 2; // x receberá o valor 7 ATENÇÃO Em uma divisão de inteiros, quando o divisor for 0, leva-se a uma exceção ArithmeticException, pois não há divisão de inteiros por zero! No caso de divisão de números de ponto flutuante: • O tipo do resultado é float quando: – pelo menos um dos operandos for do tipo float; e – p outro for de um tipo igual ou menos preciso. • O tipo do resultado é double quando: – pelo menos um dos operandos for do tipo double; e – o outro for de um tipo igual ou menos preciso. www.grancursosonline.com.br 44 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Exemplo: double y = 15 / 2.0; // y terá valor 7.5. Quando da divisão de (sendo um deles dos tipos FD float/double): • número positivo por 0, produz-se resultado infinito positivo; • número negativo por 0, produz-se resultado infinito negativo; e • 0 por 0, produz-se NaN (not a number). 4.1.5. Diferença entre os operadores de divisão / e módulo % entre dois números inteiros / O operador de divisão / representa o quociente da divisão entre dois núme- ros inteiros, enquanto o operador módulo % representa o resto da divisão entre dois números inteiros (figura 4.3). Figura 4.3: Operadores de divisão / e módulo % entre dois números inteiros. DIRETO DO CONCURSO 10. (FGV/2015/TJBA/ANALISTA JUDICIÁRIO/TECNOLOGIA DA INFORMAÇÃO) Observe o seguinte trecho de código Java: www.grancursosonline.com.br 45 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br O código, quando executado, irá imprimir: a. 2.0 b. 1.5 c. 1.0 d. 0 e. um erro de operação COMENTÁRIO Organizando o código da questão, temos: public class Main { private static final int constReagente = 5; public static float quantReagente(int quantMassa, int minutos) { return quantMassa / (constReagente * minutos); } public static void main(String[] args) { System.out.println(quantReagente(15, 2)); } } Resultado da execução do código: 1.0 Antes de comentarmos o código da questão, é importante citar que a classe Main é uma classe executável por ter um método especial: método main(). Sua assinatura é: public static void main(String[] args) {... } É um método público, estático, que não retorna nada e tem um parâmetro args, que é um array de strings. 99% das questões de concursos que contêm código Java apresentam uma classe executável. Compilamos nossas classes Java (arquivos texto de extensão.java) com um compi- lador Java: javac *.java O resultado da compilação das classes Java são arquivos de extensão .class que contêm bytecodes. Voltando aos comentários do código da questão, a classe Main possui: • Um atributo constReagente. – É um atributo privado, estático, final e do tipo int. www.grancursosonline.com.br 46 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br – Ele é inicializado com o valor 5. – Esse atributo tem escopo de classe. • Dois métodos: – método main(); e – método quantReagente(). O método quantReagente(): • é um método público; • retorna um valor float; e • possui dois parâmetros formais do tipo int: quantMassa e minutos. Esse método retorna o resultado da divisão da quantMassa dividido pelo resultado da mul- tiplicação do atributo constReagente pelo parâmetro minutos. Como a operação de multiplicação está entre parênteses, então ela tem de ser aplicada primeiro, e depois se executa a operação de divisão. Dentro do método main(), há a impressão no console do usuário (System.out.println()) do resultado retornado pelo método quantReagente() passando os parâmetro reais 15 e 2. Ao ser chamado com esses valores de parâmetros reais, o método quantReagente() vai retornar o valor 1.0: • quantMassa recebe o valor 15; • minutos recebe o valor 2; • constReagente, como vimos, foi inicializado com o valor 5; • A operação de multiplicação (constReagente * minutos) retorna o valor 10; • A operação de divisão (quantMassa / 10) retorna o valor 1; – 15 / 10 = 1, pois é uma operação de divisão de inteiros. • O método retorna o valor 1.0. – Como o método retorna um valor do tipo float, o resultado da operação de divisão de inteiros será convertido automaticamente para float (1.0). Portanto, a letra “c” é o gabarito. 4.2. Operadores unários 4.2.1. Visão geral São unários porque são aplicados em apenas um operando. Temos os seguintes operadores aritméticos (figura 4.4): • Mais +; – Indica valor positivo. – Não é necessário usá-lo em números positivos. www.grancursosonline.com.br 47 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br • Menos -; – Nega uma expressão ou um número. • Incremento ++;– Incrementa um valor em um. • Decremento --; – Diminui um valor em um. • Complemento lógico !; – Inverte o valor de um boolean. Figura 4.4: Operadores unários. Tabela 4.3: Exemplos do uso dos operadores unários. Operador Nome Exemplo + Mais +x - Menos -x ++ Incremento ++x ou y++ -- Decremento --x ou y-- ! Complemento !x www.grancursosonline.com.br 48 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Exemplo: int x = 15; System.out.println(“x:” + ++x); // O resultado gerado é x: 16. Nós nos focaremos nos operadores de incremento e decremento, pois são os operadores mais cobrados deste tipo. 4.2.2. Operadores de incremento e decremento O operador de incremento ++ incrementa um valor em um. Por exemplo, se temos uma variável x do tipo int, então x++ é como se fosse x = x + 1. Já o operador de decremento --, por sua vez, diminui um valor em um. Se há uma vari- ável y do tipo int, y-- equivale a y = y – 1. Tanto o operador de incremento quanto o de decremento podem ser: • pré-fixados: quando são aplicados antes de uma variável; ou • pós-fixados: quando são aplicados depois de uma variável. Quando esses operadores são pré-fixados, avalia-se o valor incrementado ou decre- mentado de uma variável. O valor trabalhado já é o incrementado ou decrementado. Exemplo: int x = 15, y = 15; System.out.println(“x:” + ++x); // O resultado gerado é x: 16. System.out.println(“y:” + --y); // O resultado gerado é y: 14. No código acima, o valor impresso da variável x é o valor já incrementado e o valor impresso da variável y é o valor decrementado. Quando esses operadores são pós-fixados, avalia-se o valor original, ou seja, o valor traba- lhado é o valor original de uma variável. Depois o valor da variável é incrementado ou decrementado. Exemplo: int x = 15; System.out.println(“x:” + x++); // O resultado gerado é x: 15. System.out.println(“x:” + x); // O resultado gerado é x: 16. Na primeira impressão do valor da variável x, o valor dessa variável é o valor original (15), depois a variável é incrementada. Depois, na segunda impressão, o valor incrementado é impresso (16). ATENÇÃO É bem importante entender os operadores de incremento e decremento, pois são usados constantemente em questões de concursos que envolvem a linguagem Java. O enten- dimento desses operadores pré-fixados e pós-fixados é de suma importância. Há várias questões que trabalham essas diferenças, quando se avalia o valor incrementado (decre- mentado) de uma variável ou quando se avalia o valor original dessa variável. www.grancursosonline.com.br 49 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br DIRETO DO CONCURSO 11. (FGV/2010/BADESC/ANALISTA DE SISTEMAS – DESENVOLVIMENTO DE SISTE- MAS) Observe o código em Java a seguir, em que se pode verificar a aplicação dos operadores de pré-decremento e pós-decremento. Após a execução do código, as variáveis m e n exibirão, respectivamente, os valores: a. 42 e 41. b. 42 e 42. c. 42 e 43. d. 43 e 42. e. 43 e 43. COMENTÁRIO Organizando o código da questão, temos: public class Decrementa { public static void main(String[] args) { // m não foi inicializada e n = 44; int m, n = 44; // m = 43 e n = 43. m = --n; // m = 43 e n = 42. m = n--; System.out.println(m); System.out.println(n); } } www.grancursosonline.com.br 50 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Resultado da execução do código: 43 42 A classe Decrementa é uma classe executável por ter o método main(). O método main() possui duas variáveis locais do int: m e n. A variável n é inicializada com o valor 44 no momento de sua declaração. A variável m não é inicializada. Na linha m = --n, a variável m recebe o valor já decrementado da variável n, pois foi usado o operador de decremento pré-fixado. Ou seja, a variável m recebe o valor 43 e a variável n é atualizada para 43. Já na linha m = n--, a variável m recebe o valor atual da variável n (valor 43) e apenas de- pois a variável n é atualizada para 42. Isso acontece porque agora foi usado o operador de decremento pós-fixado. No final do método main(), temos: • System.out.println(m): imprime o valor 43; e • System.out.println(n): imprime o valor 42. Com tudo isso, o gabarito da questão é a letra “d”. 4.3. Operadores de igualdade e relacionais 4.3.1. Visão geral Figura 4.5: Operadores de igualdade e relacionais. O tipo do resultado da operação é boolean. www.grancursosonline.com.br 51 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Tabela 4.4: Exemplos do uso dos operadores de igualdade e relacionais. Operador Nome Exemplo == Igual a x == y != Diferente de x!= y > Maior que x > y < Menor que x < y >= Maior que ou igual a x >= y <= Menor que ou igual a x <= y instanceof É instância de x instanceof y Exemplo: boolean x = 1 < 2; // x recebe true porque 1 é menor que 2 4.3.2. Operador instanceof É um operador de comparação de tipo. Ele testa se um objeto é instância de: • uma classe; • uma subclasse; ou • uma classe que implementa uma interface. Sintaxe: objeto instanceof Classe Figura 4.6: Esquema para o entendimento do operador instanceof. www.grancursosonline.com.br 52 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Explicando o esquema da figura 4.6, vamos supor que: • Veículo seja uma superclasse; • Carro seja uma subclasse da classe Veículo; e • acelerar seja uma interface implementada pela classe Carro. No esquema, temos ainda dois objetos: • Objeto carro da classe Carro: – Carro carro = new Carro(); • Objeto veículo da classe Veículo: – Veículo veículo = new Veículo(); Supondo que o objeto veiculo é instância da classe Veículo: • veiculo instanceof Veículo: – Retorna true porque o objeto é instância dessa classe. • veiculo instanceof Carro: – Retorna false porque o objeto não é instância dessa classe. • veículo instanceof Acelerar: – retorna false porque a classe do qual o objeto é instância não implementa essa interface. Supondo que o objeto carro é instância da classe Carro: • carro instanceof Carro: – Retorna true porque o objeto é instância dessa classe. • carro instanceof Veículo: – Retorna true porque a classe do qual o objeto é instância estende dessa interface. • carro instanceof Acelerar: – Retorna true porque a classe do qual o objeto é instância implementa essa interface. ATENÇÃO Estudaremos objetos, classes e interfaces em uma próxima aula. Mais um exemplo com o operador instanceof: public class Animal { public static void main(String[] args) { Cat cat = new Cat(); System.out.println(cat instanceof Animal); System.out.println(cat instanceof Cat); } } class Cat extends Animal { } www.grancursosonline.com.br 53 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Resultado da execução do código: true true Temos duas classes no exemplo: Animal e Cat, sendo cat subclasse de Animal. No método main(), temos uma variável local cat, que é objeto da classe Cat(): • cat instanceof Animal retorna true porque cat é objeto de uma subclasse de Animal, ou seja, de Cat. • cat instanceof Cat retorna true também porque cat é objeto da classe Cat. DIRETO DO CONCURSO 12. (FGV/2017/IBGE/ANALISTA CENSITÁRIO/ANÁLISE DE SISTEMAS/DESENVOLVI- MENTO DE APLICAÇÕES) O operador instanceof em Java: I – aplica-se a operandos que sejam referências para objetos; II – aplica-se a qualquer tipo de operando; III – produz resultado do tipo boolean. Está correto o que se afirma em: a. somente I e II. b. somente I e III. c. somente II e III. d. somente III. e. I, II e III. COMENTÁRIO Comentando cada item, temos: • Item I: o operador instanceof em Java aplica-se a operandos que sejam referências para objetos. – Certo. O operador instanceof é um operador de comparação de tipo. Ele testa se um objetoé instância de uma classe, uma subclasse ou uma classe que implementa uma interface. • Item II: o operador instanceof em Java aplica-se a qualquer tipo de operando. – Errado. Não é para qualquer tipo de operando. • Item III: o operador instanceof em Java produz resultado do tipo boolean. – Certo. O operador instanceof é um dos operadores de igualdade e relacionais e o tipo do resultado da operação é boolean. Portanto, apenas o item II está errado, fazendo a letra “b” ser o gabarito da questão. www.grancursosonline.com.br 54 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 4.4. Operadores de bits 4.4.1. Visão geral Figura 1.7: Operadores de bits. Tabela 4.5: Exemplos do uso dos operadores de bits. Operador Nome Exemplo ~ Complemento ~x & AND x & y | OR x | y ^ XOR x ^ y << Deslocamento à esquerda x << y >> Deslocamento à direita x >> y >>> Deslocamento à direita sem sinal x >>> y Todos esses operadores trabalham em nível de bits e com operandos numéricos. Para fazermos as operações de bits, primeiro, devemos transformar os operandos da base deci- mal para a base binária e depois aplicar as operações bit a bit para os operandos. www.grancursosonline.com.br 55 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br ATENÇÃO Para melhor compreensão do uso desses operadores, sugiro que estude números binários e Notação de Complemento de Dois. Esses dois tópicos são importantes para entender os resultados das operações com operadores de bits. 4.4.2. Operador de complemento ~ O operador de complemento ~ inverte os bits de um número. Exemplo: byte x = ~20; // x recebe -21. A variável do tipo byte x recebe o complemento do valor 20. Com isso, x recebe -21. Tabela 4.6: Visualizando o resultado da operação com o operador de complemento. Valor inicial 128 64 32 16 8 4 2 1 Valor final 20 0 0 0 1 0 1 0 0 20 ~20 1 1 1 0 1 0 1 1 -21 De acordo com a tabela 4.6, temos: • Na primeira linha, temos os bits valor 20. • Na segunda linha, aplicamos o operador complemento no valor 20. – Com isso, todos os bits foram invertidos. – O valor encontrado depois dessa operação é -21. Como chegamos ao valor -21? A linguagem Java utiliza a notação de complemento de dois. Então faremos o seguinte: • O tipo byte possui oito bits de representação. • A coluna 128 representa o bit de sinal; – É o bit mais à esquerda. – Como vemos aqui é igual a 1, com isso, sabemos que o número é negativo. • Diminuímos 1 do valor; • Invertemos os bits; • Transformamos o número de base 2 para base 10; • Como chegamos ao valor 21, então se conclui que 11101011 na base 2 é -21 na base 10. www.grancursosonline.com.br 56 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 4.4.3. Operadores de AND &, OR | e XOR ^ Os operadores AND, OR e XOR operam sobre literais inteiros. Lembrando que temos dois tipos de literais inteiros: • int; – sendo esse o padrão; e • long. Como os operadores AND &, OR | e XOR ^ funcionam? • Para o AND, o resultado é um bit 1, se TODOS forem 1; • Para o OR, o resultado é um bit 1, se PELO MENOS um bit for 1; e • Para o XOR, o resultado é um bit 1, se os bits forem DIFERENTES. ATENÇÃO Caso os operandos sejam booleanos, o resultado será idêntico ao obtido com operadores AND condicional e OR condicional, porém sem curto-circuito, ou seja, todos os operandos serão avaliados, mesmo sem necessidade. Os operadores condicionais AND && e OR || possuem dois símbolos cada. Já os de bits AND & e OR | possuem apenas um cada. Exemplos: byte x = 93 & -21; // x recebe 73. byte y = 93 | -21; // x recebe -1. byte z = 93 ^ -21; // x recebe -74. Tabela 4.7: Visualizando o resultado das operações com os operadores AND &, OR | e XOR ^. Valor inicial 128 64 32 16 8 4 2 1 Valor final 93 0 1 0 1 1 1 0 1 93 -21 1 1 1 0 1 0 1 1 -21 & 0 1 0 0 1 0 0 1 73 | 1 1 1 1 1 1 1 1 -1 ^ 1 0 1 1 0 1 1 0 -74 www.grancursosonline.com.br 57 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br De acordo com a tabela 4.7, transformamos os valores 93 e -21 para a base binária e depois aplicamos os operadores. Com o resultado na base binária, transformamos para a base decimal e encontramos o resultado de cada operação: • 93 AND -21 é 73; • 93 OR -21 é -1; • 93 XOR -21 é 74. DIRETO DO CONCURSO 13. (FGV/2021/IMBEL/SUPERVISOR/TECNOLOGIA DE INFORMAÇÃO) Com relação aos operadores bitwise do Java, considere os valores binários a = 00111100 b = 00001101 Os valores resultantes das operações a&b e a|b são, respectivamente, a. 00011100 e 11111101 b. 00001100 e 00111101 c. 00001111 e 00111111 d. 11001110 e 00001100 e. 01101100 e 00100101 COMENTÁRIO A questão pede o resultado de a & b e a | b. Como as variáveis a e b já estão na base bi- nária, basta aplicar os operadores bit a bit e saber o resultado de cada operação. Variável e operação 128 64 32 16 8 4 2 1 a 0 0 1 1 1 1 0 0 b 0 0 0 0 1 1 0 1 & 0 0 0 0 1 1 0 0 | 0 0 1 1 1 1 0 1 ^ 0 0 1 1 0 0 0 1 De acordo com a tabela acima, temos: a & b = 000001100 a | b = 00111101 Com isso, a letra “b” é o nosso gabarito. Coloquei também o resultado com XOR ^ apenas para treinarmos: a ^ b = 00110001 www.grancursosonline.com.br 58 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 4.4.4. Operadores de descolamento Temos os operadores de deslocamento: • À esquerda <<; • À direita >>; e • À direita sem sinal >>>. Eles também operam sobre literais inteiros. Lembrando que temos dois tipos dos literais inteiros: • int; – sendo esse o padrão; e • long. ATENÇÃO Para operações com os operadores de deslocamento, os tipos de menor precisão (byte e short) são convertidos a int antes de realizar operação. É importante lembrar-se disso quando for resolver questões com esses operadores. 4.4.5. Operador de descolamento à esquerda << O operador de descolamento à esquerda <<: • Desloca para esquerda os bits do primeiro operando pelo número de bits especificado pelo segundo operando; • Preenche na direita com zero. Exemplo: byte x = 13 << 2; // x recebe 52. // 13: 00000000000000000000000000001101 // 52: 00000000000000000000000000110100 byte y = -21 << 2; // y recebe -84. // –21: 11111111111111111111111111101011 // –84: 11111111111111111111111110101100 No exemplo acima, a variável do tipo byte x recebe o resultado da operação do desloca- mento à esquerda do valor 13 em duas casas: • x então recebe 52; • Temos o valor 13 na base 2 e no tipo int (em 32 bits); – Os tipos byte e short são convertidos em int primeiro; – 00000000000000000000000000001101; www.grancursosonline.com.br 59 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br • Deslocam-se duas casas para a esquerda; – Havendo o preenchimento de zeros na direita (o que está destacado no sublinhado no valor 52 na base binária); – 00000000000000000000000000110100; • O valor final encontrado foi 52 na base binária: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte; – 110100. Ainda no exemplo, a variável do tipo byte y recebe o resultado da operação do desloca- mento à esquerda do valor -21 em 2 casas: • y então recebe -84; • Temos o valor -21 na base 2 e no tipo int (em 32 bits); – 11111111111111111111111111101011; • Deslocam-se duas casas para a esquerda; – Havendo o preenchimento de zeros na direita (o que está destacado no sublinhado no valor -84 na base binária); – 11111111111111111111111110101100; • O valor final encontrado foi -84 na base 2: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte; – 10101100. Tabela 4.8: Visualizando o resultado das operaçõescom o operador de deslocamento à esquerda <<. Valor inicial 128 64 32 16 8 4 2 1 Valor final 13 0 0 0 0 1 1 0 1 13 13 << 2 0 0 1 1 0 1 0 0 52 -21 1 1 1 0 1 0 1 1 -21 -21 << 2 1 0 1 0 1 1 0 0 -84 www.grancursosonline.com.br 60 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br 4.4.6. Operador de descolamento à direta >> O operador de descolamento à direta >>: • Desloca para direita os bits do primeiro operando pelo número de bits especificado pelo segundo operando; e • Preenche na esquerda com zero ou um; – Dependendo do bit de sinal. Exemplo: byte x = 13 >> 2; // x recebe 3. // 13: 00000000000000000000000000001101 // 03: 00000000000000000000000000000011 byte y = -21 >> 2; // y recebe -6. // –21: 11111111111111111111111111101011 // –06: 11111111111111111111111111111010 No exemplo acima, a variável do tipo byte x recebe o resultado da operação do desloca- mento à direita do valor 13 em duas casas: • x então recebe 3; • Temos o valor 13 na base 2 e no tipo int (em 32 bits); – Os tipos byte e short são convertidos em int primeiro; – 00000000000000000000000000001101; – O bit de sinal (o bit mais à esquerda) é 0. • Deslocam-se duas casas para a direita; – Havendo o preenchimento de zeros na esquerda (o que está destacado no subli- nhado no valor 3 na base binária); – 00000000000000000000000000000011; – Foi preenchido com 0 na esquerda porque o bit de sinal é 0. • O valor final encontrado foi 3 na base 2: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte; – 00000011. www.grancursosonline.com.br 61 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br Tabela 4.9: Visualizando o resultado das operações com o operador de deslocamento à direita >>. Valor inicial 128 64 32 16 8 4 2 1 Valor final 13 0 0 0 0 1 1 0 1 13 13 >> 2 0 0 0 0 0 0 1 1 3 -21 1 1 1 0 1 0 1 1 -21 -21 >> 2 1 1 1 1 1 0 1 0 -6 Ainda no exemplo, a variável do tipo byte y recebe o resultado da operação do desloca- mento à direita do valor -21 em duas casas; • y então recebe -6; • Temos o valor -21 na base 2 e no tipo int (em 32 bits); – 11111111111111111111111111101011; – O bit de sinal (o bit mais à esquerda) é 1. • Deslocam-se duas casas para a direita; – Havendo o preenchimento de uns na direita (o que está destacado no sublinhado no valor -6 na base binária); – 11111111111111111111111111111010; – Foi preenchido com 1 na esquerda porque o bit de sinal é 1. • O valor final encontrado foi -6 na base 2: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte; – 11111010. 4.4.7. Operador de descolamento à direta sem sinal >>> O operador de descolamento à direta sem sinal >>>: • Desloca para direita os bits do primeiro operando pelo número de bits especificado pelo segundo operando; e • Preenche na esquerda com zero; – Independentemente do bit de sinal. www.grancursosonline.com.br 62 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br ATENÇÃO O operador de deslocamento à direita tem dois sinais “maior que”: >>. Já o operador de deslocamento à direita sem sinal possui três sinais maior que: >>>. Exemplo: byte x = 13 >>> 2; // x recebe 3. // 13: 00000000000000000000000000001101 // 03: 00000000000000000000000000000011 byte y = (byte) -21 >>> 2; // y recebe -6. // –21: 11111111111111111111111111101011 // 1073741818 (byte, -6): 00111111111111111111111111111010 No exemplo acima, a variável do tipo byte x recebe o resultado da operação do desloca- mento à direita sem sinal do valor 13 em duas casas: • x então recebe 3; • Temos o valor 13 na base 2 e no tipo int (em 32 bits); – Os tipos byte e short são convertidos em int primeiro; – 00000000000000000000000000001101. • Deslocam-se duas casas para a direita; – Havendo o preenchimento de zeros na esquerda, independentemente do bit de sinal (o que está destacado no sublinhado no valor 3 na base binária); – 00000000000000000000000000000011. • O valor final encontrado foi 3 na base 2: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte. Ainda no exemplo, a variável do tipo byte y recebe o resultado da operação do desloca- mento à direita sem sinal do valor -21 em duas casas; • y então recebe -6; • Temos o valor -21 na base 2 e no tipo int (em 32 bits); – 11111111111111111111111111101011. • Deslocam-se duas casas para a direita; – Havendo o preenchimento de zeros na esquerda, independentemente do bit de sinal (o que está destacado no sublinhado no valor 1073741818 na base binária); www.grancursosonline.com.br 63 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br – 00111111111111111111111111111010; – Se houve o preenchimento com zeros na esquerda, então o bit de sinal agora é zero, indicando que o resultado positivo; – O número gerado então foi um grande número: 1 bilhão e alguma coisa. • O valor final encontrado foi -6 na base 2: – Como estamos trabalhando o tipo byte, então ficaremos apenas com os oito primei- ros bits da direita para a esquerda; – O oitavo bit, da direita para esquerda, é o bit de sinal do tipo byte; – 11111010. Nessa última operação, tivemos de fazer o casting, pois o valor encontrado em int é um número positivo maior que uma variável do tipo byte por comportar: byte y = (byte) -21 >>> 2; Tabela 4.10: Visualizando o resultado das operações com o operador de deslocamento à direita sem sinal >>>. Valor inicial 128 64 32 16 8 4 2 1 Valor final 13 0 0 0 0 1 1 0 1 13 13 >>> 2 0 0 0 0 0 0 1 1 3 -21 1 1 1 0 1 0 1 1 -21 -21 >>> 2 1 1 1 1 1 0 1 0 -6 Para finalizarmos, explicarei uma situação que acontece com as operações de desloca- mento à direita sem sinal. Veja o seguinte exemplo de operação de deslocamento à direita sem sinal de 32 casas, sendo seu resultado armazenado em uma variável do tipo int: int x = -1 >>> 32; // Primeiro operando -1: // 1111111111111111111111111111111 // Resultado da operação -1: // 1111111111111111111111111111111 No exemplo acima, a variável do tipo int x recebe o resultado da operação do desloca- mento à direita sem sinal do valor -1 em 32 casas: • x vai receber o valor -1; • Temos o valor -1 na base 2 e no tipo int (em 32 bits); – 1111111111111111111111111111111; www.grancursosonline.com.br 64 Professor Rogério Araújo LINGUAGEM JAVA – O BÁSICO DA LINGUAGEM www.grancursosonline.com.br • Deslocam-se 32 casas para a direita; – Porém, como o número de casas para se deslocar para direita (segundo operando) é a quantidade total de posições do tipo int (32 posições), então haverá como se fosse um deslocamento circular e o resultado será novamente o valor -1: – 1111111111111111111111111111111. O interessante é que deveria haver um preenchimento na esquerda com 0, o que poderia como resultado o valor 0 na base decimal para a variável x. Mas não é isso que acontece. Outros exemplos: int a = -2 >>> 32; // -2 int b = -5 >>> 32; // -5 int c = -45 >>> 32; // -45 Conclusão: qualquer operação com o deslocamento à direita sem sinal o onde o primeiro operando é um número negativo e o segundo operando é quantidade de bits que representa o tipo int (32) tem como resultado o próprio número negativo. Essa situação também ocorre quando temos uma variável do tipo long e são deslocadas 64 casas à direita sem sinal de um número negativo: long x = -1 >>> 64; // Primeiro operando -1: //1111111111111111111111111111111111111111111111111111111111111111 // Resultado da operação -1: //1111111111111111111111111111111111111111111111111111111111111111 Outros exemplos:
Compartilhar