Beruflich Dokumente
Kultur Dokumente
t
o
d
o
M
t
o
d
o
Variables
de Instancia
Clases y Objetos
Clases
Es una construccin software que define los datos (estado) y los mtodos
(comportamiento) de los objetos concretos especficos que son subsecuentemente
construidos por medio de dicha clase.
En terminologa Java, los miembros de una clase puede ser
Campos (variables de instancia), que representan los datos para la clase.
Mtodos (mtodos de instancia), que son las secuencias de sentencias que operan sobre los
datos.
El objeto es creado o instanciado a partir de las especificaciones declaradas por la clase.
EJEMPLO: Declaracin de la clase Punto
class Punto extends Object {
public double x; // variable de instancia
public double y; // variable de instancia
}
Expositor: Miguel Ataurima Arellano 11
Instanciamiento de un objeto a partir de su clase.
Consiste en la creacin de un objeto a partir de una clase.
Para crear un objeto a partir de una clase se siguen dos pasos:
1. Declaracin de una variable que haga referencia al objeto del tipo especificado por su clase
Punto miPunto; // declaracin de la variable miPunto que referencia a un objeto Punto
2. Asignacin de una instancia de un objeto del tipo especificado por su clase
miPunto = new Punto(); // asigna una instancia al objeto Punto
El acceso a las variables del objeto se logra referenciando los nombres de las variables
precedidos por el nombre del objeto.
miPunto.x = 10.0
miPunto.y = 27.47
Expositor: Miguel Ataurima Arellano 12
Universidad Nacional de Ingeniera
Facultad de Ingeniera Elctrica y Electrnica
Centro de Estudiantes
Clases
Expositor: Miguel Ataurima Arellano 13
Expositor: Miguel Ataurima Arellano 14
Forma General Bsica de una Clase
class classname {
tipo variable1;
tipo variable2;
:
tipo variableN;
tipo nombreMtodo1(lista de parmetros) {
// cuerpo del mtodo
}
tipo nombreMtodo2(lista de parmetros) {
// cuerpo del mtodo
}
:
tipo nombreMtodoN(lista de parmetros) {
// cuerpo del mtodo
}
}
Los datos o variables declarados
dentro de una clase se denominan
variables instancia o campos
Los mtodos tienen la
misma forma general
que la funcin main( )
Expositor: Miguel Ataurima Arellano 15
Las Variables definidas dentro de una clase son llamadas variables instancia
porque cada instancia de una clase (esto es, cada objeto de la clase) contiene su
propia copia de estas variables.
Ambos, el dato para un objeto es separado y nico de los datos de otro.
Todos los mtodos tienen la misma forma general como main( ).
La mayora de los mtodos no se especifican como static o public.
Las clases de Java no necesitan tener un mtodo main( ). Solo debe especificarse
cual de las clases es el punto de inicio para el programa. Es esta la razn por la
que los applets no requieren un mtodo main( ).
Expositor: Miguel Ataurima Arellano 16
EJEMPLO. Una simple clase llamada Box que define tres variables instancia :
width, height y depth. Box no contiene ningn mtodo.
class Box {
double width;
double height;
double depth;
}
En este caso se define el nuevo tipo de dato Box, el cual podr ser usado para
declarar objetos del tipo Box.
Box mybox = new Box(); // crea un objeto Box llamado mybox
Expositor: Miguel Ataurima Arellano 17
Cada objeto Box contendr sus propias copias de las variables instancia width,
height y depth.
Para acceder a estas variables, se utiliza el operador punto (.).
El operador punto enlaza el nombre del objeto con el nombre de una variable
instancia.
mybox.width = 100;
Expositor: Miguel Ataurima Arellano 18
EJEMPLO: Programa que hace uso de la clase Box
01. class Box {
02. double width;
03. double height;
04. double depth;
05. }
06. // Esta clase declara un objeto del tipo Box.
07. class BoxDemo {
08. public static void main(String args[]) {
09. Box mybox = new Box();
10. double vol;
11. // asigna valores a las variables instancia de mybox
12. mybox.width = 10;
13. mybox.height = 20;
14. mybox.depth = 15;
15. // calcula el volumen de box
16. vol = mybox.width * mybox.height * mybox.depth;
17. System.out.println("El Volumen es " + vol);
18. }
19. }
BoxDemo.java
Expositor: Miguel Ataurima Arellano 19
NOTAS:
El archivo que contenga este programa deber llamarse BoxDemo.java, porque el
mtodo main( ) se encuentra en la clase llamada BoxDemo, mas no en la clase Box.
Al compilar este programa ese crearn dos archivos .class
Box.class (para la clase Box)
BoxDemo.class. (para la clase BoxDemo)
El compilador Java coloca automticamente cada clase en su propio archivo .class.
Sin embargo, no es necesario que las clases Box y BoxDemo estn en el mismo cdigo
fuente. Se puede colocar cada clase en su propia archivo, llamados Box.java y
BoxDemo.java, respectivamente.
Al ejecutar este programa se ejecutara BoxDemo.class. Y se obtendr la siguiente
salida:
El Volumen es 3000.0
Expositor: Miguel Ataurima Arellano 20
EJEMPLO: BoxDemo2.java
...
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;
...
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;
...
Observaciones
Los cambios a las variables instancia de un objeto no afectan al de las otras variables
instancia de otro.
Los datos de mybox1s data estn completamente separados de los datos contenidos en
mybox2.
Expositor: Miguel Ataurima Arellano 21
Declaracin de Objetos
Definir un objeto de una clase es un proceso de dos pasos:
Primero, se debe declarar una variable del tipo clase. Esta variable no define un objeto,
solo es una simple referencia a un objeto
Segundo, se debe adquirir un actual, copia fsica del objeto y asignrselo a la variable,
para esto se usa el operador new. new reserva espacio en memoria en forma dinmica
(esto es, en tiempo de ejecucin) para un objeto y retorna una referencia a l. sta
referencia es mas o menos, la direccin en memoria del objeto asignado por new
Sentencia Efecto
Box mybox;
mybox = new Box();
objeto del tipo Box
Primero
Segundo
// Declara un objeto del tipo Box
// Destina un objeto Box
Expositor: Miguel Ataurima Arellano 22
La Forma General de reserva dinmica de memoria para un objeto
class-var = new classname( );
donde
class-var es una variable del tipo class que est siendo creada.
classname es el nombre de la clase que est siendo instanciada.
El nombre de la clase seguido de los parntesis especifican el constructor para la clase.
Un constructor define que ocurre cuando un objeto de una clase es creado.
Expositor: Miguel Ataurima Arellano 23
Asignando variables que referencian objetos
Las siguientes sentencias
Box b1 = new Box();
Box b2 = b1;
hacen que b2 referencie al mismo objeto que b1
objeto del tipo Box
Expositor: Miguel Ataurima Arellano 24
Sin embargo, estas sentencias
Box b1 = new Box();
Box b2 = b1;
// ...
b1 = null;
Hacen que b1 se establezca en null, pero b2 sigue apuntando al objeto original
Expositor: Miguel Ataurima Arellano 25
Mtodos
Forma General
tipo nombre(lista de parmetros) {
// cuerpo del mtodo
}
donde
type especifica el tipo de dato retornado por el mtodo. ste puede ser cualquier tipo de
dato vlido incluyendo tipos clase personalizados. Si el mtodo no retorno un valor, su
valor de retorno deber ser void.
nombre, es el nombre del mtodo. ste puede cualquier identificador que no ste siendo
usado por otros items dentro del actual alcance.
lista de parmetros, es una secuencia de pares tipo-identificador separados por comas.
Los parmetros son esencialmente variables que reciben el valor de los argumentos
pasados al mtodos cuando estos son llamados. Si el mtodo no tiene parmetros,
entonces la lista de parmetros estar vaca..
Expositor: Miguel Ataurima Arellano 26
Los mtodos que tienen un tipo de retorno diferente a void, deben retornar un
valor a la rutina de llamada usando la siguiente forma de la sentencia return:
return valor;
aqu, valor es el valor retornado.
Los mtodos definen la interfaz de una clase, pues comnmente son utilizados
para acceder a las variables instancia definidas en la clase
Expositor: Miguel Ataurima Arellano 27
EJEMPLO: Aada un mtodo que no retorne algn valor, a la clase Box (BoxDemo3.java)
class Box {
double width;
double height;
double depth;
// mtodo que muestra el volumen de una caja (Box)
void volume() {
System.out.print("El volumen es ");
System.out.println(width * height * depth);
}
}
class BoxDemo3 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
...
// muestra el volumen del primer Box
mybox1.volume();
// muestra el volumen del segundo Box
mybox2.volume();
}
}
Mtodo volume( ) de la
clase Box
Invoca al mtodo volume( ) de mybox1,
es decir, llama a volume( ) relativo al
objeto mybox1
Invoca al mtodo volume( ) de mybox2,
es decir, llama a volume( ) relativo al
objeto mybox2
Expositor: Miguel Ataurima Arellano 28
EJEMPLO: Aada un mtodo que retorne un valor, a la clase Box (BoxDemo4.java)
class Box {
double width;
double height;
double depth;
// calcula y retorna el volumen
double volume() {
return width * height * depth;
}
}
class BoxDemo4 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
...
// obtiene el volumen del primer Box
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
// obtiene el volumen del segundo Box
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}
Mtodo volume( ) de la
clase Box
Invoca al mtodo volume( ) de mybox1,
y el valor retornado se le es asignado a
la variable vol
Invoca al mtodo volume( ) de mybox2,
y el valor retornado se le es asignado a
vol
Expositor: Miguel Ataurima Arellano 29
EJEMPLO: Aada un mtodo que tome parmetros, a la clase Box
(BoxDemo5.java)
class Box {
double width;
double height;
double depth;
// Calcula y retorna el volumen
double volume() {
return width * height * depth;
}
// Establece las dimensiones de un Box
void setDim(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
}
Mtodo setDim( ) de la clase
Box, que recibe tres
parmetros, w, h y d y los
asigna a las variables instancia
width, height y depth
respectivamente.
Expositor: Miguel Ataurima Arellano 30
class BoxDemo5 {
public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
// inicializa cada objeto box
mybox1.setDim(10, 20, 15);
mybox2.setDim(3, 6, 9);
// obtiene el volumen del primer box
vol = mybox1.volume();
System.out.println("El volume es " + vol);
// obtiene el volumen del segundo box
vol = mybox2.volume();
System.out.println("El volume es " + vol);
}
}
Invoca al mtodo setDim( ) de
mybox1, con los valores 10, 20 y 15.
Invoca al mtodo setDim( ) de
mybox2, con los valores 3, 6 y 9.
Expositor: Miguel Ataurima Arellano 31
Constructores
Dado que el requerimiento de inicializacin de variables instancia de una clase es
comn, Java permite a los objetos que se inicializen asimismos cuando son
creados. Esta inicializacin automtica es desarrollada a travs del uso de un
constructor.
Un constructor inicializa un objeto inmediatamente sobre su creacin.
Un constructor tiene el mismo nombre que le clase en la que reside y es
sintcticamente a un mtodo.
Una vez definido, el constructor es automticamente llamado inmediatamente
despus de que el objeto es creado, antes de que el operador new complete su
tarea.
Los constructores no tienen ningn tipo de retorno, ni siquiera void.
Expositor: Miguel Ataurima Arellano 32
EJEMPLO: Aada un constructor, a la clase Box (BoxDemo6.java)
/* Aqu Box usa un constructor para inicializar
las dimensiones de una caja
*/
class Box {
double width;
double height;
double depth;
// Este es el constructor para Box.
Box() {
System.out.println("Construyendo un Box");
width = 10;
height = 10;
depth = 10;
}
// calcula y retorna el volumen
double volume() {
return width * height * depth;
}
}
Expositor: Miguel Ataurima Arellano 33
class BoxDemo6 {
public static void main(String args[]) {
// declara, aloja en Memoria e inicializa objetos Box
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;
// obtiene el volumen del primer box
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
// obtiene el volumen del segundo box
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}
Cuando se ejecute el programa se obtendr la siguiente salida
Construyendo un Box
Construyendo un Box
Volume is 1000.0
Volume is 1000.0
Expositor: Miguel Ataurima Arellano 34
Constructores Parametrizados
EJEMPLO: Aada un constructor que tome parmetros, a la clase Box
(BoxDemo7.java)
/* Aqu, Box usa un constructor parametrizado para
Inicializar las dimensiones de un box
*/
class Box {
double width;
double height;
double depth;
// Este es el constructor para Box.
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
// Calcula y retorna el volumen.
double volume() {
return width * height * depth;
}
}
Expositor: Miguel Ataurima Arellano 35
class BoxDemo7 {
public static void main(String args[]) {
// declara, aloja en Memoria e inicializa objetos Box
Box mybox1 = new Box(10, 20, 15);
Box mybox2 = new Box(3, 6, 9);
double vol;
// obtiene el volumen del primer box
vol = mybox1.volume();
System.out.println("El volumen es " + vol);
// obtiene el volumen del segundo box
vol = mybox2.volume();
System.out.println("El volumen es " + vol);
}
}
}
La salida de este programa se muestra a continuacin:
Volume is 3000.0
Volume is 162.0
Expositor: Miguel Ataurima Arellano 36
La Palabra Reservada key
A menudo muchos mtodos necesitan referenciar a objetos que los invocan. Para
permitir esto, Java define la palabra reservada this. this puede ser usado dentro de
cualquier mtodo para referenciar al objeto actual.
Esto es, this esta siempre referenciando al ojeto desde el cual el mtodo fue
invocado.
Se puede usar this adonde sea permitida una referencia a un objeto de un tipo de
clase actualmente en uso.
Expositor: Miguel Ataurima Arellano 37
EJEMPLO:
// Un redundante uso de this.
Box(double w, double h, double d) {
this.width = w;
this.height = h;
this.depth = d;
}
Esta versin del constructor parametrizado de Box funciona exactamente igual
que su anterior versin.
En este ejemplo el uso de this es redundante, pero perfectamente correcto.
Expositor: Miguel Ataurima Arellano 38
Como se sabe, es legal en Java declarar dos variables locales con el mismo
nombre dentro del mismo alcance.
Interesantemente, se puede tener variables locales, incluyendo parmetros
formales a mtodos, cuyos nombres se solapen con el de las variables instancia
de la clase.
Cuando una variable local tiene el mismo nombre que una variable instancia, la
variable local oculta la variable instancia. Este la razn por la que width, height, y
depth no fueron usadas como nombres de los parmetros del constructor Box( )
dentro de la clase Box. Si ello hubise ocurrido, entonces width would hubiera
referenciado al parmetro formal, ocultando la variable instancia width.
Otra forma de abordar esta situacin es usando this. Como this permite
referenciar directamente al objeto, se puede usar para resolver cualquier colisin
de espacio de nombres que pudiese ocurrir entre variables instancia y variables
locales.
Expositor: Miguel Ataurima Arellano 39
EJEMPLO: Otra versin de Box(), el cual usa width, height, y depth fcomo
nombres de parmetros y luego usa this para acceder a las variables de la
instancia con el mismo nombre:
// Use this para resolver las colisiones espacio-nombre.
Box(double width, double height, double depth) {
this.width = width;
this.height = height;
this.depth = depth;
}
Expositor: Miguel Ataurima Arellano 40
La coleccin Garbage
Como los objetos son dinmicamente alojados mediante el uso del operador new,
es probable que muchos objetos sean destruidos y sus espacios reservados de
memoria liberados para posteriores reasignaciones.
En muchos lenguajes, tal como C++, los objetos alojados dinmicamente deben
ser manualmente liberados a travs del operador delete. Java toma un enfoque
distinto; ste manipula el desalojamiento en forma automtica. La tcnica que
lleva a cabo esto es llamada la coleccin garbage.
Esta trabaja as: cuando no hay referencias a algn objeto existente, se objeto es
asumido a no ser mucha necesidad, y la memoria ocupada por el objeto puede ser
recuperada. Aqu no hay una necesidad explicita de destruir objetos como en C++.
La coleccin Garbage solo ocurre espordicamente durante la ejecucin de un
programa. Esta no ocurrir simplemente cuando uno o mas objetos existentes que
no han sido usados por largo tiempo.
Adems, las diferentes implementaciones del tiempo de ejecucin de Java
tomaran varios enfoques de la coleccin garbage, pero para la mayor parte, se
debera no tener que pensar de ella mientras se escriba un programa.
Expositor: Miguel Ataurima Arellano 41
El mtodo finalize()
Permite efectuar alguna accin cuando un objeto es destruido.
El mtodo finalize() tiene la siguiente forma general
protected void finalize( )
{
// Aqu va el cdigo de finalizacin
}
donde:
protected es un especificador que previene el acceso a finalize() por cdigo
definido fuera de la clase.
Expositor: Miguel Ataurima Arellano 42
EJEMPLO: Implementacin de una clase Stack (Pila) que contenga 10 valores
enteros
class Stack {
int stck[] = new int[10];
int tos;
// Inicializa la cima de la Pila
Stack() {
tos = -1;
}
// Inserta un item a la Pila
void push(int item) {
if(tos==9)
System.out.println("Pila llena.");
else
stck[++tos] = item;
}
// Extrae un item de la Pila
int pop() {
if(tos < 0) {
System.out.println("Pila vaca.");
return 0;
}
else
return stck[tos--];
}
}
Expositor: Miguel Ataurima Arellano 43
EJEMPLO: Implementacin de una clase Stack (Pila) que demuestre el uso de la clase Stack.
sta crea dos pilas de enteros, coloca algunos valores en cada uno, y luego los retira de ellos.
class TestStack {
public static void main(String args[]) {
Stack mystack1 = new Stack();
Stack mystack2 = new Stack();
// inserta algunos nmeros en la pila
for(int i=0; i<10; i++) mystack1.push(i);
for(int i=10; i<20; i++) mystack2.push(i);
// retira los numeros de las pila
System.out.println("Pila en mystack1:");
for(int i=0; i<10; i++)
System.out.println(mystack1.pop());
System.out.println("Pila en mystack2:");
for(int i=0; i<10; i++)
System.out.println(mystack2.pop());
}
}