Saltar al contenido

¿Cómo puedo usar punteros en Java?

septiembre 22, 2021
apple touch icon@2

Todos los objetos en Java son referencias y puede usarlos como punteros.

abstract class Animal
{...
}

class Lion extends Animal
{...
}

class Tiger extends Animal
{   
public Tiger() {...}
public void growl(){...}
}

Tiger first = null;
Tiger second = new Tiger();
Tiger third;

Desreferenciar un nulo:

first.growl();  // ERROR, first is null.    
third.growl(); // ERROR, third has not been initialized.

Problema de aliasing:

third = new Tiger();
first = third;

Perdiendo Células:

second = third; // Possible ERROR. The old value of second is lost.    

Puede hacer esto seguro asegurándose primero de que no hay más necesidad del antiguo valor de segundo o asignando a otro puntero el valor de segundo.

first = second;
second = third; //OK

Tenga en cuenta que dar a second un valor de otras formas (NULL, new …) es un error potencial y puede resultar en la pérdida del objeto al que apunta.

El sistema Java lanzará una excepción (OutOfMemoryError) cuando llama a new y el asignador no puede asignar la celda solicitada. Esto es muy raro y generalmente es el resultado de una recursión de fuga.

Tenga en cuenta que, desde el punto de vista del lenguaje, el abandono de objetos al recolector de basura no son errores en absoluto. Es algo que el programador debe conocer. La misma variable puede apuntar a diferentes objetos en diferentes momentos y los valores antiguos se recuperarán cuando ningún puntero haga referencia a ellos. Pero si la lógica del programa requiere mantener al menos una referencia al objeto, provocará un error.

Los novatos suelen cometer el siguiente error.

Tiger tony = new Tiger();
tony = third; // Error, the new object allocated above is reclaimed. 

Lo que probablemente quisiste decir fue:

Tiger tony = null;
tony = third; // OK.

Casting inadecuado:

Lion leo = new Lion();
Tiger tony = (Tiger)leo; // Always illegal and caught by compiler. 

Animal whatever = new Lion(); // Legal.
Tiger tony = (Tiger)whatever; // Illegal, just as in previous example.
Lion leo = (Lion)whatever; // Legal, object whatever really is a Lion.

Punteros en C:

void main() {   
    int*    x;  // Allocate the pointers x and y
    int*    y;  // (but not the pointees)

    x = malloc(sizeof(int));    // Allocate an int pointee,
                                // and set x to point to it

    *x = 42;    // Dereference x to store 42 in its pointee

    *y = 13;    // CRASH -- y does not have a pointee yet

    y = x;      // Pointer assignment sets y to point to x's pointee

    *y = 13;    // Dereference y to store 13 in its (shared) pointee
}

Punteros en Java:

class IntObj {
    public int value;
}

public class Binky() {
    public static void main(String[] args) {
        IntObj  x;  // Allocate the pointers x and y
        IntObj  y;  // (but not the IntObj pointees)

        x = new IntObj();   // Allocate an IntObj pointee
                            // and set x to point to it

        x.value = 42;   // Dereference x to store 42 in its pointee

        y.value = 13;   // CRASH -- y does not have a pointee yet

        y = x;  // Pointer assignment sets y to point to x's pointee

        y.value = 13;   // Deference y to store 13 in its (shared) pointee
    }
} 

ACTUALIZAR: como se sugiere en los comentarios, se debe tener en cuenta que C tiene aritmética de punteros. Sin embargo, no tenemos eso en Java.

close