Академический Документы
Профессиональный Документы
Культура Документы
Declarao de variveis
Local: quando temos uma varivel local, o seu uso s permitido aps de ser atribudo o valor.
Instncia de objetos: uma varivel de instncia de objetos recebe o valor null como padro. Numa tentativa de manipular esse valor lanada uma exceo no verificada: NullPointerException.
Instncia: os seus valores so iniciados automaticamente declarando fora de qualquer mtodo ou bloco.
Modificador final uma varivel marcada como final deve ter um valor, caso contrrio, o cdigo no compila. No so iniciadas com um valor padro.
4
Qual o resultado?
a) Compila e imprime 0 b) Compila e no imprime nada c) No compila
public class Var { int z; void metodo(){ int z; System.out.println(this.z); } public static void main(String[] args) { new Var().metodo(); }}
5
Resultado
a) Compila e imprime 0
public class Var { int z; void metodo(){ int z; System.out.println(this.z); /* aqui no temos problema nenhum * ele chama a varivel da instncia * e no a local. Cdigo compila sem problema * e imprime 0 */ } public static void main(String[] args) { new Var().metodo(); }}
6
Variavel Local
Se inicilizar uma varivel local dentro de um bloco condicional (IF/while), o compilador vai reclamar. Qual o resultado? public class Cond { void met(){ int n; while(true){ n=4;} System.out.println(n);}}
8
Arrays Locais
Array locais no muda a regra, antes do uso deve possuir referncias.
public class LocAr { void array(){ //aqui no recebe null por ser uma declarao local int[]arr; int ar[] = new int[2]; System.out.println(ar[0]); /* os elementos de um array so inicializados com os valores padres, independente do array ser local ou da instncia */}
10
Referncias de Variveis
Quando trabalhamos com PRIMITIVOS e passamos um valor para outro primitivo, apenas uma copia do valor passada sem ligao com a varivel original.
public class RefV { int a=10; int b=a; void metodo(){ a=20; System.out.print(a + " "+ b);} /* perceba aqui que alterei minha varivel a, mas no refletiu na varivel b que recebe o valor apenas */ public static void main(String[] args) { new RefV().metodo(); }}
Como OBJETO diferente, a alterao em uma das referncias reflete na outra da mesma instncia, porm com uma EXCEO: no funciona com: String, e Wrappers, so classes imutveis (final).
11
Exemplo - Implementar
public class OBjRef {
int[]ar={2,3,4}; int []ob=ar; void metod(){ ob[1]=50; for(int z : ob) System.out.print(" " + z);} /* observe aqui que a alterao no objeto ob reflete no objeto que ele referencia devido se referirem mesma instncia */ public static void main(String[] args) { System.out.println("antes da alterao.. "); for(int z: new OBjRef().ar) System.out.print(" " + z); System.out.println("\napos..."); new OBjRef().metod();}} antes da alterao. 234 aps... 2 50 4
12
public class RefV { int a=10; int b=a; void metodo(){ a=20; System.out.print(a + " "+ b);}
public static void main(String[] args) { new RefV().metodo(); }}
13
Exemplo Wrapper
class ReferObjt{ public static void main(String args[]){ Integer i = new Integer(10); Integer j=i; System.out.println(i); System.out.println(j); i+=20; //ser que j est referenciado ao novo valor de i? System.out.println(i);//imprime 30 System.out.println(j);//imprime o valor 10 } //o fato aqui que wrapper so finais. Apenas o uso do autoboxing que ocultou isso na linha i+=20. Ele cria outro objeto wrapper para referenciar a esse novo valor
14
public class Wrap { Integer i=440; Integer j=i; void met(){ i+=2; System.out.println(j); } public static void main(String[] args) { new Wrap().met(); }}
15
Teste - Resultado
public class Wrap { Integer i=440; Integer j=i; void met(){ i+=2; /*observe que wrapper so objetos mais no funcionam * a questo de varivel de referncia pois * wrappers e strings so imutveis e a classe final * o que aconteceu por trs foi o autoboxing * recurso do java 5 */ System.out.println(j); } public static void main(String[] args) { new Wrap().met(); }} Exibe: 440
16
/* aqui as coisas so diferentes. Objetos array so mutveis. Alterei o array passado dentro do mtodo e refletiu na referncia original*/ //isso funciona para qualquer array multvel, lembre: String so imutveis, ento no funcionam.
17
Teste
a) b) c) d) Compila com Excees No compila Compila e imprime 0 0 Compila e imprime 0 5
19
class DuvObjtRe{ int array[] = new int[2]; static void go(int [] a){ a[1]=5;} public static void main(String ar[]){ go(new DuvObjtRe().array); for(int z:new DuvObjtRe().array) System.out.println(z); }}
Teste - Resultado
1. 2. 3. 4. 5. 6. 7. 8. 9. Class DuvObjtRe{ Int array[] = new int[2]; Static void go(int [] a){ a[1]=5;} Public static void main(String ar[]){ Go (new DuvObjtRe().array); For(int z:new DuvObjtRe().array) System.out.println(z); }}
//imprime 0,0 devido ser acessado por uma NEW instncia da class //e no a instncia que foi passada no mtodo
20
Compila com excees Compila e imprime 0 5 Compila e imprime 0 0 No Compila erro na linha 7
Class DuvObjtRe{ Int array[] = new int[2]; Static void go(int [] a){ a[1]=5;} Public static void main(String ar[]){ DuvObjtRe b =new DuvObjtRe(); Go(b.array); For (int z:b.array) System.out.println(z);}}
21
public static void main(String[] args) { Integer []g = new Integer[1]; Integer[] h = new Integer[1]; g[0]+=h[0]; }} Exception in thread "main" java.lang.NullPointerException
23
O array pode receber qualquer elemento que seja convertido implicitamente para o tipo declarado. int[]array pode ter: byte, char, short, porm long float no permitido (neste caso).
24
1. 2. 3. 4. 5. 6. 7.
Class ArryIntege{ Public static void main(String args[]){ Integer [] array = new Integer[4]; System.out.println(array[0]); array[1]=1; System.out.println(array[1]); System.out.println(array[0]+2);}}
25
Referncia a Array
Referncia a arrays no posso referenciar a tipos diferentes. int a[] = new int[2]; char[] c = new char[3]; int[]ar=a;//vlido mesmo tipo os arrays //invlido a=c;// tipos diferentes dos array Com objetos so valido se passar no teste -UM. public class Animal extends Zebra { public static void main(String[] args) { Animal[] a = new Animal[2]; Zebra[] z = new Zebra[2]; z[0]=new Animal(); }}
26
Objetos String
Os objetos string so inalterveis. Em strings, quando se tem duas variveis apontando para o mesmo objeto, a JVM atualizar apenas a varivel de referncia.
Variveis de referncia de objetos - o mtodo chamado PODE alterar o objeto que a varivel referncia.
Na prtica
class DuvObjtRe{ int array[] = new int[2]; static void go(int [] a){ a[1]=5;} public static void main(String ar[]){ go(new DuvObjtRe().array); for(int z:new DuvObjtRe().array) System.out.println(z); }}
//imprime 0,0 devido ser acessado por uma NEW instncia da class //e no a instncia que foi passada no mtodo.
28
Na prtica 2
class DuvObjtRe{ int array[] = new int[2]; static void go(int [] a){ a[1]=5;} public static void main(String ar[]){ DuvObjtRe b =new DuvObjtRe(); go(b.array); for(int z:b.array) System.out.println(z); } } //agora sim ele imprime com alterao no objeto original
29
Wrapper - AutoBoxing
Tem o objetivo de converter coisas, ficar bastante atento aos trs mtodos de converso: parseXXX(String) passa de String para primitivo int z = Double.parseDouble(10); XXXValue() - passa de Objetos (Wraper) para Primitivo Integer i = new Integer(10); int z = i.intValue();
30
Exemplo
public class OfVal { public static void main(String[] args) { //String --> OBJETOS Float f = Float.valueOf("10"); System.out.println(f); Integer i = new Integer(10); //Objeto --> Primitivo int g = i.intValue(); }}
31
Exemplos
public class Value { public static void main(String[] args) { Double d = new Double(10.0); //convertendo de objeto para primitivo double d2 = d.doubleValue(); }} ................... 1. public class NoValue { 2. public static void main(String[] args) { 3. Long l = new Long(8); 4. int lh = l.longValue(); /* no compila. Estou tentando colocar um long dentro de um int. No vlido isso */}}
32
public class ValidValue { public static void main(String[] args) { Integer it = 10; long log = it.intValue(); System.out.println(log);}}
33
Algumas Regras...
Mtodo que lana excees a todos que recebem String no args. NumberFormatException. parseXX(String) valueOf(String)
= = funciona com wrapper para: Boolean, Byte, Character, Short e Integer(127). equals testa se dois objetos so equivalentes. As classes Wrappers e String ja implementam esse mtodo.
autoboxing s funciona para o mesmo tipo * int --> Integer * long--> Long * Caso contrrio o cdigo no compila
34
Exemplo
public class Igual { public static void main(String[] args) { Integer a=10; Integer b = 10; System.out.println(a==b);//true }} ...................... public class Boolena { public static void main(String[] args) { boolean b=false; Boolean b1 = new Boolean("z");//false System.out.println(b==b1);} /* retorna true ambos so false */}
35
Wrapper - Autoboxing
As classes Wrappes so finais, com o recurso de autoboxing no Java 5, d ideia de que elas so mutveis, mas isso no verdade. As classes wrappers (Double, Integer...) so como a classe String. public class ValorCompWrp { public static void main(String[] args) { Integer it = 10; Short sh=10; System.out.println(sh.equals(it)); /* imprime false devido os tipos serem diferentes, mas compila, se fosse com == no compilava */}}
36
public class PrBoal { private Boolean b; private boolean b2; void metodo(){ System.out.println(b); System.out.println(b2==b); System.out.print(b2);} public static void main(String[] args) { new PrBoal().metodo();}}
37
Test - Resultado
1. public class PrBoal { 2. private Boolean b; 3. private boolean b2; 4. void metodo(){ 5. System.out.println(b); 6. System.out.println(b2==b);//linha 6 7. System.out.print(b2);} 8. public static void main(String[] args) { 9. new PrBoal().metodo();} /* lana uma exceo porque Objetos so inicializado com null e tentei usar ele na linha 6 NullPointerException */}
38
41
42
Test - Resultado
public class BolWraper { static boolean b4; public static void main(String[] args) { Boolean b = new Boolean("TruE"); Boolean b2 = new Boolean("Camilo"); Boolean b3 = new Boolean(null); System.out.println(b); System.out.println(b2);//false System.out.println(b3);//false System.out.println(b4);//false } /* para qualquer valor no args que no seja true * vai ser false e para null tambm */ /* o valor padro de boolean FALSE*/ }
43