Em java, alguns conceitos básicos são bem mais complicados do que aparenta. Respondendo alguns simulados, tu verás que praticamente TODA questão de QUALQUER assunto envolve fundamentos.
As vezes nos deparamos, até mesmo na faculdade, com questões gigantescas e já pensamos logo: “Pultz, ter que entender esse código primeiro para depois encontrar o erro!”. Ah, você não pensa isto?? É companheiro, pois imagine você ter que se deparar com 20% da prova com questões de 70 ( ou mais ) linhas, e com aquele maravilhoso código sem endentação alguma como a SUN adora fazer. Não acabou não!! Imagina ainda, você numa questão Drag and Drop de nível alto de Threads, conseguir montar ela toda certa depois de alguns minutos dedicados a ela, errar por causa de uma linha de fundamentos?! Sim, eu passei por isto! E te garanto, caro leitor… a raiva de você mesmo por não ter prestado atenção nos fundamentos é grande quando tu pega o papel de resultados e vê que errou aquele tanto de fundamentos.
Agora que você deve concordar comigo que fundamentos são de extrema importância para a nossa querida SCJP, vamos falar um pouco sobre eles. Apesar de existir vários tópicos sobre, vou comentar apenas os mais importantes que inclusive teve na minha prova.
Variáveis: Acredito que é meio impossível criar uma aplicação interessante sem a utilização de variáveis. Elas tem a finalidade de armazenamento qualquer tipo de informaçaõ. Desde que seja declarada corretamente. Ao criar uma variável, precisamos definir qual tipo de informação ela irá armazenar.
A sintaxe em java será sempre tipo nome; exemplo: String texto;
Neste caso, estamos informando que a variável “texto” irá armazenar informações do tipo de dados String. Existem 8 tipos de dados primitivos, que são eles:
char Boolean
Double Float
Int Long
Byte Short
Então, a cada vez que tu precisar criar uma variável de determinado tipo, basta digitar o tipo e o nome da variável logo após. Lembrando de SEMPRE terminar a linha de comando com ponto e vírgula “;”.
Devemos levar em consideração a capacidade de armazenamento de cada tipo. Por exemplo:
Byte: 1 bytes (8 bits )
Short: 2bytes (16 bits)
char: 2 bytes (só positivo) (16 bits)
int: 4 bytes (32 bits)
long: 8 bytes (64 bits )
Isto é muito importante! Pois temos que ter muito cuidado com a questão de casting. Jamais poderemos tentar converter o número inteiro 130 por exemplo, em byte. Porque em byte ele só suporta até o número 127. Não entrarei muito em detalhes a questão de tamanho de armazenamento e capacidade, mas a literatura é extensa na internet sobte este assunto.
O importante na prova é tomar cuidado quando se tentar atribuir tipos diferentes. Siga este exemplo acima pois é a ordem crescente. Tome muito cuidado quando na prova ele estiver tentando fazer unboxing de um tipo “maior” pra um “menor”.
Mas, algo tão importante quanto isto sobre variáveis.. são as literais.
De acordo com o código a seguir:
long i = 1;
Estamos atribuindo um valor long a uma variável long? Não! Utilizamos as literais para avisar ao nosso compilador que aquele número alí é de um tipo de dado específico, evitando assim cuidados com a questão de unboxing e boxing.
Os tipos de dados que não precisam de literais para serem referenciados, por serem padrões em sua declaração, são: Integer e double. Se atribuimos um valor a um long, short, int ou byte, sem definir uma literal, por padrão aquele número será do tipo int. O mesmo acontece com o número se estivermos atribuindo a uma variável do tipo double ou float; por padrão é double. Sempre atento a capacidade de cada tipo de dados, tome muito cuidado com isto. Por exemplo: float a = 2.0; o código não irá compilar porque esse número não terá como ser convertido em float.
As literais são:
L ou l = Long ex.: 1l ou 1L
F ou f = Float ex.: 1f ou 1F
D ou d = Double ex.: 1d ou 1D ( padrão )
Uma parte interessante sobre tipos de dados, é o tipo char. Ele parece ser simples por armazenar apenas 1 caracter… mas é bem mais interessante do que pensamos. Podemos sim definir um char com –> char a = ‘a’; <– mas também podemos definir que a nossa variável char será a posição 65 da tabela unicode. –> char a = 65; <– que irá nos imprimir A. Ou seja, podemos utilizar todos os números representando suas respectivas posições na tabela unicode para implementar nossa aplicação java.
É bastante interessante pois tem até letra grega para ser atribuída –> char a = ‘\u03A9′; <– irá imprimir a letra grega ômega.
Operadores
= atribuição
+ soma
- subtração
* multiplicação
/ divisão
% resto de uma divisão inteira
Existem maneiras práticas para se trabalhar com os operadores:
+= Soma o valor atual com o valor que vier depois do operador.
1 = 1 + 1; é a mesma coisa de 1 += 1;
-= Diminui o valor atual com o valor que vier depois do operador.
1 = 1-1; é a mesma coisa de 1 -= 1;
e a mesma coisa com todos os outros operadores.
Comparadores
Devemos ter muito cuidado com os comparadores porque, principalmente em estrutura de decisão como o IF, a sun gosta de por pegadinhas para que você diferencie “=” que é atribuição de “==” que é comparação.
Se fizermos if (a = true) {}estamos atribuindo o valor true a variável “a”. Mas, se fizermos if (a==true){}, estamos verificando se o valor da variável “a” é true. Muita gente erra em questões como essa.. não é difícil errar porque naquele código todo bagunçado as vezes isto passa despercebido.
== comparação
!= diferença
> maior que
< menor que
>= maior igual
<= menor igual
Operadores lógicos
Quando se utilizamos um operador lógico, queremos saber se uma ou mais condições são verdadeiras. Um detalhe muito importante é saber que quando se repete o operador, significa que as 2 condições terão que, obrigatoriamente ser de acordo com o operador. Caso contrário, se for apenas 1 operador, é necessário que apenas 1 dos lados seja aceitável pelo operador. Exemplo: boolean a,b; a = b = true; if ( a == true & b == false ){} -> condição aceita, pois como só tem 1 operador só precisa que 1 dos lados esteja aceitável.. e este lado, neste caso, é o que a == true;
if ( a == true && b == false )() -> condição negada, pois é necessário que os 2 lados estejam de acordo.
& = e
| = ou
^ = XOR
Aritmética com atribuição.
Aqui temos uma das questões talvez mais confusas sobre operadores. O famoso pós e pré incremento. Operadores antes das variáveis significa que aquela variável será incrementada antes de efetuar a operação em que ela se encontra. Operadores após a variável será incrementada após a operação em que ela se encontra. Por exemplo:
i = 1; a = 2;
c = a + i++; // Resultado 3 porque o “++” está após a variável. Ou seja, o valor de i só foi incrementado depois que a operação foi efetuada, sem afetá-la.
i = 1; a = 2;
c = a + ++i; // Resultado 4 porque o “++” está antes da variável. Primeiro incrementou e depois efetuou a operação.
Operadores Ternário: Eles não são muito utilizados, pelo menos pelos programadores que conheço. Se dá em um “if” mais sofisticado. Onde a sintaxe é (condição ? true,false); Ou seja, se a condição for aceita, faça algo que está no local de true. Caso contrário, o código que está no local de false. Sendo assim, ficaria:
int i = 5;
System.out.println (i == 5 ? “i é igual a 5″: “i não é 5!”); // i é igual a 5
Se a condição i == 5 for aceita, retorne “i é igual a 5″ caso contrário “i não é 5″.
Array
Array é muito importante, talvez um dos objetos que mais cai na prova. Você deverá saber declarar, iniciar, acessar e percorrer pelo array.
Para declarar um array, você deve utilizar “[]” para informar que aquela variável é um objeto do tipo específico. A sintaxe: tipo[] nome; o local onde os colchetes estarão não importa, sendo uma convenção colocar logo após do tipo do array.
int[] idade;
double[] peso;
Iniciando:
Para inicializar o array, é necessário criar um objeto. O operador new faz isso pra gente.
idades = new int[10];
peso = new double[10];
neste caso estamos criando e inicializando um objeto do tipo int e double que suportam até 10 informações do tipo int e double, respectivamente.
Quando se inicia um array devemos informar o tamanho do mesmo, colocando o valor entre os colchetes, como mostra a declaração acima.
Acesso:
A posição do array inicia por 0 e vai até o número-1 do que você declarou. Porque -1? Porque, como falei, começa por 0; Podemos atribuir valores em qualquer espaço do nosso array. Exemplo: Se eu quiser atribuir um valor no array idades na posição 3. Então: idades[2] = 1; o 3 representa a posição 3 porque começa com 0, lembra?
Percorrendo:
As 2 maneiras mais utilizadas para percorrer um array, é utilizando o for dos seus 2 estilos. ou o for normal ou o for each. Eu, particularmente, gosto mais do for each pois não tem o risco de causar uma exceção ArrayindexOutOfBounds. Mas, seja qual for a forma que tu preferir, um array se percorre através do seu índice. Se tu tens uma variável inteira dentro do loop, e utilizar a mesma para percorrer o índice, basta por o nome do array e logo após entre colchete a variável para que seja retornado a você o valor daquela posição.
for (int i: idades)
System.out.println(i);
Neste caso i irá receber o valor de cada posição de idades e escrever no console.
Array e um assunto muito extenso e requer muita atenção. Dêem uma estuda com mais carinho nele pois cai MUITO na prova SCJP e tem muita pegadinhas.
Irei postar sobre outros fundamentos posteriormente. Espero que tenham gostando e lembrem-se que eu posso ter errado alguma informação acima porque ainda sou aprendiz. Qualquer coisa podem me alertar que irei corrigir. Até mais!