Alura > Cursos de Programação > Cursos de Java > Conteúdos de Java > Primeiras aulas do curso Certificação Java SE 8 Programmer I: conteúdo além da prova

Certificação Java SE 8 Programmer I: conteúdo além da prova

Trabalhando com saída no console - Impressão em Java

Vamos entender como funciona a parte de impressão do Java, quais são os macetes, o que você tem que tomar cuidado na hora da prova. O código mais simples possível para fazer uma impressão de qualquer coisa no Java é System.out.println, e como parâmetro para o print você passa o que você quer que seja impresso, por exemplo, número 2, dentro dos parênteses.

Vamos compilar e executar, ver o que vai rolar aqui. Compilou a classe de teste de impressão, rodei, 2. Pode parecer que não imprimiu nada, mas na verdade ele imprimiu, no cantinho tem o número 2. O print tem esse comportamento estranho, esse método print tem esse comportamento, ele imprime, mas ele não pula uma linha, ele simplesmente vai imprimindo uma coisa do lado da outra.

Se eu pegasse logo abaixo um System.out.println(2), primeiro vai imprimir 1 e depois vai imprimir 2. Vamos ver como fica. Compilou, rodou, 1 e 2 no canto. O print é a forma mais básica de imprimir e ele imprime sem pular linhas, tudo vai ser impresso continuamente numa mesma linha.

Você pode para o print praticamente qualquer coisa, ele tem várias sobrecargas e cada sobrecarga recebe ou um objeto ou um tipo primitivo diferente. Por exemplo, 1 é um tipo inteiro, posso passar 2.0, estou passando um boolean. Posso passar também um texto, uma string, ele também vai aceitar.

Também posso passar um char. Tudo isso são opções válidas, você pode passar qualquer coisa para o print, ele vai conseguir imprimir. Só para confirmar tudo, teste de impressão, compilou, rodou, 1, que era o inteiro, 2.0, que era o primitivo, texto, que era string, e o a, que era apenas o char.

O print tem n sobrecargas, praticamente tudo que você passar para ele, ele vai conseguir imprimir, inclusive objetos. Você pode pegar e passar para o print um objeto qualquer. Vou aproveitar e vou passar um new TesteImpressao, vou apagar os códigos de cima, vamos ver o que vai ser impresso nesse local.

Olha que negócio esquisito, TesteImpressao@677327b6, toda vez que você manda imprimir o conteúdo de um objeto usando o método print o Java vai automaticamente tentar pegar esse objeto e convertê-lo para uma string. O Java faz isso chamando o método toString, que existe naquele objeto.

Caso você não faça nada, você não sobrescreva esse comportamento, o Java tem um comportamento padrão que vai imprimir mais ou menos nesse formato. Isso é o toString da classe object, que todos os objetos herdam. Sempre vai ser mais ou menos esse formato, nome da classe, arroba, algum número maluco.

Se você quiser imprimir alguma coisa diferente quando está passando um objeto, você precisa sobrescrever esse método. Vamos fazer isso no nosso código. Vai ficar public String toString(), aqui dentro você pode retornar o texto que você preferir, então um objeto do tipo TesteImpressao, vamos colocar isso aqui.

Agora quando rodar este mesmo código ao invés de aparecer o código maluco que é o toString default de object, já recebo um objeto do tipo TesteImpressao, que é exatamente o que eu pedi para ser impresso quando sobrescrevesse o método toString.

Para qualquer objeto que você passe para o método print ele sempre vai chamar o toString. Há apenas uma única exceção a essa regra. Só tem um único objeto que você vai passar aqui e ele não vai chamar o toString default ali. Vamos fazer um teste. Ao invés de passar new TesteImpressao vou passar primeiro um new int [10].

Como já discutimos em outros pontos do curso, arrays são por si só objetos, então quando imprimo um new int [10] estou mandando imprimir um novo array de tamanho 10. Vamos ver como fica isso.

Quando mandei imprimir um array, olha o que apareceu, qualquer coisa maluca com um colchete no começo. Isso é o toString mais ou menos de qualquer array do Java. A única exceção, a única coisa que você vai passar para o print e não vai imprimir naquele formato, não vai chamar o toString é se você passar para ele um array de char, de caracteres.

Vou passar um novo array de caracteres, vamos ver como isso fica. Ao invés de ser new int [10] vamos passar new char [10], vou comentar essa linha de cima. Vamos recompilar nosso código, rodou. Não imprimiu nada, porque o array está vazio. Vamos colocar algumas coisas dentro desse array para ver como fica.

Ao invés de criar um array assim vou primeiro atribuir ele numa variável inicializar, char[] letras = {'a', 'b'}, isso é uma inicialização válida para um array. E vamos passar aqui dentro do System.out.println(letras). Salvei, vamos ver o que vai acontecer agora.

