Na classe Math, existe uma série de métodos estáticos que fazem operações com números como, por exemplo, arredondar(round), tirar o valor absoluto (abs), tirar a raiz(sqrt), calcular o seno(sin) e outros.
double d = 4.6;
long i = Math.round(d);
int x = -4;
int y = Math.abs(x);
Consulte a documentação para ver a grande quantidade de métodos diferentes. No Java 5.0, podemos tirar proveito doimport staticaqui:
import static java.lang.Math.*;
Isso elimina a necessidade de usar o nome da classe, sob o custo de legibilidade:
double d = 4.6;
long i = round(d);
int x = -4;
int y = abs(x);
14.10 - Exercícios: java.lang
Aqui faremos diversos testes, além de modificar a classe Conta. Você pode fazer todos esses exercícios dentro do próprio projetobanco.
1) Teste os exemplos desse capítulo, para ver que umaStringé imutável. Por exemplo:
public class TestaString {
public static void main(String[] args) { String s = "fj11";
s.replaceAll("1", "2"); System.out.println(s); }
}
Como fazer para ele imprimir fj22?
2) Como fazer para saber se umaStringse encontra dentro de outra? E para tirar os espaços em branco de umaString? E para saber se umaStringestá vazia? E para saber quantos caracteres tem umaString? Tome como hábito sempre pesquisar o javadoc! Conhecer a API, aos poucos, é fundamental para que você não precise reescrever a roda!
3) Crie uma classeTestaIntegere vamos fazer comparações com Integers:
Integer x1 = new Integer(10); Integer x2 = new Integer(10);
if (x1 == x2) {
System.out.println("igual"); } else {
System.out.println("diferente"); }
E se testarmos com oequals?
O que podemos concluir? Como verificar se a classeIntegertambém reescreve o métodotoString? A maioria das classes do java que são muito utilizadas terão seus métodos equals e toStringreescritos convenientemente.
Aproveite e faça um teste com o método estáticoparseInt, recebendo uma String válida e uma inválida (com caracteres alfabéticos), e veja o que acontece!
4) Utilize-se da documentação do Java e descubra de que classe é o objeto referenciado pelo atributooutda
System.
Repare que, com o devidoimport, poderíamos escrever:
// falta a declaração da saída
saida = System.out; saida.println("ola");
A variávelsaidaprecisa ser declarada de que tipo? É isso que você precisa descobrir. Se você digitar esse código no Eclipse, ele vai te sugerir um quickfix e declarará a variável para você.
Estudaremos essa misteriosa classe no capítulo a seguir.
5) Crie e imprima uma referência para Conta (ContaCorrente ou ContaPoupanca, no caso de sua Conta ser abstrata):
Conta conta = new ContaCorrente(): System.out.println(conta);
O que acontece?
6) Reescreva o método toStringda sua classe Conta fazendo com que uma mensagem mais propícia seja devolvida. Lembre-se de aproveitar dos recursos do Eclipse para isto: digitando apenas o começo do nome do método a ser reescrito e pressionandoCtrl+espaço, ele vai sugerir reescrever o método, poupando você do trabalho de escrever a assinatura do mesmo, e de cometer algum engano.
public abstract class Conta {
private double saldo;
public String toString() {
return "esse objeto é uma conta com saldo R$" + this.saldo; }
// restante da classe
}
Agora imprima novamente uma referência aConta. O que aconteceu?
7) Reescreva o métodoequalsda classeContapara que duas contas com o mesmonúmero de conta sejam consideradas iguais. Para isso, você vai precisar de um atributonumero. Esboço:
abstract class Conta {
private int numero;
public boolean equals(Object obj) { Conta outraConta = (Conta) obj;
return this.numero == outraConta.numero; }
// restante , colocar getter e setter para numero, usando Eclipse!
}
Você pode usar oCtrl+espaço do eclipse para escrever o esqueleto do métodoequals, basta digitar dentro da classeeque pressionarCtrl+espaço.
Crie uma classe TestaComparacaoConta, e dentro domain compare duas instâncias deContaCorrentecom
==, depois comequals, sendo que as instâncias são diferentes mas possuem o mesmonumerode conta (use osetNumero).
8) Um doublenão está sendo suficiente para guardar a quantidade de casas necessárias em uma aplicação. Preciso guardar um número decimal muito grande! O que poderia usar? (consulte a documentação, tente adivinhar onde você pode encontrar algo desse tipo pelos nomes dos pacotes, veja como é intuitivo). Odoubletambém tem problemas de precisão ao fazer contas, por causa de arredondamentos da aritmética de ponto flutuante definido pela IEEE 754:
http://en.wikipedia.org/wiki/IEEE_754
Ele não deve ser usado se você precisa realmente de muita precisão (casos que envolvam dinheiro, por exemplo).
Lembre-se: no Java há muita coisa já pronta. Seja na biblioteca padrão, seja em bibliotecas open source que você pode encontrar pela internet.
9) (opcional) Agora faça com que o equals da sua classe Conta também leve em consideração a String do nome do cliente a qual ela pertence. Se sua Contanão possuir o atributo nome, crie-o. Teste se o método criado está funcionando corretamente.
10) (opcional) Crie a classeGuardadorDeObjetos como visto nesse capítulo. Crie uma classe TestaGuardador
e dentro do main crie uma ContaCorrente e adicine-a numGuardadorDeObjetos. Depois teste pegar essa referência comoContaPoupanca, usando casting. Repare na exception que é lançada:
GuardadorDeObjetos guardador = new GuardadorDeObjetos(); ContaCorrente cc = new ContaCorrente();
guardador.adicionaObjeto(cc);
// vai precisar do casting para compilar! // use Ctrl+1 para o Eclipse gerar para você
ContaPoupanca cp = guardador.pega(0);
Teste também o autoboxing do java 5.0, passando um inteiro para nosso guardador.
11) (opcional) Escreva um método que usa os métodoscharAtelengthde umaStringpara imprimir a mesma caractere a caractere, com cada caractere em uma linha diferente.
12) (opcional) Reescreva o método do exercício anterior, mas agora imprima a String de trás para a frente. Teste-a para “Socorram-me, subi no ônibus em Marrocos” e “Anotaram a data da maratona”.
13) (opcional) Dada uma frase, reescreva essa frase com as palavras na ordem invertida. “Socorram-me, subi no ônibus em Marrocos” deve retornar “Marrocos em ônibus no subi Soccoram-me,”. Utilize o métodosplit
daStringpara te auxiliar.
14) (opcional) Pesquise a classeStringBuilder(ou StringBuffer no java 1.4). Ela é mutável. Por que usá-la em vez daString? Quando usá-la? Repare que ela tem um étodoreversee outros bem úteis!
14.11 - Desafio
1) Converta umaStringpara um número sem usar as bibliotecas do java que já fazem isso. Isso é, umaString x = “762"
deve gerar umint i = 762.
Para ajudar, saiba que um char pode ser “transformado” em int com o mesmo valor numérico fazendo:
char c = ’3’;
int i = c - ’0’; // i vale 3!
Aqui estamos nos aproveitando do conhecimento da tabela unicode: os números de 0 a 9 estão em sequen- cia! Você poderia usar o método estáticoCharacter.getNumericValue(char)em vez disso.
14.12 - Discussão em aula: O que você precisa fazer em Java?
Qual é a sua necessidade com o Java? Precisa fazer algoritmos de redes neurais? Gerar gráficos 3D? Relatórios em PDF? Gerar código de barra? Gerar boletos? Validar CPF? Mexer com um arquivo do excel?
O instrutor vai mostrar que para a maioria absoluta das suas necessidade, alguém já fez uma biblioteca e a disponibilizou.
Pacote java.io
“A benevolência é sobretudo um vício do orgulho e não uma virtude da alma.” –Doantien Alphonse François (Marquês de Sade)
Ao término desse capítulo, você será capaz de:
• ler e escrever bytes, caracteres e Strings de/para a entrada e saída padrão; • ler e escrever bytes, caracteres e Strings de/para arquivos;
• utilizar buffers para agilizar a leitura e escrita através de fluxos; • usar Scanner e PrintStream.