Introducción a la programación y la informática. Tema 4

26
Tema 4. Tipos de datos: clases y referencias Introducción a la Informática y a la Programación (IIP) Curso 2011/12 Departamento de Sistemas Informáticos y Computación

Transcript of Introducción a la programación y la informática. Tema 4

Page 1: Introducción a la programación y la informática. Tema 4

Tema 4. Tipos de datos: clases yreferencias

Introducción a la Informática y a la Programación (IIP)

Curso 2011/12

Departamento de Sistemas Informáticos y Computación

Page 2: Introducción a la programación y la informática. Tema 4

Contenidos

1. Introducción

2. Ejemplo de definición y uso de una clase

3. Inicialización de los atributos

4. Representación en memoria de los objetos. Variables referencia

5. Diferencias entre variables elementales y objetuales

Declaración. Operador new

El operador de acceso "."

La asignación

Copia de objetos

Comparación de objetos

El garbage collector

6. Información de clase. Modificador static

07/10/2011 IIP - Curso 2011/12 2

Page 3: Introducción a la programación y la informática. Tema 4

Introducción• En Java es posible utilizar elementos cuyos valores no son tipos primitivos.

• Un valor no perteneciente a un tipo primitivo es un tipo compuesto oestructurado. Para definirlos en Java se utilizan las clases.

• Un elemento perteneciente a un tipo no primitivo, definido con una clase, esun objeto.

• El valor de una variable objeto, debe entenderse como la agregación de losvalores individuales de sus componentes o atributos; estos podrán ser tantovalores individuales como estructurados.

07/10/2011 3IIP - Curso 2011/12

// Crear un Circulo de radio 50, amarillo, con centro

// en (100,100)

Circulo c1 = new Circulo(50,"amarillo",100,100);

// Añadirlo a la Pizarra y dibujarlo

miPizarra.add(c1);

Page 4: Introducción a la programación y la informática. Tema 4

Introducción

Recordatorio de esquema de definición de una clase (tema 2):

[modificadores] class NombreDeLaClase [ extends OtraClase ] {

// Definición de atributos

[[modificadores] tipo nomVar1;

[modificadores] tipo nomVar2;

... ... ...

[modificadores] tipo nomVarN; ]

// Definición de métodos

// Constructores... ... ...... ... ...// Otros métodos

}

07/10/2011 4IIP - Curso 2011/12

Page 5: Introducción a la programación y la informática. Tema 4

Ejemplo de definición y uso de una clase

• Se desea representar un punto en un espacio de dos dimensiones(dos valores reales). Definición de la clase:

• Almacenado el código en un fichero (Punto.java) y tras haberlocompilado, puede usarse para definir y utilizar variables de tipoPunto en otra clase Java.

07/10/2011 5IIP - Curso 2011/12

class Punto {

double x; // la abscisa

double y; // la ordenada

// el constructor por defecto no es necesario

public Punto() { } //constructor por defecto

}

Page 6: Introducción a la programación y la informática. Tema 4

Ejemplo de definición y uso de una clase

07/10/2011 6IIP - Curso 2011/12

class PruebaPunto {

public static void main(String[] args) {

// se definen e inicializan dos variables de tipo Punto

Punto p1 = new Punto(); Punto p2 = new Punto();

// se asignan valores a los atributos de p1:

p1.x = 1.0; p1.y = 1.0;

// se asignan valores a los atributos de p2 usando p1:

p2.x = 2.0 * p1.x; p2.y = -2.0 * p1.y;

// se escriben los valores de los atributos de p2:

System.out.println("(" + p2.x + "," + p2.y +")");

}

}

Page 7: Introducción a la programación y la informática. Tema 4

Ejemplo de definición y uso de una claseAlgunas características, generalizables, de las clases de los ejemplos son:

• Mediante la operación new se crea un objeto de la propia clase. Después sepueden utilizar los elementos del objeto: atributos y métodos.

• Los atributos de una clase pueden ser de cualquier tipo (elementales o no). Seutilizan siguiendo las reglas de uso de las variables de dicho tipo.

• En el ejemplo se han definido sin modificador de acceso, esto se conoce comoacceso friendly: accesibles desde todas las clases del paquete en que seencuentre la clase en que se definen.