Falhou, ele deu um espaço a mais. Recompila, agora sim, tudo certo. Vamos mandar imprimir agora, mandou rodar. Ele imprimiu ab. Então, a única coisa que você vai passar para o método de impressão do Java e ele vai imprimir o conteúdo independente do que esteja lá dentro, é um array de char. Qualquer outro objeto que você passar para o método de impressão sempre vai invocar esse método toString.

Esse comportamento acontece porque existe uma sobrecarga no método print específica para receber array de char. Então, um array de inteiros vai cair no mesmo método de object. Um array de char tem um método específico só para ele e lá dentro desse método ele faz o loop e imprime caractere por caractere desse array.

Vou apagar essa parte do array, e seguinte, e se eu quisesse imprimir, mas eu quisesse uma quebra de linha? Como fazer? Vou escrever certo texto, dou “Ctrl + V” embaixo, salvei, e embaixo vamos colocar outro texto. Se eu rodar o código exatamente desta maneira, compilar e rodar, você vê que sai tudo junto, foo e bar. Tudo colado um no outro.

E se eu quisesse uma quebra de linha? Como fazer? Usando o método print você pode concatenar em qualquer lugar um \n, dentro de uma string representa uma quebra de linha. Então recompilando e rodando, foo sai numa linha, quebrou a linha, veio para a linha de baixo e o bar está aqui.

Se você quiser, podemos ao invés de usar somente um método print, existe outro método que é o println, esse é até o que usamos com mais frequência, que além de imprimir o conteúdo sempre vai quebrar uma linha. Usando println vamos ver como fica.

Foo e bar cada um na sua linha separada, sempre ao final ele vai lá e quebra uma linha. O println possui exatamente as mesmas regras, mesmas sobrecargas do método print, ou seja, tudo que você passar aqui ele vai acabar invocando o toString de object, ou o toString do objeto que você passou. Exceto para arrays de chars que ele vai realmente imprimir o conteúdo do array. Qualquer outro objeto que você passe aqui dentro ele vai chamar o método toString. Se for um tipo primitivo, ele vai imprimir o primitivo sem nenhum tipo de problema.

O print e o println apenas imprimem o que você passar na saída. Às vezes você quer imprimir, mas queria, por exemplo, que todos os números que eu imprimisse ficassem com duas casas depois da vírgula, ou que tudo tivesse no máximo cinco caracteres. Queria quebrar o texto sempre no quinto caractere.

Tem como você fazer isso, existe um método dentro da parte de impressão que cuida de fazer a impressão formatada do conteúdo. Formatar o que será impresso na saída do console. Temos dois métodos que fazem isso, na verdade. Tem o método que chama format e tem outro método que chama printf.

Tanto o format quanto o printf funcionam exatamente da mesma maneira. Por que você tem duas opções então? O pessoal colocou o método format a partir do Java 5 para permitir que você tenha uma impressão formatada assim como você já tinha na linguagem C, e para isso eles incluíram esse método format, só que na linguagem C para fazer uma impressão formatada nós usamos um método que chama printf.

Então, para manter uma sintaxe mais próxima da linguagem C, para quem já programou em C olhar para o código e não ficar tão assustado, não entender o que está acontecendo, eles criaram esse outro método, que é o printf, que internamente só chama o format, os dois funcionam exatamente igual. É apenas uma forma de deixar mais legível para quem vem da linguagem C.

Como esses caras funcionam? Vamos botar um texto, vou usar o format como exemplo, vou colocar dentro um texto e vamos tentar entender como esse método funciona.

O texto vai ser o seguinte, hello %s, have a nice day, e Mario. Essa daqui seria a sintaxe do format. Está vendo como está a mensagem? E estou passando um nome logo em seguida, que é Mário. Vamos ver o que vai rolar quando eu rodo esse código.

Compilou normalmente, vamos rodar agora. Hello Mário, have a nice day, percebeu o que aconteceu? Esse %s no meio do meu texto que estou imprimindo foi substituído pelo parâmetro que passei, o segundo parâmetro que passei nesse método format.

O format tem alguns caracteres de marcação, todos eles começam com o símbolo de percentual, e onde tem esses caracteres de marcação o format vai automaticamente incluindo pedaços de texto, ou primitivos, ou qualquer coisa que você tenha passado para ele, e ele vai encaixando isso no texto.

Existem regras para ver como isso acontece. Nesse caso, por exemplo, temos o percent, que é o caractere que vai dizer para o format que no meio é onde você vai inserir alguma coisa, e o s. Esse %s quer dizer que nesse lugar você vai inserir uma string, esse s significa string. E qual será a string? É a que estou passando como segundo parâmetro desse método.

