Java SCJP clase3

Embed Size (px)

Citation preview

  • 8/18/2019 Java SCJP clase3

    1/68

    SCJP 6Clase 3 – Asignaciones

    Ezequiel Aranda

    Sun Microsystems Campus

    Ambassador

  • 8/18/2019 Java SCJP clase3

    2/68

    Disclaimer & Acknowledgments

    > Even though Ezequiel Aranda is a full-time employee of Sun

    Microsystems, the contents here are created as his own

    personal endeavor and thus does not reflect any official

    stance of Sun Microsystems.

    Sun Microsystems is not responsible for any inaccuracies inthe contents.

    Acknowledgments – The slides of this presentation are made

    from “SCJP Unit 1” by Warit Wanwithu and Thanisa

    Kruawaisayawan and SCJP Workshop by P. Srikanth.

    This slides are Licensed under a Creative Commons

    Attribution – Noncommercial – Share Alike 3.0

    > http://creativecommons.org/licenses/by-nc-sa/3.0/

  • 8/18/2019 Java SCJP clase3

    3/68

  • 8/18/2019 Java SCJP clase3

    4/68

  • 8/18/2019 Java SCJP clase3

    5/68

    Literales Octales

    > Los enteros octales sólo

    utilizan los dígitos del 0 al 7.

    > En Java, se puede

    representar un entero enforma octal colocando un

    cero delante del número.

    int six = 06; // Equivale a 6int seven = 07; // Equivale a 7int eight = 010; // Equivale a 8int nine = 011; // Equivale a 9

  • 8/18/2019 Java SCJP clase3

    6/68

    Literales Hexadecimales

    > Un valor hexadecimal comienza con 0x u OX.

    > Por Ejemplo:

    int x = 0X0001;

    int y = 0x7fffffff;

    int z = 0xDeadCafe;

    x = 1 y = 2147483647 z = -559035650 

    0XCAFE y 0xcafe son validos y tienen el mismovalor.

  • 8/18/2019 Java SCJP clase3

    7/68

    Literales de punto flotante

    > Los literales de punto flotante están definidos

    como double (64 bits) por defecto, por lo que

    al asignar un literal a una variable float (32

    bits), debemos colocarle el sufijo F (o f).float f = 23.467890;

    // falla la compilación

    float g = 49837849.029847F;

  • 8/18/2019 Java SCJP clase3

    8/68

    Literales de caracter

    > Es posible escribirlos como el valor Unicode

    del caracter, usando el prefijo \u.

    char letraN= '\u004E'; // la letra

    'N'> Los caracteres son enteros sin signo de 16

    bits.

    char e = -29; // necesitará un cast

    char f = 70000 // necesitará un cast

  • 8/18/2019 Java SCJP clase3

    9/68

    Primitivos vs. Referencias

    > Esto se llama Referencia:

    Button b = new Button();

    String s = new String();

    > Button b = null;

    Esto significa que “Button no refiere a ningún

    objeto”

  • 8/18/2019 Java SCJP clase3

    10/68

     Asignaciones sobre primitivos

    > Se puede asignar un valor a una variable

    primitiva usando un literal o el resultado de

    una expresión.

    int x = 7;int y = x + 2;

    int z = x * y;

     byte b = 300;¿Esto compila?

  • 8/18/2019 Java SCJP clase3

    11/68

     Asignaciones sobre primitivos (II)

    >  byte b = 3; // 3 entra en un byte

    >  byte c = 8; // 8 entra en un

     byte>  byte d = b + c; //No deberíahaber problema al sumar dos

     bytes, pero ¿funciona? ¿Porqué?

  • 8/18/2019 Java SCJP clase3

    12/68

    Casts en primitivos

    > Los casts (conversiones) pueden ser implícitos

    o explícitos. Que sea implícito significa que

    sucede automáticamente.

    Los casts implícitos se dan al poner un tipomás “pequeño” en un contenedor “más

    grande”

    int a = 100;>

     long b = a;//cast implícito: un intsimpre entra en un long.

  • 8/18/2019 Java SCJP clase3

    13/68

    Casts en primitivos (II)

    > Un valor que no cabe en un contenedor más

    pequeño debe convertirse explícitamente,

    indicando que conocemos la posibilidad de

    perdida de información.> float a = 100.001f;

    >  intb = (int) a; //cast explícito, el float

    podría perder información.

  • 8/18/2019 Java SCJP clase3

    14/68

     Asignar un literal demasiado grande a

    una variable

    > Si intentamos asignar un literal demasiado

    grande a una variable obtendremos un error

    de compilación.

    float f = 32.3; byte a = 128;

    // byte llega hasta 127

    ¿Qué pasa si hacemos esto?

     byte a = (byte) 128;

  • 8/18/2019 Java SCJP clase3

    15/68

     Asignando una variable primitiva a otra

    class ValueTest{

     public static void main (String [] args) {

    int a = 25; // asignamos un valor a ‘a’ System.out.println(“first a = " + a);

    int x = a;

    x = 30;

    System.out.println(“second a = " + a);

    }

    }

  • 8/18/2019 Java SCJP clase3

    16/68

     Asignación de variables de referencia

     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

    Bar reallyAFoo= new Foo(); // Ilegal

    }

    }

  • 8/18/2019 Java SCJP clase3

    17/68

    Tiempo de vida de las variables

    > Las variables estáticas se crean cuando se carga la clase

    y sobreviven mientras la clase se mantenga cargada en

    la JVM.

    > Las variables de instancia se crean con cada instancia y

    sobreviven hasta que la instancia es removida por elgarbage collector. 

    > Las variables locales viven mientras el método al que

    pertenecen este en el stack. Más adelante veremos que

    pueden estar vivas pero fuera de alcance.>

     

    Las variables de bloque sólo viven mientras el bloque se

    este ejecutando.

  • 8/18/2019 Java SCJP clase3

    18/68

    class Layout {

    static int s = 343;

    int x1;{ x1 = 7; int x2 = 5; }

    Layout(){

    x1 += 8; int x3 = 6;

    }

    void doStuff() {

    int y = 0;

    for(int z = 0; z < 4; z++) {

    y += z + x1;

    }

    System.out.println("y ="+y);

    }

    }

  • 8/18/2019 Java SCJP clase3

    19/68

  • 8/18/2019 Java SCJP clase3

    20/68

    Variables de instancia – referencias a objetos

     public class Book {

     private String title;

     public String getTitle() {

    return title;

    }

     public static void main(String [] args){

    Book b = new Book();

    System.out.println("The title is "+

     b.getTitle());}

    }

  • 8/18/2019 Java SCJP clase3

    21/68

    Variables de instancia – referencias a objetos (II)

    > null no es lo mismo que un string vacio. Significa

    que la variable no hace referencia a ningún objeto

    en el heap. public class Book {

     private String title;

    // variable de instancia de referencia

     public static void main(String[] args) {

    Book b = new Book();

    System.out.println(b.title);

    String s = b.title.toLowerCase();

    // Null pointer Exception

    }

    }

  • 8/18/2019 Java SCJP clase3

    22/68

    Primitivos Locales

    > Las variables locales,

    incluyendo

    primitivos, siempre

    deben serinicializados antes de

    utilizarlos.

    Si intentamos utilizar un primitivo sininicializar, obtendremos un error de

    compilación.

  • 8/18/2019 Java SCJP clase3

    23/68

    Referencias a objetos locales

    > A las referencias locales no se les asigna un valor

    por defecto (es decir, no son null por defecto). El

    siguiente código no compila:

    import java.util.Date;

     public class TimeTravel{

     public static void main(String[] args) {

    Date date; // falla la compilación.

    if (date == null)

    System.out.println("date es null");

    }

    }

  • 8/18/2019 Java SCJP clase3

    24/68

     Asignar una variable de referencia a otra

    import java.awt.Dimension;

    class ReferenceTest{

     public static void main (String [] args){

    Dimension a = new Dimension(5,10);

    System.out.println("a.height = " +a.height);

    Dimension b = a;

     b.height = 30;

    System.out.println("a.height = " +a.height +" after change to b");

    }

    }

  • 8/18/2019 Java SCJP clase3

    25/68

     Asignar una variable de referencia

    a otra (II)> Se declara b, y se le asignan el valor de a. Eneste punto ambas variables contienen valores

    identicos, porque los contenidos de a se

    copiaron en b. Aún hay solo un objetoDimension, al que tanto a como b hacen

    referencia.

    > Si asignamos la variable a a b, el patrón de

    bits en a es copiado, y la nueva copia se

    coloca en b.

  • 8/18/2019 Java SCJP clase3

    26/68

    String

    Una excepción a la forma en la que se

    asignan las referencias a objetos es String.

    > Los objetos String son inmutables, no se

    puede cambiar el valor de un objeto String.> Siempre que hagamos un cambio en un

    String, la VM actualizará la variable de

    referencia para apuntar a un nuevo objeto.

  • 8/18/2019 Java SCJP clase3

    27/68

    String (II)

    Se crea un nuevo String se crea (o se

    encuentra uno nuevo en el String Pool),

    dejando el original sin modificar.

    La referencia utilizada para modificar elString se asigna al nuevo objeto.

  • 8/18/2019 Java SCJP clase3

    28/68

    Pasando referencias

    Cuando pasamos una variable

    (referencia a objeto) a un método,

    debemos tener en cuenta que estamos

    pasando una referencia y no el objeto ensí mismo.

  • 8/18/2019 Java SCJP clase3

    29/68

    import java.awt.Dimension;

    class ReferenceTest{

     public static void main (String [] args) {

    Dimension d = new Dimension(5,10);ReferenceTest rt= new ReferenceTest();

    System.out.println("Before modify()d.height = "+ d.height);

    rt.modify(d);

    System.out.println("After modify()d.height = "+ d.height);

    }

    void modify(Dimension dim) {

    dim.height = dim.height + 1;

    System.out.println("dim = " + dim.height);

    }

    }

  • 8/18/2019 Java SCJP clase3

    30/68

    class ReferenceTest {

     public static void main (String [] args) {

    int a = 1;

    ReferenceTest rt = new ReferenceTest();

    System.out.println("Before = " +a);

    rt.modify(a);

    System.out.println("After = " + a);

    }

    void modify(int number) {

    number = number + 1;

    System.out.println("number = " + number);

    }

    }

  • 8/18/2019 Java SCJP clase3

    31/68

    Variables de instancia – Arrays

    Un Array es un objeto, por lo tanto una

    variable de instancia declarada pero no

    inicializada explícitamente, tendrá un valor

    null.> Pero… si el Array es inicializado, a todos los

    elementos que lo componen se les asigna su

    valor por defecto.

  • 8/18/2019 Java SCJP clase3

    32/68

    Pregunta> ¿qué imprime este código?

     public class NewClass{

    static int x[];

    static int y[] = new int[3];

     public int z;

     public static void main(String[] args){

    System.out.println(x);

    System.out.println(y);

    System.out.println(y[0]);

    System.out.println(x[1]);System.out.println(z);

    }

    }

  • 8/18/2019 Java SCJP clase3

    33/68

     Arrays> int[][] myArray= new int[3][]; // Legal

  • 8/18/2019 Java SCJP clase3

    34/68

     Arrays (II)

    int[][] scores = {{5,2,4,7}, {9,2}, {3,4}};

    > scores[0] // un array de cuatro ints

    > scores[1] // un array de dos ints

    scores[2] // un array de dos ints

    > scores[0][1] // valor entero 2

    > scores[2][1] // valor entero 4

  • 8/18/2019 Java SCJP clase3

    35/68

     Arrays (III) – JIT Arrays

     public class Foof{

    void takesAnArray(int[] someArray) {

    // usa el parámetro

    }

     public static void main (String [] args) {

    Foof f = new Foof();

    f.takesAnArray(new int[] {7,7,8,2,5});

    }

    }

  • 8/18/2019 Java SCJP clase3

    36/68

     Arrays de tipos primitivos

    int[] weightList= new int[5];

    > byte b = 4;

    > char c = 'c';

    short s = 7;

    > weightList[0] = b; // OK, byte < int

    > weightlist[1] = c; // OK, char < int

    weightList[2] = s; // OK, short < int

  • 8/18/2019 Java SCJP clase3

    37/68

     Arrays de referencias a objetos

    Si el tipo declarado para un Array es una

    clase, dicho Array podrá almacenar objetos de

    cualquier subclase del tipo declarado.

    class Car {}class Subaru extends Car {}

    class Ferrari extends Car {}

    Car [] myCars = {new Subaru(), new

    Car(), new Ferrari()};

  • 8/18/2019 Java SCJP clase3

    38/68

     Asignación de Arrays con

    referencias a objetos> Cualquier objeto de una clase que

    implemente una interfaz pasará la prueba “es

    un” (instanceof) para dicha interfaz. Por

    ejemplo, si Box implementa Foldable:Foldable[] foldingThings;

    Box[] boxThings= new Box[3];

    foldingThings= boxThings;

    > Pero no podremos hacer

     boxThings = foldingThings; 

  • 8/18/2019 Java SCJP clase3

    39/68

    Bloques de inicialización

    Un bloque de inicialización estático se ejecuta

    una única vez, cuando se carga la clase.

    > Un bloque de inicialización de instancias se

    ejecuta cada vez que se crea una instancia.> Se ejecutan en el orden en el que aparecen.

    > Los bloques de instancia se ejecutan luego de

    la llamada a super() en el constructor.

  • 8/18/2019 Java SCJP clase3

    40/68

    class Init {

    Init(int x) {

    System.out.println("1-arg const");

    }

    Init() {

    System.out.println("no-arg const");

    }

    static { System.out.println("1st static init");}

    { System.out.println("1st instance init"); }

    { System.out.println("2nd instance init"); }

    static { System.out.println("2nd static init"); }

     public static void main(String [] args) {

    new Init();

    new Init(7);

    }

    }

  • 8/18/2019 Java SCJP clase3

    41/68

    ?

    static int [] x = new int[4];

    static { x[4] = 5; }

    ¿Funciona? 

    ?  ? 

  • 8/18/2019 Java SCJP clase3

    42/68

    Wrappers

    En Java existe un wrapper por cada tipo

    primitivo (Float de float, Integer de int, etc).

    > Todos los wrappers tienen dos constructores

    (excepto Character): uno que toma unprimitivo del tipo que envuelve y uno que

    toma una representación de tipo String del

    tipo a construir.

    Integer i1 = new Integer(42);

    Integer i2 = new Integer("42");

  • 8/18/2019 Java SCJP clase3

    43/68

    Wrappers (II)

    La clase Character provee un único

    constructor, que toma un char como

    argumento.

    Character c1 = new Character('c');

  • 8/18/2019 Java SCJP clase3

    44/68

    Conversión de Wrappers a primitivos

    Cuando necesitamos convertir el valor de

    wrappers a primitivos, podemos usar alguno

    de los métodos “____Value()” de esa clase.

    Integer i2 = new Integer(42); byte b = i2.byteValue();

    short s = i2.shortValue();

    double d = i2.doubleValue();

  • 8/18/2019 Java SCJP clase3

    45/68

    parse____() y valueOf()

    Ambos toman un String como argumento y

    arrojan una excepción

    NumberFormatException si el String no tiene

    el formato correcto.

    long L2 = Long.parseLong("101010",2); //String binario a primitivo: L2 = 42

    Long L3 = Long.valueOf("101010", 2); //String binario a objeto Long: L3 value= 42

  • 8/18/2019 Java SCJP clase3

    46/68

    toString()

    La idea de este método es obtener una

    representación coherente de un objeto dado.

    > Todos los wrappers poseen un método

    toString estático sobrecargado que toma unprimitivo del tipo apropiado.

  • 8/18/2019 Java SCJP clase3

    47/68

     AutoBoxing

    En Java 5 aparece

    esta característica

    conocida como

    autoboxing-autounboxing o

    simplemente boxing-

    unboxing.

    int pInt = 420;

    > Integer wInt = pInt; // ‘autoboxing’

    int p2 = wInt; // ‘auto-unboxing’

  • 8/18/2019 Java SCJP clase3

    48/68

    > Integer y = new Integer(567);

    int x = y.intValue(); // unwrap

    x++; // incremento>

     

    y = new Integer(x); // re-wrap

    System.out.println("y= " + y); // print

    Java 5:>

     

    Integer y = new Integer(567);

    y++; // unwrap, incremento,rewrap

    System.out.println("y= " + y); // print

    Ambos imprimen: y = 568

  • 8/18/2019 Java SCJP clase3

    49/68

  • 8/18/2019 Java SCJP clase3

    50/68

    Boxing, ==, equals()

    Por ahora, sabemos que la intención de

    equals() es determinar cuando dos instancias

    de una clase son “significativamente

    equivalentes”.Integer i1 = 1000;

    Integer i2 = 1000;

    if(i1 != i2)System.out.println("differentobjects");

    if(i1.equals(i2))

    System.out.println("meaningfullyequal");

  • 8/18/2019 Java SCJP clase3

    51/68

  • 8/18/2019 Java SCJP clase3

    52/68

    Sobrecarga

    Veamos 3 cosas que pueden hacer la

    sobrecarga un poco engañosa.

    > Widening

    AutoBoxing

    > Var-args

  • 8/18/2019 Java SCJP clase3

    53/68

    Wideningclass EasyOver{

    static void go(intx) { 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);

    }}// En cada caso, cuando no se encuentra una

    correspondencia exacta, la JVM usa el método con el

    argumento que cumple con ser el “menor de los más

    amplios ” que el parámetro.

  • 8/18/2019 Java SCJP clase3

    54/68

    Sobrecarga con Boxing

    class AddBoxing {static void go(Integer x) {

    System.out.println("Integer"); }

    static void go(long x) {

    System.out.println("long"); } public static void main(String [] args) {

    int i = 5;

    go(i); // ¿Cuál de los go() se invoca?

    }}

    El compilador, ¿Decide hacer widening o

    autoboxing? 

  • 8/18/2019 Java SCJP clase3

    55/68

    Sobrecarga con var-argsclass AddVarargs{

    static void go(int x, int y) {

    System.out.println("int,int");}

    static void go(byte... x) {

    System.out.println("byte... "); } public static void main(String[] args){

     byte b = 5;

    go(b,b); // ¿Cuál de los go() se invoca?

    }

    }

  • 8/18/2019 Java SCJP clase3

    56/68

  • 8/18/2019 Java SCJP clase3

    57/68

    Widening de referencias

    class Animal {static void eat() { } }class Dog3 extends Animal {

     public static void main(String[] args) {

    Dog3 d = new Dog3();

    d.go(d); // ¿Esto vale?

    }

    void go(Animal a) { }

    }

    El compilador “ensancha” la referencia deDog3 a Animal, y la invocación funciona

    correctamente. La clave es que el widening

    de referencias depende de la herencia.

  • 8/18/2019 Java SCJP clase3

    58/68

  • 8/18/2019 Java SCJP clase3

    59/68

    Sobrecarga combinando Boxing y

    Wideningclass BoxAndWiden {static void go(Object o) {

    Byte b2 = (Byte) o;

    System.out.println(b2);

    } public static void main(String [] args) {

     byte b = 5;

    go(b); // ¿Puede este byte volverse un

    object?}

    }

    > ¿Funciona? ¿Por qué?

  • 8/18/2019 Java SCJP clase3

    60/68

    Sobrecarga combinando con Var-argsclass Vararg{

    static void wide_vararg(long... x)

    {System.out.println("long...");}

    static void box_vararg(Integer... x)

    {System.out.println("Integer...");}

     public static void main(String [] args) {

    int i = 5;

     wide_vararg(5,5); // widening y var-args

     box_vararg(5,5); // boxing y var-args

    }

    }

  • 8/18/2019 Java SCJP clase3

    61/68

    class Eggs {

    int doX(Long x, Long y) { return 1; }

    int doX(long... x) { return 2; }

    int doX(Integer x, Integer y) { return 3; }

    int doX(Number n, Number m) { return 4; }

     public static void main(String[] args) {

    new Eggs().go(); }

    void go() {

    short s = 7;

    System.out.print(doX(s,s) + " ");

    System.out.println(doX(7,7));

    } }

    > ¿Cuál es el resultado?

    A. 1 1 B. 2 1 C. 3 3 D. 4 3

  • 8/18/2019 Java SCJP clase3

    62/68

    Resumen

    El widening de primitivos usa el tipo más

    pequeño posible.

    > Boxing y Var-args, usados individualmente,

    son compatibles con sobrecarga.> No se puede ensanchar de un wrapper a otro.

    > Widening -> Boxing = falla

    Boxing -> Widening = funciona> Puede combinarse Var-args con widening o

    boxing.

  • 8/18/2019 Java SCJP clase3

    63/68

    Garbage Collection

    En C, C++ y otros lenguajes, el programador

    es responsable de la administración de

    memoria.

    En Java, se provee un hilo de sistema que seencarga de esta tarea.

  • 8/18/2019 Java SCJP clase3

    64/68

    Garbage Collection (II)

    Durante los ciclos ociosos de la JVM, el

    garbage collector revisa y libera la memoria

    que este en condiciones de ser liberada.

    “Elegible” significa que puede serrecolectado.

    > Solo podemos pedir el garbage collector

    usando System.gc();

    No puede forzarse, sino más bien, sugerirse.

  • 8/18/2019 Java SCJP clase3

    65/68

    Garbage Collection (III)

    En el examen tendremos que identificar

    cuales objetos son “elegibles” para ser

    recolectados.

    La clave es encontrar los objetos que refierena NULL.

  • 8/18/2019 Java SCJP clase3

    66/68

  • 8/18/2019 Java SCJP clase3

    67/68

    class CardBoard{

    Short story = 5;

    CardBoard go(CardBoard cb) {

    cb= null;

    return cb; }

     public static void main(String[] args) {

    CardBoard c1 = new CardBoard();

    CardBoard c2 = new CardBoard();

    CardBoard c3 = c1.go(c2);

    c1 = null;

    // do Stuff

    } }

    Cuando llegamos a “//do Stuff”, ¿Cuantos elementos son

    elegibles para gc?

    A. 0 B. 1 C. 2 D. no compila E. Excepción 

  • 8/18/2019 Java SCJP clase3

    68/68

    Preguntas