atribuições
DESCRIPTION
TRANSCRIPT
Pilha e Pilha e HeapHeap -- OverviewOverview
Variáveis de instância e objetos estão no heap
Variáveis locais estão na pilha
Literais, AtribuiLiterais, Atribuiçções e ões e VariVariááveisveis
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,
í l d d i ã
Literais, AtribuiLiterais, Atribuiçções e ões e VariVariááveisveis
Valores literais para os tipos primitivos:
◦ Booleantrue ou falseboolean bubu = false;
◦ Caracterechar letra = ‘t’; char f = ‘\n’;char letraN = ‘\u004E’; // Notação Unicodechar b = 0x892;char d = -98; // Possível perda de precisão, énecessário cast
Literais, AtribuiLiterais, Atribuiçções e ões e VariVariááveisveis
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
Operadores de AtribuiOperadores de Atribuiççãoão
Variáveis são caixinhas de bits de um tipo designado.
Variável de Referência – caminho do objeto
AtribuiAtribuiçções de Primitivasões de Primitivas
O ‘=’ é usado para atribuir um valor a uma variávelAtribuir 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
CastingCasting de Primitivasde Primitivas
Implícitos:◦ int a = 100;◦ long b = a;
Explícitos:◦ Float a = 100.00F;◦ int b = (int) a;
NNúúmero de Ponto Flutuantemero 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
AtribuiAtribuiçção entre Varião entre Variááveisveis
Cópia de valoresVariáveis com valores independentes:◦ int a =10;◦ int b = a;Alterar o valor de ‘b’ não irá alterar o valor de ‘a’.
VariVariááveis de Referênciaveis 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.
VariVariááveis de Referênciaveis de Referênciapublic 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 subclassof FooBar reallyAFoo = new Foo(); // Illegal! Foo is not a subclass of Bar
}}
Escopo de variEscopo de variááveisveis
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
Escopo de VariEscopo de Variááveisveis
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.
VariVariáável de Instânciavel de InstânciaVariável membroInicializadas com valor defaultPodem ser inicializadas com outros valores
VariVariáável de Instânciavel de InstânciaArray◦ Se não for inicializado é null◦ Se inicializado todos os seus elementos
são inicializados com o default do tipo do array
VariVariáável Localvel Local
Primitivas:◦ Devem sempre ser inicializadas◦ Se não inicializar não use◦ Cuidado com blocos condicionaisReferências:◦ Não recebem o valor null◦ Elas não são inicializadas
VariVariáável Localvel Local
Array◦ Devem ser inicializados◦ Não recebem null◦ Se forem inicializados não é necessário
atribuir valores a seus elementos
Atribuindo Referência a OutraAtribuindo Referência a OutraIrão acessar o mesmo objetoModificações feitas por uma referência se refletirão nas outrasString não atualiza suas referências
Passando variPassando variááveis para veis para mméétodostodos
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
Passando variPassando variááveis para veis para mméétodostodos
Primitivas◦ Passagem por cópia◦ A variável local do método não altera o
valor da variável que foi passada
ArraysArrays
Declaração:◦ int[] arr; ou int arr[];◦ String[] strArr; ou String strArr[];Recomendado colocar colchetes depois da declaração do tipoNão colocar o tamanho na declaração:◦ int[5] arr;
ArraysArraysUnidimensionais◦ Thread[] threadArr = new Thread[4];
Na linha acima o construtor de Thread não échamadoNenhuma instância de Thread é criadaExiste 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
ArraysArraysMultidimensionais:
◦ Array de arrays◦ Necessita do tamanho do primeiro array
int[][] multi = new int[3][];◦ Os outros podem ser diferentes
ArrayArrayInicializaçã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};
ArraysArrays -- AtribuiAtribuiççõesõ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();
ArraysArrays -- ReferênciasReferênciasAtribuições entre referências:◦ Tipos primitivos diferem◦ Array de Objetos:
De superclasse para subclasseDe interface para classe que a implementa
◦ Exemplos:int[] vivo;byte[] dois = new byte[3];vivo = dois; // Ops! Não podeSerializable[] eita;String[] str = new String[3];eita = str; // OK!
Blocos de Blocos de InicializaInicializaççãoãoEstáticos:◦ Executado quando a classe é carregada
static int x;static { x = 7; }
Instância:◦ Executado quando uma instância é criada
int y;{ y = 5; }
Classes Classes WrapperWrapperDuas 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
Classes Classes WrapperWrapperConstrutores:◦ String ou o valor tipo primitivo◦ Character recebe um caractere simplesMétodos valueOf():◦ Existem dois:
valueOf(String str)valueOf(String str, int radix)
◦ O segundo não está presente em todos
Classes Classes WrapperWrapperConversões:◦ xxxValue()
Converte um valor wrapped em um primitivoTodos são sem argumentosInteger 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();
Classes Classes WrapperWrapperConversões:◦ parseXxx() e valueOf():
Ambos recebem uma String como argumentoEm algumas classes tem um segundo argumentoÚnica diferença:
valueOf() – retorna um objeto wrapper recentemente criado do tipo que invocouparseXxx() – retorna o valor primitivo do qual foi chamado
Exemplos:double d = Double.parseDouble(“3,14”);Double db = Double.valueOf(“3.14”);
Classes Classes WrapperWrapperConversões:◦ toXxxString():
Presente nas classes Integer e LongTransformam inteiros em: Hexa, Octal e BinárioExemplos:
String hexa = Integer.toHexString(254);String octal = Long.toOctalString(254);
AutoboxingAutoboxingBoxing, ==, equals()◦ O operador == para valores até 127
resultará em trueInteger i2 = 10;Integer i3 = 10;System.out.println(“i2 == i3: ” + (i2==i3));Integer i2 = 1000;Integer i3 = 1000;System.out.println(“i2 == i3: ” + (i2==i3));
◦ No primeiro caso true segundo false◦ equals() retornará a realidade
SobrecargaSobrecargaRegras 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
GarbageGarbage CollectorCollector
Solução automática para gerenciamento de memóriaVocê não controla eleO GC atua sobre o heapAtua sobre os objetos que são inalcançáveisSua tarefa é limpar a memória
GarbageGarbage CollectorCollector
Quando é executado?
◦ Quem decide é a JVM◦ Você só pode dar uma sugestão◦ Normalmente quando tem pouca
memória
GarbageGarbage CollectorCollectorTornando 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
GarbageGarbage CollectorCollectorForçando GC
◦ O GC não pode ser forçado◦ Existe um método que solicita a JVM que
ela execute o GCSystem.gc()
◦ Desaconselha-se usar esse método◦ Foi retirado do exame Java 6
GarbageGarbage CollectorCollectorLimpando 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 GCChamando finalize() pode de fato salvar um objeto da “deleção”