Você pode não só passar textos, você não pode só jogar textos no meio de uma string, você pode jogar qualquer coisa. E além de só concatenar ali, na verdade não é bem concatenação, chamamos essa inclusão no meio do texto de interpolação, você pode passar números primitivos, números decimais, qualquer coisa aí.

Tem uma regra para você conseguir fazer essa formatação. Vamos entender como é a regra. Você sempre vai passar nesse formato aqui. Primeiro o percent, depois índice, vou explicar já para que serve cada coisa dessa. Depois flags, o tamanho, depois a precisão, e por último o tipo.

Quase tudo aí é opcional. A única coisa que você é obrigado a passar é o percent e o tipo. Exatamente o que fizemos aqui. O percent e o tipo, que no caso é string. Tem uma tabela aqui que descreve como você representa cada um dos tipos.

Fica assim, se eu quiser imprimir um booleano ponho um b, se for um caractere c, números inteiros d, números de ponto flutuante f, strings s, e n caso você queira incluir uma quebra de linha. Se você colocar em qualquer lugar do texto %n ele vai incluir uma quebra de linha.

Vamos testar alguns desses parâmetros, ver como eles funcionam. Vou apagar o texto e colocar %b %n, false, vamos aproveitar e já colocar mais alguns, em um vou passar %d, que é número, 42. Para números de ponto flutuante f, então vamos passar o número de ponto flutuante, 45.7. Vamos salvar, compilar e ver o que acontece.

Imprimiu false, 42, e o 45.70000, que é o número de casas decimais. Para você fazer essa interpolação basta usar o tipo certo com o caractere certo e passar o parâmetro.

Trabalhando com saída no console - Controlando a ordem

Se você passar errado vai acontecer um problema. Vamos arrancar fora a primeira linha, d é 42, que é um número inteiro, e se ao invés de 42 eu resolvesse passar a letra a? O que será que vai acontecer? Vamos recompilar o código. Rodou. Illegal format conversion exception, d é diferente de Java.lang.string. Se você fala que é um tipo numérico e você passa um texto, vai dar problema, então tem que estar bem atento ao tipo específico da formatação e ao tipo do objeto que você está passando. Tem que ser totalmente compatíveis.

Você pode inclusive usar mais de um. Já estou usando o d juntamente com o n, mas você poderia até criar um texto relativamente complexo, podemos fazer %s, o número : %d está correto? : %b%n. Eu falei que tenho %s, então tenho uma string, %d, aí tem um número, e um %b colado com %n, quer dizer que tem um booleano.

Como você faz para interpolar tudo isso ao mesmo tempo? É só passar os parâmetros no format. Primeiro é uma string, então vou passar sim, o segundo é um número, 42, e o terceiro é um booleano, true, salva, vamos compilar e ver o que vai acontecer.

Sim, o número 42 está correto, true, então ele vai interpolar um monte de valores ao mesmo tempo na string, não precisa ser um por vez, pode ter vários, quantos você quiser, ele vai interpolando na ordem que você passou como parâmetro. Mas você não é obrigado necessariamente a passar tudo na ordem, desde que você indique a ordem que você quer.

Vamos fazer o teste. Vamos apagar esse conteúdo e colocar algo diferente. Vou pegar, tem uma string de interpolação, então vou fazer assim, %s %s, e nossos parâmetros, world e hello, tem dois %s dentro do texto, estou passando duas strings para o método format, compilou, rodou, apareceu world hello, porque realmente, ele imprime exatamente na ordem que eu passei.

Se você quiser controlar qual a ordem, lembra quando estávamos falando o que você precisa falar? A primeira coisa que você pode informar na formatação é a posição que você quer. A posição fazemos logo após o percent você coloca a posição que você quer, quero que seja segunda string, e você diz que esse 2 é a posição usando um cifrão.

Aqui é para imprimir o segundo parâmetro, e o segundo parâmetro é do tipo string, o tipo é sempre obrigatório. Eu vou imprimir o primeiro parâmetro, vai ficar %2 $s %1$s, vamos ver o que vai acontecer agora.

Compilou e rodou. Olha como apareceu agora, hello world, ele trocou a ordem. Se você quiser passar os parâmetros na ordem que você quiser você ainda assim consegue controlar a ordem que eles vão aparecer dentro do texto usando esse delimitador. O número, a posição do parâmetro e um cifrão.

Presta bastante atenção, a posição começa em 1, a base é 1, não começa em 0. Então o primeiro parâmetro realmente é o número 1. Dessa forma inclusive se eu quiser imprimir a mesma coisa duas vezes dentro do texto você consegue. Vamos imprimir hello hello.

