Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java有指针吗?_Java_Pointers - Fatal编程技术网

Java有指针吗?

Java有指针吗?,java,pointers,Java,Pointers,如果Java没有指针,那么new关键字在Java中有什么作用?Java有变量意义上的指针,这些变量在内存中存储对数据的引用。Java中对象类型的所有变量都是这种意义上的指针 但是,Java语言不允许对指针的值进行算术运算,就像在C语言中一样。new在Java中返回对新创建对象的引用。new返回引用。它与指针有一些相似之处(如果传递给函数,则传递引用,与指针相同),但没有指针算术。Java有引用。所有对象都是通过引用其实例来访问的。您可以使用new创建一个新实例,该实例返回对对象的引用 Java引

如果Java没有指针,那么
new
关键字在Java中有什么作用?

Java有变量意义上的指针,这些变量在内存中存储对数据的引用。Java中对象类型的所有变量都是这种意义上的指针


但是,Java语言不允许对指针的值进行算术运算,就像在C语言中一样。

new
在Java中返回对新创建对象的引用。

new返回引用。它与指针有一些相似之处(如果传递给函数,则传递引用,与指针相同),但没有指针算术。

Java有引用。所有对象都是通过引用其实例来访问的。您可以使用
new
创建一个新实例,该实例返回对对象的引用


Java引用与C中的指针不同,您不能“查看”组成对象的原始内存。

正如前面指出的,Java有引用。这些有什么不同

  • 不能对这些对象执行算术或其他类似操作
  • 它们不指向包含对象的内存(即,它们不是另一个名称的指针)。JVM可以自由地在VM内存中移动对象,并且很可能在垃圾收集期间这样做。然而,尽管对象在内存中移动,引用仍然指向该对象

  • <>它们不是C++引用(直接指向对象)。也许更好的名称应该是handle。

    Java没有指针。在java中,运算符“new”用于引用变量。

    在java中,我们遇到某些用作引用的关键字,例如
    关键字用于引用同一类的变量。运算符new用作对象的引用。

    new
    大致执行以下操作:

  • 找到一个连续的空闲堆内存块,该内存块等于您正在创建的类的实例大小,加上一些簿记空间
  • 将空间归零并将其从可用列表中删除
  • 运行构造函数
  • 返回对所创建实例的引用(不是指针,正如其他帖子所解释的)

  • Java没有指针;Java有引用

    这是一个很好的点,但指针有额外的操作,您可以(也可以不使用)通常使用;引用缺少这些操作,因为这些操作可能不安全

    例如,如果使用指针索引数组的第一个元素,如下所示:

    int squares[] = {1, 4, 9, 16, 25, 36, 49};
    int* intPointer = squares;
    
    您可能希望取消对指针的引用并获取值“1”,但也可以:

    intPointer++
    
    这样做之后,当你取消引用指针时,你会得到值“4”。一秒钟

    intPointer++;
    
    当取消引用时,将为您提供值“9”。这是因为++操作将指针在内存中向前移动了一个“单位”

    这个问题来自C/C++类型检查系统的弱点(C++必须与C保持相容性,所以允许相同的问题)。指针将地址存储在内存中,++操作将适当的字节数添加到地址中。在许多系统上,++ing一个int加上四个字节,但是如果指针是char指针,++ing它应该只加一个字节。请注意,由于指针的基础数据类型是内存中的地址,因此以下内容是合法的(但不推荐):

    由于指针是内存中的地址,它们可能(正确地)表示计算机中的任何内存位,但只有在底层数据改变指针的类型和对齐方式时,才会正确地解除对它们的引用。对于那些不能由大量代码管理以确保安全的指针,这意味着您可能会偏离所需信息的数据类型(或对齐方式),取消引用可能会导致灾难。试图用自定义代码修复此问题往往会严重降低一个指针的速度,使您注意到性能问题,这为在自定义“指针管理”代码中添加错误打开了大门

    Java端通过返回引用来解决所有这些问题。引用不引用内存中的任何位置;Java维护一个内部“指针引用”表。此表获取引用并返回与之关联的数据,无论这些数据位于内存中的何处。这会降低代码执行速度,因为每次“取消引用”都会进行两次查找,一次在引用表中查找,一次在机器内存中查找

    使用引用的Java的一大优点是,可以在不破坏可能的指针地址的情况下移动内存。在C程序中,如果将数据移动到新的内存位置,则很难知道程序的其他部分是否有指向该数据的指针。如果在移动内存后取消对过时指针的引用,程序将访问损坏的数据,通常会出现崩溃

    在运行的程序中移动内存的能力允许程序轻松地回收内存。任何不需要内存块的程序都可以释放未使用的内存,但这会在已使用内存块之间创建未使用内存的内存孔。计算机内部使用相当大的内存页。如果一个很少使用的内存页可以将少量使用的位移到另一页中,那么一页内存就可以被释放。这增加了数据到内存的密度,提高了缓存性能。有时,这会转化为相当显著的性能改进

    Java的垃圾收集器通过临时阻止对一组引用的数据的访问来利用引用的使用。在访问阻塞期间,它会移动数据(以压缩数据)。阻塞后,对地址表的引用具有新的内存地址。由于代码的“功能”层从一开始就不知道地址,因此此操作不会中断正在运行的Java程序

    char* charPointer = squares;
    charPointer++;
    
    void* voidPointer = squares;
    voidPointer++;
    
    public class TestPointers {
    
        public static void main(String args[]) {
            Object p1, p2;
            p1 = new Object();
            p2 = p1;
            p1 = null;
            System.out.println(p2);
        }
    }