– Pero habitualmente se definirán de acceso privado, private, por ocultación y seguridad.

• El uso de los elementos del objeto se hace utilizando la notación de punto. Enparticular, a los atributos se les asigna o lee su valor utilizando:

07/10/2011 7IIP - Curso 2011/12

nombreDeVariableObjeto.nombreDeAtributo

Page 8: Introducción a la programación y la informática. Tema 4

Inicialización de los atributos

• Cuando el objeto se crea, sus atributos se inicializan por defecto:

– A cero los numéricos, al código cero los char y a false los boolean.

– A null, que representa la inexistencia, los objetos.

• Se les puede dar un valor inicial explícitamente, por ejemplo:

• También se pueden inicializar en los constructores (tema 5).

En todo caso, la secuencia de ejecución de la inicialización es:

07/10/2011 8IIP - Curso 2011/12

class Punto {

double x = 1.0; double y = 1.0;

public Punto() { }

}

Por defecto explícitamente en los constructores

Page 9: Introducción a la programación y la informática. Tema 4

Representación en memoria. Referencias

Cuando se crea un objeto y se asigna a una variable, el sistema leasocia memoria dividiéndola en dos partes:

• Una parte asociada al objeto como tal, mediante la que se mantiene suinformación (valores de atributos y métodos que se pueden aplicar).

– La zona del sistema en la que se guarda la memoria de los objetos que se creandurante la ejecución se denomina montículo (heap).

• Otra parte de memoria se asocia a la variable con la que se nombra al objeto.Mediante la misma, el sistema determina en ejecución dónde se encuentra elobjeto para poder actuar con él.

Cuando se crea un objeto, se dice que mediante la variable que da nombre alobjeto se referencia la zona de memoria donde se encuentra el objeto en sí.

Es habitual denominar a estas variables variables referencia.

07/10/2011 9IIP - Curso 2011/12

Page 10: Introducción a la programación y la informática. Tema 4

Representación en memoria. ReferenciasEjemplo:

07/10/2011 10IIP - Curso 2011/12

// Creación de un Punto por defecto (0.0, 0.0). Asignación de la

// referencia al objeto a la variable punto1

Punto punto1 = new Punto();

0.0

x 0.0

y

montículo

Memoria del sistema

punto1

Page 11: Introducción a la programación y la informática. Tema 4

Representación en memoria. Referencias

Algunas características de las referencias:

• Todos los objetos en Java se manipulan mediante referencias. Los únicoselementos no referenciados son los valores elementales.

• Cuando una variable referencia no identifique ningún objeto; puede utilizarseuna constante especial para indicarlo: null.

• Si dos variables referencia mantienen un mismo valor, entonces ambas estánreferenciando al mismo objeto.

• Los únicos operadores permitidos para manipular variables referencia son: deasignación (=), de acceso (.) y comparaciones: (==, !=).

La principal diferencia entre valores primitivos y referencia consiste en que lasvariables que representan a los primeros mantienen su valor, mientras que lasque representan a los segundos mantienen una referencia a los mismos.

07/10/2011 11IIP - Curso 2011/12

Page 12: Introducción a la programación y la informática. Tema 4

Diferencias: declaración, operador newLa declaración de un objeto no lo genera. Cuando se desea utilizar un nuevoobjeto de cierto tipo, es necesario crearlo.

Hasta el momento de su creación el objeto no existe y cualquier intento dereferenciarlo antes provocará un error de compilación o en tiempo deejecución.

07/10/2011 12IIP - Curso 2011/12

// Se declara circulo, que no referencia a ningún objeto

Circulo circulo;

// Se crea un Circulo y se asigna su referencia a circulo

circulo = new Circulo();

// Alternativamente: Se declara circulo y se le asigna la

// referencia al objeto Circulo que se crea

Circulo circulo = new Circulo();

Page 13: Introducción a la programación y la informática. Tema 4

Diferencias: declaración, operador new

07/10/2011 13IIP - Curso 2011/12

circulo

50.0radio

color

100centroX

100centroY

montículo

Memoria del sistema

“negro”

//Creación de un Circulo por defecto: radio 50, negro, en (100,100)

Circulo circulo = new Circulo();

Page 14: Introducción a la programación y la informática. Tema 4

Diferencias: el operador de acceso "."