Vai começar imprimindo o segundo parâmetro depois vai imprimir o segundo parâmetro de novo. Você até pode repetir o que você quiser, desde que você saiba o índice do parâmetro que você vai repetir. Você pode também dizer com quantos caracteres no mínimo algo será impresso.

Vamos fazer uma troca rápida, vou colocar colchetes, quero saber exatamente o que tem dentro dos colchetes e vou imprimir um número, vamos passar nosso número mágico 42. Eu queria que esse 42 fosse impresso com pelo menos cinco caracteres. Como será que faz isso? É só colocar o número 5.

Repara que é muito parecido com você dizer a posição, só que para dizer a posição você precisa ter o cifrão para indicar que aquilo é um posicionamento. Se você só coloca um número o format vai considerar que aquele número é a quantidade mínima de casas que você quer imprimir.

Vamos ver como fica, %5d, você vê que ele está dentro de colchetes. Os colchetes são para conseguirmos ver os espaços. Vamos colocar isso para imprimir. Antes de imprimir vou colocar um %n só para facilitar a visualização. Compila. Roda. O 42 aqui. Tem um monte de espaços em branco e mais o número, total cinco posições. Cinco tamanhos, porque nós definimos que o tamanho mínimo seria 5.

Você pode usar isso tanto para números quanto para textos também. Você pode fazer isso com texto, então vamos colocar um texto agora foo, o foo tem que ser impresso com pelo menos cinco caracteres. Vamos compilar e rodar.

42, com cinco posições, e o foo também com cinco posições. Se você passar uma coisa que é maior do que aquele tamanho mínimo, esse tamanho é sempre o mínimo, ele simplesmente vai ignorar e imprimir. Vamos fazer foofoo, seis caracteres. Eu falei que eu queria imprimir em no mínimo cinco. Rodamos, o foofoo imprime, o conteúdo continua sendo impresso totalmente, mas ele passa a usar um caractere a mais, porque aquele número é a quantidade mínima, não a máxima. Ele não vai cortar seu conteúdo.

Tem algumas flags que você precisa saber também, além dessa ideia de espaços, tem alguns caracteres que ativam ou não coisas específicas da impressão. Vamos apagar esses dois, deixar só o número. Imagine o seguinte, se você quiser você pode falar que toda vez que for imprimir um número positivo quero o símbolo de mais na frente, então coloco um mais aqui.

Vamos fazer um teste. 42, tem o mais, e estou passando -50, então um é positivo e um é negativo. Esse mais é uma flag que indica que se o número é positivo vem com um sinal de mais. Vamos colocar aqui e imprimir. Compilou, rodou. O que é positivo vem com o mais na frente, o que é negativo vem com menos.

O menos vem como default, se não fizer nada, compilo, rodo, ele sempre aparece. Se você quiser habilitar o símbolo de positivo você tem que colocar o mais no meio da sua expressão.

Tem uma outra flag que serve para números negativos. Se você quiser você pode colocar um parênteses. Esse parênteses serve para indicar que números negativos têm que aparecer entre parênteses. Vamos ver como fica. Coloquei no segundo e no terceiro o parênteses. Vamos ver o que acontece.

O -50 agora ao invés de aparecer com sinal de menos vai aparecer dentro de parênteses. Se o número for positivo nada acontece, que é o que rolou aqui. O segundo 42 é positivo, não acontece nada de mais. Se for negativo ele coloca dentro dos parênteses. Você pode até usar os dois se quiser.

Mais e parênteses, vamos ver como fica. Se o número for positivo ele vem com mais, se for negativo ele vai vir entre parênteses. Você consegue ter essa formatação básica já usando simplesmente o format ou o printf. Você repara que tudo que nós estamos imprimindo está sempre, quando tem uma quantidade, um tamanho de caracteres, tudo está sendo alinhado à direita.

Você pode pedir para o Java não alinhar à direita, se você quiser você pode mandar alinhar para a esquerda. Para alinhar para a esquerda ao invés da direita você coloca um menos na frente. O menos não vai imprimir o símbolo de menos, mesmo que seja um número negativo. Vamos botar o -50 de novo, tem o menos ali, ele não vai fazer nada de extra, porque o menos já sai na impressão. O que ele vai fazer é imprimir alinhado de outro jeito.

Agora ele alinhou tudo para a esquerda. Isso funciona também com textos. Posso pegar e mandar imprimir um texto totalmente alinhado à esquerda. No mínimo cinco caracteres com menos para alinhar para a esquerda. Funciona com textos também sem problemas.

