asignaciones en java

9

Click here to load reader

Upload: percy-castillo

Post on 13-Jun-2015

5.373 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Asignaciones en java

Lenguajes de Programación I

Asignaciones

Ayud. Mezzanotte, Martín

Lenguajes de Programación I

- Cursada 2006 - Ingeniería de Sistemas

Facultad de Ciencias Exactas Universidad Nacional del Centro de la Provincia de Buenos Aires

Page 2: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-1-

Lenguajes de Programación I

Asignaciones

Objetivos • Ejemplificar situaciones de asignación en esquemas de asignación por copia de

valores. • Ejemplificar situaciones de asignación en esquemas de asignación por copia de

referencias. • Analizar situaciones análogas entre asignaciones y pasajes de parámetros. • Exponer relaciones conceptuales importantes entre las asignaciones y otros

temas relevantes de la materia, como por ejemplo: Administración de memoria, diferencias y similitudes entre lenguajes dinámicos orientados a objetos y lenguajes tipo Algol, entre otros.

Temario

Variables • Distinción entre Valor, Referencia y Nombre.

Asignaciones entre variables • Concepto: ¿Qué sucede en la sentencia “a:=b”? • Ejemplificación en lenguaje C: Orientado a asignación por copia. • Ejemplificación en lenguaje Java: Orientado a asignación por referencia. • Comparación entre ambos esquemas de asignación:

o Existencia de ambos datos en asignaciones por copia. o Creación de alias y generación de garbage en asignaciones por

referencia. o Similitud con los esquemas de pasajes de parámetros

• Asignación por referencia explícita (Lenguaje C) e implícita (Lenguajes dinámicos orientados a objetos).

Otras Asignaciones • Asignaciones con expresiones. • Asignaciones con funciones. • Asignaciones con constantes.

Page 3: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-2-

Variables

Concepto de Variable: Valor, Referencia y Nombre

En primer lugar, recordaremos algunos conceptos importantes con respecto al

manejo de variables. De cada variable es posible distinguir: Su valor. Es decir, el dato que se almacena en la variable. Su referencia. O sea, la dirección de memoria donde está almacenado el valor de

la variable. Su nombre. Es decir, un identificador que permite referenciar en lenguaje natural

una dirección de almacenamiento. De esta forma, podemos entender las variables como ternas de la siguiente forma:

Fig. 1: Representación de una variable.

Por ejemplo:

VALOR

Dirección Nombre

void main(){

int a=14;

[…]

}

EE ED

14

26h a

Page 4: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-3-

Asignaciones entre variables

Concepto de Asignación: ¿Qué sucede en la sentencia "a:=b”?

Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje de

una sentencia de asignación: En una asignación entre dos variables, el lenguaje realiza diferentes acciones al

manipular las variables del lado izquierdo y derecho de la sentencia. Con respecto al lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria que éste referencia, con el objetivo de almacenar el dato obtenido desde el lado derecho. Para esto, la variable del lado derecho debe sufrir una extracción de valor (Desreferencing).

Veamos un ejemplo de un programa simple, codificado en lenguaje C: Ejemplo 1

Puede observarse la existencia de los datos, ya que la sentencia de incremento en

b no tuvo ningún efecto sobre el valor de a.

void main(){ int a=14; int b=10; a=b;

b++; printf("\nEl valor de a es %d",a); printf("\nEl valor de b es %d",b); }

EE ED

14

26h a

10

22h b

EE ED

10

26h a

10

22h b

EE ED

10

26h a

11

22h b

El valor de a es 10

El valor de b es 11

Page 5: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-4-

Veamos ahora dos ejemplos similares codificados en lenguaje Java: Ejemplo 2

º Puede observarse la existencia de los datos, ya que la sentencia de incremento en

b no tuvo ningún efecto sobre el valor de a.

