Documentos de Académico
Documentos de Profesional
Documentos de Cultura
05 MetodosClase PDF
05 MetodosClase PDF
Métodos constructores
Tal y como dice su nombre, son los que construyen los objetos, es decir, les dan los valores
iniciales a sus atributos. Todas las clases tienen constructores por default. Por ejemplo:
class Objeto{
int a = 0;
int b = 0;
}
Implícitamente tiene el método constructor que inicializa las variables que están declaradas.
class Objeto {
int a;
int b;
public Objeto(){
a = 0;
b = 0;
}
}
class Objeto {
int a;
int b;
public Objeto(){
a = 0;
b = 0;
}
Implícitamente tendríamos
Si tuviéramos:
Siempre se construirá primero lo del objeto padre, luego las variables de clase y por ultimo lo
que este dentro del método constructor.
Los métodos constructores son básicamente métodos que regresan valores. En este caso, seria
la referencia del objeto construido.
Cuando se encuentra la palabra new, es cuando debemos inicializar nuestro, lo primero que
hacemos es enviar la referencia null al constructor, luego si hubiera más parámetros, también
los preparamos en la pila.
Suponiendo esto:
Ahora dentro del método constructor, hacemos tres pasos principales para la creación del
objeto:
Verificar
Direccionar
Reservar memoria
void MyLinkList_New(){
t100 = ptr + 0; //obtenemos la dirección de la referencia
t101 = stack[t100]; //obtenemos el valor de la referencia
if(t101 == -1)goto L100; //verificamos si es null
goto L101;
L100:
stack[t100] = ptrM; //si es null direccionamos
ptrM = ptrM + 2; //y luego reservamos
L101:
//demás código
Métodos de clase y variables estáticas
Organización de lenguajes y compiladores 2
Aux. Oscar Estuardo de la Mora
¿Porque verificamos si la referencia es null? Un objeto puede que tenga clases hijas, si las hay
estas llamaran a los constructores padres. Cuando esto sucede, no se inicializa la referencia
con null, entonces no es necesario direccionar ni reservar, pues se esta modificando el mismo
objeto.
Si fuera null, quiere decir que no hay un objeto creado, y necesita un lugar donde alojarse,
para esto direccionaremos con ayuda de nuestra variable ptrM. Guardaremos en la posición de
la referencia el valor de ptrM (este valor se regresara mas tarde a la instancia donde se esta
creando el objeto), pues este nos indica el siguiente lugar en el Heap que esta libre para
alojarlo.
Luego tenemos la reserva de memoria, en este paso vamos a desplazar la variable ptrM tantas
posiciones como tamaño tenga el objeto, en este caso es de tamaño 2.
Métodos de clase
Estos son los que definen el comportamiento de los objetos, se definen dentro de las clases y
se diferencian de los métodos estáticos porque llevan una variable extra, que es la referencia
del objeto mismo.
class Objeto{
int a;
int b;
public void setA(int z){
this.a = z;
}
}
Para pasar los parámetros se usa el mismo método como con métodos estáticos y/o
constructores, pero primero siempre vamos a preparar la variable que identifica al objeto y
luego pasaremos los demás valores al ámbito del método setA(int).
Si tuviéramos la instrucción:
obj2.setA(10);
Variables estáticas
Estas variables se llaman de este modo porque tienen una dirección de memoria definida,
estas se inicializan al iniciar el programa y se colocan en el stack de memoria. Si por ejemplo
tuviéramos:
class Clase1{
public static int var1 = 0;
public static int var2 = 0;
}
class Clase2{
Métodos de clase y variables estáticas
Organización de lenguajes y compiladores 2
Aux. Oscar Estuardo de la Mora
void init(){
stack[0] = 0;
stack[1] = 0;
stack[2] = 2;
stack[3] = -1;
ptr = ptr + 4;
}
Métodos de clase y variables estáticas
Organización de lenguajes y compiladores 2
Aux. Oscar Estuardo de la Mora
Debemos tener muy en cuenta que cuando se crean objetos, las variables estáticas que están
declaradas dentro de la clase no van dentro del objeto en el Heap. Es porque no son miembros
de la clase, si quisiéramos acceder a la variable, no necesitamos la dirección de memoria del
objeto, solo saber a que clase pertenece.
Si tuviéramos
El tamaño del objeto es tres, pues la variable ‘c’ es estática y se encuentra al principio del stack
de memoria. Si por ejemplo:
ej.c = 5;
print(ej.c);
Nos desplegara ‘7’, pues se esta modificando la misma variable. El hacer estas instrucciones
son equivalentes a escribir:
print(Ejemplo.c);
Para poder usarlas a bajo nivel, tenemos almacenada la dirección de memoria en la tabla de
símbolos.
a = Ejemplo.c;
t1 = stack[0];
t1 va a guardar el valor de la variable estática para luego pasar el valor a la variable ‘a’. Si
tuviéramos otra variable estática y la llamáramos:
b = Ejemplo.x;
Suponiendo que esta continua a la variable ‘c’, tendríamos como código intermedio:
t5 = stack[1];
Debemos recordar siempre desplazar la variable ptr tantos espacios como variables estáticas
tengamos en nuestro programa. Si no lo hacemos, corromperíamos las variables estáticas y
tendríamos un serio error en la implementación del lenguaje.