Se você está usando o tamanho como nós estamos fazendo aqui, tanto no -50 quanto no 42, você pode caso você não esteja alinhando à esquerda mandar completar com zeros. Você queria alinhar à direita, mas queria que ficasse preenchido com zeros, não com espaços em branco. Para preencher com zeros é só colocar um zero antes do tamanho.

Vamos ver como fica. 00042 e -0050. O menos fica sempre na ponta, mas aí continua respeitando o tamanho máximo de caracteres. Lembrete importante, você só pode mandar completar com zeros quando é número. Se você tentar completar com zeros uma string, vai dar ruim, vai dar errado. Vamos ver o que vai rolar.

Se você tentar passar, completar com zeros uma string ele não vai fazer. Ele só pode completar com zeros quando é número, e a exception é essa coisa maluca. FormatFlagsConversionMismatchException, é porque é uma string, tento alinhar com zero, não dá certo.

Se for um número muito grande você pode incluir um separador de milhar, nós fazemos isso usando a vírgula. Põe uma vírgula, ele vai separar por milhar. 423245435, um monte de número, na hora de imprimir ele separa, ele usa o separador de milhar do sistema operacional. Se tivesse meu sistema operacional em português ele ia separar por vírgula. Aliás, ia separar por ponto e por vírgula depois da casa decimal.

Se colocarmos ao invés de d um f de float e colocássemos um .99 aqui, vamos ver o que acontece. Ele vai lá e separa por vírgula, por conta do separador do sistema operacional.

Quando estamos falando de números decimais, você pode ainda dizer a precisão que você quer que seja impresso. Quantas casas decimais você quer que sejam impressas após a vírgula. Para isso, vou pegar nosso formatador, posso dizer que são só duas casas após a vírgula. Você faz isso botando um ponto e depois desse ponto falar quantas casas você quer, duas.

Fica %.2f, para falar que quero com apenas duas casas decimais. Vamos rodar e ver o que vai rolar. Agora ele veio só até o 99 depois da vírgula. Se eu quisesse três casas decimais, coloco 3. Agora 990. Você pode definir quantas casas decimais você quiser.

E basicamente essas são todas as regras que você precisa saber para resolver as questões relativas à formatação na prova. Claro que eles não vão aparecer como eu estava explicando aqui, eu quero que você entenda, eu explico cada um separadamente. Na prova eles vão colocar um monte deles todos juntos de uma vez e você vai ter que olhar tudo e saber exatamente o que foi impresso.

Deixa eu colocar aqui um exemplo. Por exemplo, vamos colocar esse código de formatação %0,8.2f e o número vai ser 34.589. Muitos dos objetivos que você vai ter na prova é isso aqui, o que imprime? E você vai ter que ler o código de formatação e definir, saber interpretar isso e ver qual a resposta correta.

Vou compilar e rodar e nós vamos ver, enquanto isso vai pensando o que você acha que isso imprime. Rodou. 00034,59. Por quê? Vai imprimir número decimal, o tipo é decimal, o 0 significa que vai ser completado com zeros, a vírgula, vai ter separador de milhar caso tenha, e é o separador de milhar do sistema operacional, se o número fosse grande ia ter também o ponto para falar o mil.

O 8 quer dizer que vai ter pelo menos 8 dígitos. Repare que a vírgula conta como dígito também. Conta como caractere. São oito contando com a vírgula. O .2 aqui significa que vão ter duas casas decimais de precisão. Mesmo o número sendo 589 ele só vai imprimir até 59. E ele arredonda ainda. Se ele corta a última casa ele arredonda. Se for maior que cinco para cima, se for menor que cinco para baixo.

Tem que pegar e fazer muito exercício nessa parte. Ficar treinando para você conseguir bater o olho e saber mais ou menos o que esse código imprime. Até a próxima.

Desenvolver código que usa classes wrappers como Boolean, Double e Integer - Vídeo 1

Vamos começar falando de wrappers, wrappers são objetos que representam tipos primitivos. Para cada tipo primitivo que tem no Java nós temos um wrapper equivalente a esse tipo. Então, quando você precisa, por exemplo, fazer uma lista e dentro dessa lista você precisa colocar números, preciso fazer uma lista de números inteiros, o inteiro é um primitivo e listas só podem receber objetos. Então é um típico cenário onde você precisa ter um objeto que represente aquele tipo primitivo, e é para isso que servem os wrappers.

Nós vamos entender como eles funcionam. Para cada um dos primitivos temos um wrapper. Geralmente ele segue esse formato. Para o tipo boolean o wrapper equivalente é a classe Boolean, é basicamente o mesmo nome com letra maiúscula no começo, isso se repete para quase todos os outros.

