Вы находитесь на странице: 1из 44

LINGUAGEM E TCNICAS DE PROGRAMAO

Professor Camilo Lopes camilo@camilolopes.com.br www.camilolopes.com.br

Aula 4 Converso de tipos


1) Converso de tipos primitivos 2) Checkpoint

Converso de tipos primitivos


A converso permite a transformao de valores primitivos de um tipo para outro, de modo explcito ou implcito. Explcito - necessrio que o programador informe ao compilador. Implcito - voc no precisa informar nada ao compilador.

Ex.: posso converter um int em long, pois potencialmente long


aceita um int mais o inverso deve ser feito de forma explicita.(cast). Voc pode colocar na caixa de TV 20 uma de 20 ou uma menor, jamais uma acima de 20.
3

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

Variveis de instncia array


Array um objeto, isso fundamental na declarao de um array null, mas se for inicializado, os elementos contidos nele sero do tipo declarado.
public class Array { int[] array;// aqui recebe null porque apenas declarei int [] ar = new int[2];// aqui recebe o valor padro de cada elemento public static void main(String[] args) { System.out.println(new Array().array); System.out.println(new Array().ar[1]); System.out.println(new Array().ar);//imprime a referncia do objeto (j que instancie) } resultado: null 0 I@18d107f
7

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

Varivel Local - Resultado


public class Cond { void met(){ int n; while(true){ n=4;} System.out.println(n);} /* esse cdigo no compila porque estou inicializando minha varivel local dentro de um bloco de instruo e isso no vlido se o cdigo for false. Iai, o que o compilador faz? Ento para evitar transtorno ele no aceita, mesmo sendo true */ }
9

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

Teste Esse cdigo:


a) b) c) d) e) Compila e imprime 20 10 Compila e imprime 20,10 No compila Compila com Excees Compila e imprime 10 10

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

Teste Qual o resultado?


a) b) c) d) e) Compila e imprime 442 No Compila Compila e lana Exceo No possivel saber o resultado Compila e imprime 440

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

Exemplo com Array Implementar


class ObjtRefe{ static void metodo(int[] a){ a[1]=5;} public static void main(String ar[]){ int[]objt = {2,1}; for(int a : objt) System.out.print(a +" "); metodo(objt); System.out.println(); for(int a : objt) System.out.print(a +" ");}}

/* 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

Array Regras no Java


Array annimo no especifica o tamanho do Array. int[] array = {1,2};//valido int [] array = new int[2]{1,2}; //invlido

Invlido nmero negativo


int [] array = new int[-2]; //invlido lana uma exceo, porm compila.

- Array os objetos referenciam null.


Integer it [] = new Integer[2];//null it[0] = new Integer(); //aqui tenho na posio 0 objeto Integer
18

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

Teste O que acontece ao executar?


a) b) c) d)
1. 2. 3. 4. 5. 6. 7. 8. 9.

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

Array Regras no Java


NullPointerException quando usar um objeto com referncia null.
public class ExcecaoArra {

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).

Teste Qual o resultado?


a) Compila e lana uma Exceo ArrayNullException b) No compila devido a linha 5 c) Compila e imprime null e lanca uma Exceo NullPointException d) Compila e lana apenas NullPointException

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);}}

Teste Qual o resultado?


class ArryIntege{ public static void main(String args[]){ Integer [] array = new Integer[4]; System.out.println(array[0]);//null impresso array[1]=1; System.out.println(array[1]); System.out.println(array[0]+2); //lanca uma exceo NullPointException }}

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.

String a = Camilo; String d=a;


Se uma alterao ocorrer, apenas a vai sofrer alterao, d no sofrer nada. Uma varivel de referncia - significa que est se passando uma cpia dos bits. Passar por valor - significa passar uma cpia da varivel. O mtodo chamado NO pode alterar a varivel que a chamou
27

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();

valueOf(String) - String para objetos. Double d = Double.valueOf(80);

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

Teste Qual o resultado


a) b) c) d) No compila Compila e lana excees Compila e imprime 0 Compila normalmente

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

Test Qual o resultado?


a) b) c) d) No compila Compila e lana vrias excees Compila e lanca uma exceo Compila sem excees

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

Sobrecarga de Mtodos Wrappers


class EasyOver{ static void go(int x){System.out.print("int ");} static void go(long x){System.out.print("long ");} static void go(double x){System.out.print("double ");} public static void main(String [] args){ byte b = 5; short s = 5; long l = 5; float f = 5.0f; go(b); go(s); go(l); go(f);}}
39

Sobrecarga de Mtodos Wrappers


No exemplo anterior observamos que no mtodo no temos nenhum args do tipo byte, short e float, porm a JVM usou o mtodo menor e AMPLIOU para um maior. Ento short, byte implicitamente convertido para um tipo int.

Sobrecarga de mtodos - Wrappers


1. 2. 3. 4. Class NoAmplia{ Static void go(Integer a){} Public static void main (String ddd[]){ Go(new Long(5)); }}

/* no posso colocar um Long dentro de um Integer*/


/* o mesmo que tentar colocar uma carreta em uma garagem para um carro pequeno, impossvel; so objetos diferentes*/

41

Teste Qual resultado?


a) Compila e imprime false true false b) Compila e imprime false false false c) Compila e imprime true false true d) No Compila
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); System.out.println(b3); System.out.println(b4);}}

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

Вам также может понравиться