O documento discute sobre pilha e heap, variáveis primitivas e de referência, literais, atribuições, escopo de variáveis, wrappers, autoboxing, sobrecarga, garbage collector. As principais informações são: 1) Variáveis de instância e objetos ficam no heap, variáveis locais na pilha; 2) Variáveis primitivas armazenam valores diretamente, enquanto referências armazenam endereços de objetos no heap; 3) Wrappers permitem usar primitivos como objetos.
2. Pilha e Heap - Overview
Variáveis de instância e objetos estão
no heap
Variáveis locais estão na pilha
3. Literais, Atribuições e
Variáveis
Valores literais para os tipos
primitivos:
◦ Inteiros:
Decimais: int length = 342;
Octais: int eigth = 010;
Hexadecimais: int z = 0xDeadCafe;
◦ Ponto Flutuante:
Double: valor default. double dedo =
358.1479;
Float: float flutuar = 268.214F;
float err = 264.987; // Erro de compilação,
4. Literais, Atribuições e
Variáveis
Valores literais para os tipos
primitivos:
◦ Boolean
true ou false
boolean bubu = false;
◦ Caractere
char letra = ‘t’; char f = ‘n’;
char letraN = ‘u004E’; // Notação Unicode
char b = 0x892;
char d = -98; // Possível perda de precisão, é
necessário cast
5. Literais, Atribuições e
Variáveis
Valores literais para Strings:
◦ Uma string literal é uma representação de
um valor de um objeto String.
String str = “SCJP”;
System.out.println(“Boca Juniors” + “ vuou.”);
◦ String não é um tipo primitivo.
Array não é um tipo primitivo, mas
também possui uma representação
literal
6. Operadores de Atribuição
Variáveis são caixinhas de bits de um
tipo designado.
Variável de Referência – caminho do
objeto
7. Atribuições de Primitivas
O ‘=’ é usado para atribuir um valor a
uma variável
Atribuir literal ou valor de uma
expressão:
int num = 5;
int num = x + 2;
Cuidado nas atribuições de byte,
char, short, long e float
8. Casting de Primitivas
Implícitos:
◦ int a = 100;
◦ long b = a;
Explícitos:
◦ Float a = 100.00F;
◦ int b = (int) a;
9. Número de Ponto Flutuante
Default é double
Não possui cast implícito
Obrigatório o uso do ‘f’ ou ‘F’ para
float
◦ double db = 32.6; // OK
◦ float ft = 32.6; // Não Pode
◦ float hi = 33.6F; // OK
10. Atribuição entre Variáveis
Cópia de valores
Variáveis com valores independentes:
◦ int a =10;
◦ int b = a;
Alterar o valor de ‘b’ não irá alterar o
valor de ‘a’.
11. Variáveis de Referência
Button b = new Button();
Acontece três coisas na linha acima:
◦ Uma referência do tipo Button nomeada b
é criada
◦ Um novo objeto Button é criado no heap
◦ Atribui o objeto Botão recentemente
criado à referência b.
12. Variáveis de Referência
public class Foo {
public void doFooStuff() { }
}
public class Bar extends Foo {
public void doBarStuff() { }
}
class Test {
public static void main (String [] args) {
Foo reallyABar = new Bar(); // Legal because Bar is a subclass
of Foo
Bar reallyAFoo = new Foo(); // Illegal! Foo is not a subclass of
Bar
}
}
13. Escopo de variáveis
Existem quatro escopos:
◦ Variáveis estáticas têm o maior escopo
◦ Variáveis de instância é a segunda
◦ Variáveis locais
◦ Variáveis de bloco
14. Escopo de Variáveis
Erros comuns:
◦ Tentar acessar uma variável de instância
em um contexto estático
◦ Tentar acessar uma variável local de um
método por um método aninhado
◦ Tentar usar uma variável de um bloco
depois desses bloco já ter terminado.
15. Variável de Instância
Variável membro
Inicializadas com valor default
Podem ser inicializadas com outros
valores
17. Variável de Instância
Array
◦ Se não for inicializado é null
◦ Se inicializado todos os seus elementos
são inicializados com o default do tipo do
array
18. Variável Local
Primitivas:
◦ Devem sempre ser inicializadas
◦ Se não inicializar não use
◦ Cuidado com blocos condicionais
Referências:
◦ Não recebem o valor null
◦ Elas não são inicializadas
19. Variável Local
Array
◦ Devem ser inicializados
◦ Não recebem null
◦ Se forem inicializados não é necessário
atribuir valores a seus elementos
20. Atribuindo Referência a Outra
Irão acessar o mesmo objeto
Modificações feitas por uma
referência se refletirão nas outras
String não atualiza suas referências
21. Passando variáveis para
métodos
Referência
◦ Copia o objeto para a referência local do
método
◦ Tanto a referência interna quanto a
externa referenciam o mesmo objeto no
heap
22. Passando variáveis para
métodos
Primitivas
◦ Passagem por cópia
◦ A variável local do método não altera o
valor da variável que foi passada
23. Arrays
Declaração:
◦ int[] arr; ou int arr[];
◦ String[] strArr; ou String strArr[];
Recomendado colocar colchetes
depois da declaração do tipo
Não colocar o tamanho na
declaração:
◦ int[5] arr;
25. Arrays
Unidimensionais
◦ Thread[] threadArr = new Thread[4];
Na linha acima o construtor de Thread não é
chamado
Nenhuma instância de Thread é criada
Existe apenas um array cujos elementos são
objetos do tipo Thread
◦ É necessário a definição do tamnaho:
int[] arr = new int[]; // Erro de Compilação
27. Arrays
Multidimensionais:
◦ Array de arrays
◦ Necessita do tamanho do primeiro array
int[][] multi = new int[3][];
◦ Os outros podem ser diferentes
28. Array
Inicialização:
◦ Animal[] pets = new Animal[2];
pets[0] = new Animal();
◦ int[][] multi = new int[3][];
mult[0] = new int[4];
mult[1] = new int[10];
◦ int[] arr = {1, 2, 3};
◦ Thread[] th = {new Thread(), new
Thread()};
◦ int[][] m = { {5, 2, 4, 7}, {9, 2}, {3, 4} };
◦ int[] oi = new int[] {1, 2, 3};
29. Arrays - Atribuições
Primitivas:
◦ Mesmas regras que uma variável
byte[] b = new byte[2];
b[0] = (byte) 128;
Referências:
◦ Mesmas regras que uma referência
Car[] car = new Car[3];
car[0] = new Ferrari();
30. Arrays - Referências
Atribuições entre referências:
◦ Tipos primitivos diferem
◦ Array de Objetos:
De superclasse para subclasse
De interface para classe que a implementa
◦ Exemplos:
int[] vivo;
byte[] dois = new byte[3];
vivo = dois; // Ops! Não pode
Serializable[] eita;
String[] str = new String[3];
eita = str; // OK!
32. Blocos de Inicialização
Estáticos:
◦ Executado quando a classe é carregada
static int x;
static { x = 7; }
Instância:
◦ Executado quando uma instância é criada
int y;
{ y = 5; }
34. Classes Wrapper
Duas finalidades:
◦ Prover um mecanismo no qual
transformasse um primitivo em um objeto
◦ Prover um sortimento de funções úteis
sobre os primitivos
Semelhança do nome das classes
com os primitivos
36. Classes Wrapper
Construtores:
◦ String ou o valor tipo primitivo
◦ Character recebe um caractere simples
Métodos valueOf():
◦ Existem dois:
valueOf(String str)
valueOf(String str, int radix)
◦ O segundo não está presente em todos
37. Classes Wrapper
Conversões:
◦ xxxValue()
Converte um valor wrapped em um primitivo
Todos são sem argumentos
Integer i2 = new Integer(42);
int i = i2.intValue();
short s = i2.shortValue();
double d = i2.doubleValue();
Float f2 = new Float(3.14f);
short st = f2.shortValue();
38. Classes Wrapper
Conversões:
◦ parseXxx() e valueOf():
Ambos recebem uma String como argumento
Em algumas classes tem um segundo
argumento
Única diferença:
valueOf() – retorna um objeto wrapper recentemente
criado do tipo que invocou
parseXxx() – retorna o valor primitivo do qual foi
chamado
Exemplos:
double d = Double.parseDouble(“3,14”);
Double db = Double.valueOf(“3.14”);
39. Classes Wrapper
Conversões:
◦ toXxxString():
Presente nas classes Integer e Long
Transformam inteiros em: Hexa, Octal e
Binário
Exemplos:
String hexa = Integer.toHexString(254);
String octal = Long.toOctalString(254);
46. Sobrecarga
Regras para sobracarga usando
widening, boxing e var-args:
◦ O aumento do primitivo usará o menor
argumento possível do método
◦ Usados individualmente, boxing e var-args são
compatíveis com sobrecarga
◦ Você não pode aumentar o tipo de um wrapper
para outro
◦ Você não pode aumentar e então fazero box
◦ Você pode fazer o box e aumentar
◦ Você pode combinar var-args com widening e
boxing
47. Garbage Collector
Solução automática para
gerenciamento de memória
Você não controla ele
O GC atua sobre o heap
Atua sobre os objetos que são
inalcançáveis
Sua tarefa é limpar a memória
48. Garbage Collector
Quando é executado?
◦ Quem decide é a JVM
◦ Você só pode dar uma sugestão
◦ Normalmente quando tem pouca
memória
49. Garbage Collector
Tornando um Objeto elegível para o
GC:
◦ Torná-lo inalcançável
◦ Atribuir null a sua referência
◦ Atribuir a sua referência outro objeto
◦ Objetos locais também tornam-se
elegíveis depois da execução do metódo
◦ Isolando uma referência
51. Garbage Collector
Forçando GC
◦ O GC não pode ser forçado
◦ Existe um método que solicita a JVM que
ela execute o GC
System.gc()
◦ Desaconselha-se usar esse método
◦ Foi retirado do exame Java 6
52. Garbage Collector
Limpando o Objeto antes do GC dá-
lhe um sumiço
◦ método finalize()
◦ Não é garantido que seja executado
◦ Não por código essencial no finalize()
◦ O(A) autor(a) recomenda não sobrescrever
◦ Importante:
Para qualquer determinado objeto, finalize() só será chamado uma
vez (no máximo) pelo GC
Chamando finalize() pode de fato salvar um objeto da “deleção”