Nós temos o byte, que vira Byte, tem o short e o short vira Short com são maiúsculo. Tem só algumas coisas que mudam de um para o outro. Por exemplo, o int, o wrapper dele é o integer, então não é abreviado, é integer escrito direto. O char também tem uma variação, Character. Caractere, está tudo escrito por extenso. Todos os outros seguem a regra normal.

Então o long vira Long, o double vira Double, e o float também vira Float. Todos os tipos primitivos com seus respectivos wrappers. Quando você quiser representar eles como objetos você vai usar uma dessas classes.

Vamos entender qual é a pegada. Vou jogar para baixo, deletar isso, para podermos rodar. O primeiro passo, a primeira coisa que você vai ter que aprender, como você cria um wrapper? wrappers são objetos, assim como qualquer objeto, se eu quisesse criar um objeto do tipo double, Double d1 = new Double, é igual qualquer objeto para você criar.

Todos os primitivos que representam tipos numéricos, todos que representam as coisas que são números, tem dois construtores. Um construtor que recebe o número primitivo em si, então sei lá, 2255, esse é um construtor válido, vai gerar um wrapper d1 equivalente àquele primitivo double, o 22.5.

E tem um outro construtor Double d2 = new Double que recebe a representação daquele tipo como uma string, então eu poderia passar 22.6, isso é uma construção válida de um wrapper. Todos os wrappers de números tem esses dois construtores.

Aqui você já tem que tomar um pouco de cuidado, porque como esse construtor recebe uma string não dá para garantir que a string que foi passada ali realmente represente o número. Alguém pode passar abc. E aí? Se passar desse jeito ao tentar executar o código leva uma exception toda vez que tentar converter uma string para um wrapper ou para um primitivo e aquela string não puder ser traduzida você vai acabar levando um number format exception.

Vamos dar uma olhada, vou compilar e ver o que acontece. Vamos executar, number format exception pela input string abc, não tem como representar um número usando letras, então tem que tomar um pouco de cuidado. Quando são tipos como double, tipos que são com casa decimal, toma cuidado porque a representação da casa decimal é sempre com ponto, se você tentar representar 23,7, usando uma vírgula, vamos ver o que acontece.

Você também leva um number format, para dividir a casa decimal tem que ser usado o ponto. Não dá para representar assim. Assim que você constrói um wrapper a partir de um primitivo. Essa regra vale para qualquer coisa que seja numérica. Para os tipos que não são numéricos a regra é um pouco diferente.

Por exemplo, para você construir um caráter aqui Character c = new Character, o construtor de caracteres só tem um único construtor, que recebe caractere, não tem a variante que receba string e converta para um char, então para criar um caractere mesmo é sempre esse construtor que nós usamos.

O boolean também tem um caso especial, então vamos criar Boolean b1 = new Boolean, existe o construtor que receba o primitivo true, que recebe o próprio tipo primitivo, ou true ou false vai criar um wrapper equivalente a true ou false. E tem também o caso que recebe string.

Nesse caso, o b2 que estou colocando é um wrapper que vai converter para true, vai ser um wrapper do tipo true. É interessante você notar que para você criar um boolean, um wrapper boolean que o resultado dele seja true você precisa necessariamente escrever aqui true, a string passada tem que ser true. Não importa as letras, não importa se você botou maiúsculo ou minúsculo, tem que dar true no final.

Se você escrevesse True, isso também acaba gerando um true, mesmo que você faça um negócio maluco, uma letra maiúscula, uma letra maiúscula, uma letra minúscula, não tem problema, tudo isso acaba equivalendo a true. Qualquer coisa diferente da palavra true vai virar false, vai virar um wrapper representando false.

Todos aqueles devolvem para true, se você escrever false ok, isso daria false. Se você escrever qualquer outra coisa, verdadeiro, por exemplo, isso também dá false. O wrapper só vai virar true se você escrever exatamente true, se escrever qualquer outra coisa vai acabar dando false. Muito cuidado com esse tipo de coisa também true.

Parece que está escrito true, mas tem um espaço no final, esse espaço vai fazer com que a palavra não seja exatamente true, é true com espaço, e aí acaba também virando um wrapper de false, bastante atenção na hora que for construir booleans, olha se o valor não é a palavra true exatamente, não importa maiúsculo e minúscula, tem que ser só a palavra true.

Agora vamos ver como faz para sabendo que você tem um wrapper, como você converte. Tem as fórmulas para fazer a conversão. Vamos começar. Primeiro caso de conversão que nós vamos ver. Como você pega de wrapper e converte isso para um primitivo. Você tem o wrapper, você quer voltar para o tipo primitivo, como você vai fazer isso?

