Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Clase 3 Asignaciones
Ezequiel Aranda
Sun Microsystems Campus
Ambassador
AGENDA
>Literales
>Referencias
>Arrays
>Wrappers
>Boxing y Widening
>Sobrecarga con boxing, widening y var-args
>Garbage Collection
Stack y Heap
Literales Octales
>Los enteros octales slo
utilizan los dgitos del 0 al 7.
>En Java, se puede
representar un entero en
forma octal colocando un
cero delante del nmero.
int
int
int
int
Literales Hexadecimales
>Un valor hexadecimal comienza con 0x u OX.
>Por Ejemplo:
int
int
int
x =
x
y
z
1
=
=
=
y
0X0001;
0x7fffffff;
0xDeadCafe;
= 2147483647 z = -559035650
Literales de caracter
>Es posible escribirlos como el valor Unicode
del caracter, usando el prefijo \u.
char letraN= '\u004E'; // la letra
'N'
Casts en primitivos
>Los casts (conversiones) pueden ser implcitos
o explcitos. Que sea implcito significa que
sucede automticamente.
>Los casts implcitos se dan al poner un tipo
ms pequeo en un contenedor ms
grande
>int a = 100;
>long b = a;//cast implcito: un int
simpre entra en un long.
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);
}
}
Primitivos Locales
>Las variables locales,
incluyendo
primitivos, siempre
deben ser
inicializados antes de
utilizarlos.
>Si intentamos utilizar un primitivo sin
inicializar, obtendremos un error de
compilacin.
String
>Una excepcin 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.
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 el
String se asigna al nuevo objeto.
Pasando referencias
>Cuando pasamos una variable
(referencia a objeto) a un mtodo,
debemos tener en cuenta que estamos
pasando una referencia y no el objeto en
s mismo.
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);
}
}
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);
}
}
Pregunta
>qu imprime este cdigo?
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);
}
}
Arrays
>int[][] myArray= new int[3][]; // Legal
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
Bloques de inicializacin
>Un bloque de inicializacin esttico se ejecuta
una nica vez, cuando se carga la clase.
>Un bloque de inicializacin 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.
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);
}
}
?
static int [] x = new int[4];
static { x[4] = 5; }
>Funciona?
? ?
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 un
primitivo del tipo que envuelve y uno que
toma una representacin de tipo String del
tipo a construir.
Integer i1 = new Integer(42);
Integer i2 = new Integer("42");
Wrappers (II)
>La clase Character provee un nico
constructor, que toma un char como
argumento.
Character c1 = new Character('c');
parse____() y valueOf()
>Ambos toman un String como argumento y
arrojan una excepcin
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
toString()
>La idea de este mtodo es obtener una
representacin coherente de un objeto dado.
>Todos los wrappers poseen un mtodo
toString esttico sobrecargado que toma un
primitivo del tipo apropiado.
AutoBoxing
>En Java 5 aparece
esta caracterstica
conocida como
autoboxingautounboxing o
simplemente boxingunboxing.
>int pInt = 420;
>Integer wInt = pInt; // autoboxing
>int p2 = wInt; // auto-unboxing
>Java 5:
>Integer y = new Integer(567);
>y++; // unwrap, incremento,rewrap
>System.out.println("y= " + y); // print
AutoBoxing (II)
Integer y = 567; // wrapper
Integer x = y;
System.out.println(y==x);
y++; // unwrap, uso, "rewrap"
System.out.println(x + " " + y);
System.out.println(y==x);
Sobrecarga
>Veamos 3 cosas que pueden hacer la
sobrecarga un poco engaosa.
>Widening
>AutoBoxing
>Var-args
Widening
class 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);
}}//
Conclusin
>El orden en que el compilador elige es el
siguiente:
1. Mismo tipo
2. Widening
3. Boxing
4. Var-args
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) { }
}
class WidenAndBox{
static void go(Long x) {
System.out.println("Long"); }
public static void main(String [] args)
{
byte b = 5;
go(b); // requiere widening y boxing ilegal
}}
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));
} }
>Cul es el resultado?
A. 1 1 B. 2 1 C. 3 3 D. 4 3
Resumen
>El widening de primitivos usa el tipo ms
pequeo 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.
Garbage Collection
>En C, C++ y otros lenguajes, el programador
es responsable de la administracin de
memoria.
>En Java, se provee un hilo de sistema que se
encarga de esta tarea.
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
} }
Preguntas