public class Main { public Main() { } public static void main(String[] args) { int a=14; int b=10; a=b;

b++; JOptionPane.showMessageDialog(null,

"El valor de a es "+a+ "\nEl valor de b es “+b,"Asignaciones”, JOptionPane.PLAIN_MESSAGE);

System.exit(0); }

14

48h a

10

40h b

10

48h a

10

40h b

10

48h a

11

40h b

Page 6: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-5-

Ejemplo 3

En el segundo caso, cuando se utilizó objetos de tipo “Entero”, puede observarse

que el comportamiento de la sentencia de asignación es diferente: en este caso no hubo copia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia de incremento de b no hubiese afectado el valor de a.

public class Main { public Main() { } public static void main(String[] args) { Entero a=new Entero(14); Entero b=new Entero(10); a=b;

b.inc(); JOptionPane.showMessageDialog(null,

"El valor de a es "+a.valor()+ "\nEl valor de b es “+b.valor(),"Asignaciones”, JOptionPane.PLAIN_MESSAGE);

System.exit(0); }

Numero= 14

48h a 1

40h b

Numero= 10

1

Numero= 14

48h a 0

40h b

Numero= 10

2

a

40h b

Numero= 11

2

Numero= 14

48h 0 GARBAGE COLECTOR

public class Entero { private int numero; public Entero(int n) { numero=n; } public int valor(){ return numero; }

public void inc(){ numero++; } public void dec(){ numero--; } }//Fin clase Entero

Page 7: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-6-

Esquemas de Asignación: Asignaciones por copia y Asignaciones por referencia

De los ejemplos precedentes puede concluirse que las sentencias de asignación

tienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debe a que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremos a continuación.

Asignaciones por copia El esquema de asignaciones entre variables por copia de valores funciona de la

siguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción del

valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de memoria correspondiente a la variable del lado izquierdo de la sentencia.

Como consecuencia, la única relación entre ambos datos es que –en este punto del programa- contienen el mismo valor en sus respectivas celdas de memoria. Ambos datos continúan siendo entidades completamente independientes, por lo cual cualquier cambio en uno de ellos NO produce ningún efecto sobre el otro.

Este esquema de asignación puede ser observado en los primeros dos ejemplos. Asignaciones por referencia El esquema de asignaciones entre variables por referencia funciona de la siguiente

manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción de la

dirección de memoria (referencia) donde se halla almacenado su valor. Luego, este valor de dirección es copiado en la referencia correspondiente a la variable del lado izquierdo de la sentencia.

Como consecuencia, ambos nombres de variables referencian a la misma dirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a ser realizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Esta situación es conocida como “generación de alias”.

Existe otra consecuencia importante que debemos analizar: ¿Qué sucede con el dato que referenciaba originalmente la variable del lado

izquierdo de la asignación? La respuesta es simple: Si no existe ninguna otra variable que lo referencie, se convierte en un bloque de

memoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación de garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre variables.

Este esquema de asignación puede ser observado en el ejemplo número 3.

Page 8: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-7-

Analogía con esquemas de pasaje de parámetros Resulta claro apreciar que existe una fuerte similitud entre estos esquemas de

asignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje de Parámetros por Copia-Valor y Pasaje de Parámetros por Referencia, respectivamente.

Fig. 2: Relación análoga entre pasaje de parámetros y asignaciones entre variables. Conclusiones Es posible concluir que ambos esquemas poseen beneficios y perjuicios. En el

caso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copia también es posible asignar referencias si así se desea. Esto debe hacerse de manera explícita, utilizando punteros del lado izquierdo de la sentencia y por medio del operador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, por ejemplo, incorpora un mecanismo de generación de alias a través de la definición del tipo de dato “referencia” (Ver fig. 4).

Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar el esquema de asignaciones entre variables por referencia. Esto se debe a que un objeto es un dato bastante más complejo que una variable entera, pues no solo posee datos sino también métodos. Con lo cual, utilizar este esquema resulta más flexible.

[…] int a=10; int *pun; pun= &a; //Asignación de la dirección de ‘a’ en ‘pun’. […]

Fig. 3: Asignación de referencias explícita en C.

[…] int a=10; int &ref_a=a; //Declaración e inicialización de la referencia ‘ref_a’ a ‘a’. […]

Fig. 4: Declaración de un alias en C++.

Asignaciones entre variables

Pasaje de parámetros

Asignaciones por copia

Asignaciones por referencia

Pasaje de parámetros por copia

Pasaje de parámetros por referencia

Page 9: Asignaciones en java

Lenguajes de Programación I Apunte: Asignaciones

-8-

Otras asignaciones

Asignación de una expresión o una constante

En este caso, no existe distinción alguna entre asignación por copia o referencia

ya que las expresiones no tienen referencias. La asignación consiste en calcular el valor de la expresión situada del lado derecho de la sentencia y almacenarlo en la celda de memoria referenciada por la variable del lado izquierdo.

Por ejemplo:

[…] int a; a = 3 * 4;

[…]

Fig. 5: Asignación de expresiones en C. El caso de asignación de una constante es análogo.

Asignación de una función

En este caso, si se asignara a la variable del lado izquierdo el puntero a la función

ubicada en el lado derecho, la variable se comportaría como un puntero a la función. Esto no es un uso común. Lo que se hace es ejecutar la función y, luego, se asigna el valor resultado a la celda de memoria referenciada por la variable del lado izquierdo de la sentencia (Asignación por copia).

Por ejemplo:

[…] int a; a = maximo(3,6);

[…]

Fig. 5: Asignación del valor de una función en C.

En C, por ejemplo, es posible copiar el puntero de una función pero debe hacerse en forma explícita hacia una variable de tipo puntero a función.