Vou criar um Long l = new Long(“123”), por exemplo, esse l é um wrapper de long, como faço para converter esse cara em primitivo? Sempre que você quiser converter um wrapper para um primitivo você vai usar os métodos que estão no seguinte formato, xxxxValue, é sempre assim.

Vamos pegar os exemplos. Se eu pegar esse long e eu quisesse converter ele para um long primitivo, seria assim long l1 = l.longValue, assim ele faz a conversão. Quando botei aquele xxxx é porque é o tipo do primitivo para qual você quer converter.

Todos os primitivos numéricos, todos os wrappers numéricos têm métodos para converter para qualquer primitivo numérico também. Então o long tem o longValue, mas se eu quisesse jogar isso em um inteiro int i = l.intValue, você já tem todos os caras prontos, não importa. Não importa se ele é inteiro, decimal, tanto faz, você consegue fazer a conversão.

Vou pegar um double, double d = l.doubleValue e você consegue converter desse long para primitivo. Isso não tem muito como fugir, você vai ter que decorar qual método faz o que, porque na prova ele vai te perguntar, o método x value devolve o que? Devolve um wrapper? Devolve um primitivo? Você vai ter que saber isso, não tem muito como fugir.

Mas a fórmula é xxxxValue vai devolver sempre o próprio primitivo. Vamos ver os outros métodos já. Isso vale para qualquer tipo de wrapper numérico. Se eu tivesse um double wrapper eu consigo converter para int, short, byte, para qualquer tipo, você sempre vai ter esse método nesse formato.

