我如何在Java中使用指针?

我知道Java没有指针,但我听说可以用指针创建Java程序,并且这可以由少数几个java专家来完成。 这是真的吗?


Java中的所有对象都是引用,你可以像指针一样使用它们。

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;

解引用null:

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

别名问题:

third = new Tiger();
first = third;

失去细胞:

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

您可以通过首先确保不再需要第二个旧值或将另一个指针指定为第二个值来确保安全。

first = second;
second = third; //OK

请注意,以其他方式给予第二个值(NULL,new ...)与潜在错误一样多,并可能导致丢失指向的对象。

当您调用new并且分配器无法分配请求的单元时,Java系统将抛出异常( OutOfMemoryError )。 这是非常罕见的,通常由失控递归引起。

请注意,从语言的角度来看,将对象放弃到垃圾收集器根本不是错误。 这只是程序员需要注意的事情。 同一个变量可以在不同的时间指向不同的对象,当没有指针引用它们时,旧的值将被回收。 但是,如果程序的逻辑需要至少保持一个对象的引用,它将导致错误。

新手经常会出现以下错误。

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

你可能想说的是:

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

铸造不当:

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.

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
}

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
    }
} 

更新:如评论中所建议的,必须注意到C具有指针算术。 但是,我们在Java中没有。


Java确实有指针。 每当你用Java创建一个对象时,你实际上就是在创建一个指向该对象的指针; 这个指针可以被设置为一个不同的对象或为null ,并且原始对象将仍然存在(等待垃圾回收)。

Java不能做的是指针算术。 您不能取消引用特定的内存地址或增加指针。

如果你真的想要低级别,唯一的方法就是使用Java Native Interface; 即使如此,低级部分也必须用C或C ++来完成。


由于Java没有指针数据类型,所以不可能在Java中使用指针。 即使是少数专家也无法在java中使用指针。

另请参阅Java语言环境中的最后一点

链接地址: http://www.djcxy.com/p/5409.html

上一篇: How can I use pointers in Java?

下一篇: Why is memory allocation on heap MUCH slower than on stack?