El operador punto se emplea para seleccionar el método específico que sedesee utilizar sobre un objeto, por ejemplo:

y también para acceder a sus atributos:

Si se intenta utilizar un objeto inexistente, se producirá bien un error delcompilador, bien la excepción siguiente en ejecución:

07/10/2011 14IIP - Curso 2011/12

// creación de un objeto de tipo Pizarra

Pizarra miPizarra = new Pizarra("ESPACIO DIBUJO", 300, 300);

// creación de un objeto de tipo Circulo

Circulo circulo = new Circulo(50, "amarillo", 100, 100);

// uso del método add de la clase Pizarra

miPizarra.add(circulo);

Punto p1 = new Punto();

p1.x = -10.0;

NullPointerException

Page 15: Introducción a la programación y la informática. Tema 4

Diferencias: la asignaciónLa asignación entre variables referencia reemplaza las referencias, no elcontenido referenciado por las mismas.

07/10/2011 15IIP - Curso 2011/12

Punto p1 = new Punto(); // p1 referencia a un objeto

// de la clase Punto

Punto p2 = p1; // p1 y p2 referencian al

// mismo objeto

p2 0.0

x 0.0

y

montículo

Memoria del sistema

p1

Page 16: Introducción a la programación y la informática. Tema 4

Diferencias: la asignaciónConsidérese el ejemplo siguiente, en el que se pierde la referencia a unobjeto, se dice que el objeto queda desreferenciado.

07/10/2011 16IIP - Curso 2011/12

Punto p1 = new Punto(); // p1 referencia a un objeto

Punto p2 = new Punto(); // p2 referencia a otro objeto

p2 = p1; // p1 y p2 referencian al primer objeto,

// nada referencia al segundo

p2

0.0

x 0.0

y

montículo

p1 0.0

0.0

x

y

Memoria del sistema

Page 17: Introducción a la programación y la informática. Tema 4

Diferencias: copia de objetos

Si la estructura del objeto es conocida y accesible, entonces es posiblerealizar una copia del mismo mediante una copia atributo a atributo.

Ejemplo, suponiendo que los atributos de Circulo fuesen accesibles (accesopublic o friendly en lugar de private como se declararon originalmente):

07/10/2011 17IIP - Curso 2011/12

// Crear un Circulo de radio 10, amarillo, con centro en (15,20)

Circulo c1 = new Circulo(10,"amarillo",15,20);

// se crea una copia:

Circulo copia = new Circulo();

copia.radio = c1.radio;

copia.color = c1.color;

copia.centroX = c1.centroX;

copia.centroY = c1.centroY;

Page 18: Introducción a la programación y la informática. Tema 4

Diferencias: copia de objetos

Nótese que el objeto String de valor "negro" queda desreferenciado.

07/10/2011 18IIP - Curso 2011/12

c1

montículo

Memoria del sistema

“amarillo”

10.0radio

color

15centroX

20centroY

10.0radio

color

15centroX

20centroY

copia

“negro”

Page 19: Introducción a la programación y la informática. Tema 4

Diferencias: comparación de objetos

• Para los tipos primitivos el operador "==" es cierto o falso según sean o noiguales los valores de las variables que se comparan.

• Cuando este operador se aplica a objetos, devolverá cierto o falso segúnsean o no iguales las referencias contenidas.

Si se aplica el operador a dos objetos distintos, aunque sus atributostengan el mismo valor, el resultado será false. Ejemplo:

07/10/2011 19IIP - Curso 2011/12

Punto p1 = new Punto();

p1.x = 3.0; p1.y = -2.5;

Punto p2 = p1;

Punto p3 = new Punto();

p3.x = 3.0; p3.y = -2.5;

System.out.println(p1 == p1);

System.out.println(p1 == p2);

System.out.println(p1 == p3);

true

true

false

Page 20: Introducción a la programación y la informática. Tema 4

Diferencias: comparación de objetos

• Si lo que se desea es determinar la igualdad interna de los objetos, esnecesario hacerlo mediante una comparación atributo a atributo:

• Como los atributos serán por lo general privados, se recurrirá a la definicióny uso de un método especializado, equals(), que existe, además,predefinido en la clase Object.

07/10/2011 20IIP - Curso 2011/12

System.out.println(p1.x == p1.x && p1.y == p1.y);

System.out.println(p1.x == p2.x && p1.y == p2.y);

System.out.println(p1.x == p3.x && p1.y == p3.y);

true

true

true

Page 21: Introducción a la programación y la informática. Tema 4

Diferencias: el garbage collector

• Es un subsistema de la máquina virtual Java que recupera la memoria de losobjetos no referenciados para que pueda volver a ser utilizada.

• Es frecuente en los lenguajes actuales basados en el uso de una máquinavirtual (por ejemplo Java, C#, Python). En otros lenguajes (por ejemplo C++ oAda) es necesario que el programador libere explícitamente la memoria queha dejado de utilizarse.

• En Java entra en funcionamiento automáticamente, pero es posibleinhabilitar su funcionamiento, si se desea, o sugerir al sistema que seejecute mediante una utilidad de la clase System (System.gc()).

07/10/2011 21IIP - Curso 2011/12

Page 22: Introducción a la programación y la informática. Tema 4

Información de clase. Modificador static

En ocasiones es necesario mantener información común a todos los objetosde una clase, por ejemplo:

• Número de objetos de la clase Punto que se han creado en unmomento dado.

• Número de objetos de la clase Circulo que existen de color"amarillo".

• Número de objetos de la clase Circulo que se han creado y que hancambiado su color de "negro" a "amarillo" .

La solución consiste en poder mantener información asociada atoda la clase en conjunto.

Una variable o atributo de clase es una variable mediante la que es posiblemantener información común a todos los elementos de la clase.

07/10/2011 22IIP - Curso 2011/12

Page 23: Introducción a la programación y la informática. Tema 4

Información de clase. Modificador static

Se declaran precedidas del modificador static . Por ejemplo:

A efectos de su visibilidad, un atributo de clase, tiene el mismocomportamiento que cualquier otro y puede declararse public, private ofriendly, tal y como es el caso.

07/10/2011 23IIP - Curso 2011/12

class Punto {

double x; // la abscisa, variable de instancia

double y; // la ordenada, variable de instancia

static int contador = 0; // variable de clase

// cada vez que se ejecute el constructor contador

public Punto() { contador++; } // se incrementa

}

Page 24: Introducción a la programación y la informática. Tema 4

Información de clase. Modificador static

Como no están asociados a ningún objeto (pertenecen a la clase):

• El sistema les asigna memoria la primera vez que se ejecuta código de laclase, lo que puede ocurrir la primera vez que se crea un objeto de lamisma.

• La memoria asociada a las variables de clase permanece en uso hasta que laclase deje de estar cargada en memoria, normalmente al finalizar elprograma que la utiliza.

• Si es accesible (no es privada), para referenciarlas desde otra clase se utilizala forma:

• Para el ejemplo anterior, sería:

07/10/2011 24IIP - Curso 2011/12

NombreDeClase.nombreDeAtributoDeClase

Punto.contador

Page 25: Introducción a la programación y la informática. Tema 4

Información de clase. Modificador static

Ejemplo, supuesta declarada la clase Punto:

07/10/2011 25IIP - Curso 2011/12

class PruebaPunto2 {

public static void main(String[] args) {

// se escribe el valor inicial del contador de Puntos,

// nótese que aún no se ha creado ningún objeto

System.out.println("Num. puntos inicial: " + Punto.contador);

// se definen e inicializan varias variables de tipo Punto

Punto p1 = new Punto(); Punto p2 = new Punto(); Punto p3 = new Punto();

int puntosCreados = Punto.contador; // puntosCreados vale 3

Punto.contador = 0; // se resetea el número

....

}

}

Page 26: Introducción a la programación y la informática. Tema 4

Información de clase. Modificador static

Un uso habitual de las variables de clase es usarlas para almacenar un valorconstante, común a todos los elementos de la clase. Ejemplo:

07/10/2011 26IIP - Curso 2011/12

public class Circulo {

private double radio; private String color;

private int centroX, centroY;

public static final double DOS_PI = 2 * Math.PI;

....

/** calcula el área del Circulo. */

public double area() { return Math.PI * radio * radio; }

/** calcula el perímetro del Circulo. */

public double perimetro() { return DOS_PI * radio; }

....

}