Agora, os wrappers que são não numéricos, por exemplo um new Boolean (“T") não tem métodos para converter para inteiro, número, porque nem tem como representar isso por número, simplesmente tem o booleanValue que vai devolver para nós um boolean b.

Mesma coisa serve para o char, char c = new Character(a).charValue. Para você pegar de um wrapper e converter para um primitivo você usa métodos nesse formato, xxxxValue. Lembra que numéricos podem converter entre qualquer tipo de número, agora boolean e char é só para o próprio tipo deles, não tem conversão para outros tipos.

Agora vamos ver como faz outra conversão, nós vimos já como faz de wrapper para primitivo, vamos focar agora como faço de string, tenho uma string com a representação numérica e quero converter esse negócio diretamente para um primitivo, de string para primitivo, como você vai fazer?

Você vai usar dentro dos seus wrappers, todo wrapper tem um método que é o método estático chamado parsexxx, todos os wrappers têm um método estático que faz a conversão diretamente de uma string, o input é uma string e ele devolve diretamente para você um tipo primitivo equivalente ao parse que você está usando. Cada classe tem o parse do seu próprio tipo. Dependendo do primitivo que você quer, você vai acabar usando uma classe diferente.

Vamos ver como ficaria o código. De string para primitivo. Vou querer um double d20 =, tenho uma string e queria converter nesse primitivo double, como você vai fazer? Double.parseDouble, e aí o parseDouble recebe como entrada a string que tem o número que você precisa. É sempre nesse formato. parsexxx sendo que o x é o tipo que você precisa.

E esse método só vai ter na classe double, se eu quisesse um número inteiro, como ficaria? Você precisa ir na classe integer, e na classe integer tem o método parseInt, e do parseInt você coloca o número que você quiser.

Para qualquer tipo de conversão de string diretamente para primitivo o método é esse, que você tem em cada um dos objetos, em cada um dos tipos wrappers tem esse método estático, parseDouble, parseInt, parseLong, parseByte, e assim sucessivamente.

Todos os números inteiros possuem variações do método parse que recebem também a base. Você pode representar números inteiros em vários tipos de base, base octal, base binária, base hexadecimal, você pode mudar a base e você pode até faze isso na hora de converter, na hora de pegar da string e converter direto para o primitivo já na base certa.

Vamos ver aqui. Vou copiar a linha para facilitar. Vou pegar e chamar o parseInt, vamos colocar aqui parseInt(“10”), e aqui posso falar qual a base. Por exemplo, 10 é válido, vou pegar esse 10 e fazer o parse dele na base 10, base decimal mesmo. Isso seria o próprio número 10. Aqui poderia falar que quero pegar o número 11 e representar ele em outra base, representar ele na base 16, que seria a base hexadecimal. Isso também vai gerar outro número.

Posso falar que tem um caso bem interessante, vamos gerar o A, isso vai dar pau porque A não existe. Realmente, se eu deixar o código desta forma, parseando A na base 10 não existe, porque na base decimal você não tem o A para representar o número. Se eu trocar para base 16, base hexadecimal, isso funciona, compila e executa, porque o A existe na base hexadecimal.

E aí dá para fazer qualquer tipo de variação. Inclusive estou fazendo tudo com integer, mas não precisa ser, você pode usar long l20 = Long.parseLong(“11”,2), em base binária, esse 11 que estou passando você vai representar em base binária. Você tem toda a estratégia, toda a forma para mudar a base conforme você vai fazendo o parse, isso tem em integer, tem em byte, tem em short, todos eles têm um método sobrecarregado que recebe esse segundo parâmetro que é a própria base.

Vamos ver outro tipo de conversão. Já foi de wrapper para primitivo, de string para primitivo, e se eu quisesse fazer de string e o meu resultado fosse um wrapper? Queria pegar de string e jogar para um wrapper. Aqui temos duas alternativas. Uma delas já vimos que você pode usar um construtor. Você tem o construtor que Double d30 = new Double(“23.7”), então já tem aí o construtor, que é uma maneira de você dado uma string gerar um wrapper.

Se você não quiser usar desta maneira, temos outra forma também. Existe outra maneira no Java de fazer essa representação. Todo wrapper tem outro método estático chamado valueOf, você passa uma string e ele devolve o wrapper do tipo. Então assim, eu poderia fazer Double d31 = Double.vaueOf(“23.7”), tem exatamente o mesmo efeito.

Temos essas duas alternativas. Aqui que a coisa começa a ficar confusa, porque para gerar um wrapper o método chama valueOf, para gerar um primitivo, o método chama doubleValue, por isso que causa um pouco de confusão, os nomes dos métodos são relativamente parecidos, acaba ficando um problema. Você tem que tomar cuidado que quando termina em value é primitivo, é o valor, valor é o próprio primitivo. Começou com value é o wrapper, que você quer um objeto de tal coisa.

Os inteiros, integer, long, short, esse tipo de coisa, o valueOf deles é normal, igual a outra classe, você passa o número que você quer, eles têm esse valueOf normal, e eles também têm uma versão do valueOf que recebe a base, então posso fazer 5AF, que número maluco é esse? É um número maluco na base 16, em base hexadecimal que você tem de A até F, junto, dentro dos conjuntos de caracteres válidos. Tem o valueOf que também recebe esse outro tipo, você tem que ficar atento.

Se você vê letras no meio você já fica esperto, vê se a base está certa. Se não tem base, é decimal, o default, e vai dar pau. Se tem a base hexadecimal na hora que você executar esse código ele vai compilar e rodar sem nenhum tipo de problema. De string diretamente para wrapper você usa o construtor ou usa esse método valueOf.

O último tipo de conversão que está faltando é e se eu tiver um número primitivo e eu quiser converter ele para uma string. De primitivo para wrapper nós já vimos como funciona, você passa por exemplo no construtor, mas e de primitivo para string, como você faz? O método clássico toString, você quer pegar um primitivo e converter para string você usa o método toString, só que não é o toString normal que estamos acostumados.

Por exemplo, vou pegar uma string String d40, tenho um double primitivo e quero converter para string, como você faz? Todas as classes têm um método toString estático, que recebe o tipo primitivo e converte diretamente para uma string. Para pegar de um primitivo direto e converter para string você usa o método toString estático que existe em todas as classes de wrappers. Converteu um long para string, long.toString e passa o long, ele vai devolver para você a string.

O único ponto aqui é que os integers, doubles e longs esse toString também tem aquela ideia de você passar qual a base que você está usando. Tem uma sobrecarga do toString também para você passar a base. Mas até aí não tem muita diferença do que já olhamos nos métodos anteriores.

De primitivo diretamente para string usa o toString, se fosse de wrapper para uma string, não tem o que fazer, é o clássico de sempre, chama o método toString do objeto mesmo, aquele que você recebe de object, que veio lá de object. Você pega, chama ele no seu wrapper, está tudo em ordem.

A parte de conversão de wrapper fica fechada, acabamos passando por tudo. Construiu o wrapper, tem os construtores, converter de string direto para um primitivo, converter de wrapper para primitivo direto, xxxxValue, de string para primitivo, parsexxx, de string para wrapper usa o construtor, ou usa o valueOf, e de primitivo para string você usa o método toString, são vários métodos, é tudo muito parecido, então não tem jeito, tem que decorar mesmo, ficar treinando até decorar o que cada um retorna e recebe.

Sobre o curso Certificação Java SE 8 Programmer I: conteúdo além da prova

O curso Certificação Java SE 8 Programmer I: conteúdo além da prova possui 183 minutos de vídeos, em um total de 44 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

Plus

De
R$ 1.800
12X
R$109
à vista R$1.308
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

Matricule-se

Pro

De
R$ 2.400
12X
R$149
à vista R$1.788
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Luri, a inteligência artificial da Alura

    Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas