Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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对C++;_Java - Fatal编程技术网

Java对C++;

Java对C++;,java,Java,Java和C/C++之间最大的区别是Java具有 消除重写内存可能性的指针模型 以及破坏数据 这是教科书上的一句话。我一直认为C++是使用指针而不是java。有人能详细说明一下吗?他们都使用指针 在C++中,指针是实际的内存地址,意思是可以使用一个(通过指针算术)来识别任意的内存位置。 在Java中,指针是不透明的:知道一个指针的值,除了它指向的对象之外,不会给你任何其他信息。C++使用指针/引用,获取和释放动态内存分配是程序员的责任。 Java在内部也会这样做,但为了跟踪内存,Java使用了一

Java和C/C++之间最大的区别是Java具有 消除重写内存可能性的指针模型 以及破坏数据

这是教科书上的一句话。我一直认为C++是使用指针而不是java。有人能详细说明一下吗?

他们都使用指针

在C++中,指针是实际的内存地址,意思是可以使用一个(通过指针算术)来识别任意的内存位置。
在Java中,指针是不透明的:知道一个指针的值,除了它指向的对象之外,不会给你任何其他信息。

C++使用指针/引用,获取和释放动态内存分配是程序员的责任。 Java在内部也会这样做,但为了跟踪内存,Java使用了一个引用计数,最简单的说法就是邪恶的垃圾收集器!
java隐藏程序员和C++的指针,这并不能使C++变得更强大,而且也很危险。在java中,你不能在栈上分配用户定义的对象(只有int等的原语),但是在C++中,你可以使用<代码>新的< /Cord>关键字在堆或栈上分配用户定义的对象。java中的< /p> 是引用。因此,您可以创建一个变量的任意多个别名,如果您更新其中任何一个别名,它将反映在所有别名变量中


另一方面,C++有指针和引用两者。 我反对在描述Java程序时使用“指针”一词。我总是说“对象引用”(或者只是“引用”)来代替

一个指针,用C或C++表示进程的虚拟地址空间中的位置,而虚拟地址空间基本上是一个巨大的无类型数组。给定一个指针,可以向其添加偏移量,并获取指向数组中不同位置的指针。给定两个指针,可以计算它们之间的偏移量

对于Java对象引用,您无法执行任何操作。Java对象引用标识堆上的对象。该对象的地址可以(也可能确实)随时更改,但其标识始终是唯一的

不能向对象引用“添加偏移”并获取其他对象引用。它没有任何意义。

Javas的“参考系统”是它的指针系统。它们基本上是指针,不可能强制转换到不兼容的类型。它也不允许你使用指针运算,像C和C++一样。在C++中,可以通过:

破坏数据。
class SomeClass {
private:
    int a;
public:
    SomeClass(int a): a(a) {}
};
稍后,您可以通过以下方式损坏类的对象:

SomeClass victim(2);
unsigned char *hazardousPointer = (unsigned char *) &victim;
for (int i = 0; i < sizeof(SomeClass); i++)
    hazardousPointer[i] = 0;
SomeClass受害者(2);
无符号字符*危险指针=(无符号字符*)&受害者;
for(int i=0;i
这段代码只允许我们违反
私有
访问权限并允许更改其状态(也可以是
常量
,这无关紧要)。发生这种情况的原因是,C/C++指针只是内存地址,其行为类似于带有某些限制的整数。此外,
hazardousPointer[i]
只是对
*(hazardousPointer+i)
的C/C++语法建议,这与Java不同,Java中的数组是对象,甚至可以从方法返回,并且有自己的方法


此外,java有一个垃圾收集程序,它负责内存泄漏,C++依赖于它的系统栈和包装器,或者./P>当然java有指针;否则,您将如何获得NullPointerException?这本书说Java有一个指针模型,而不是一个纯指针!英语中的model一词表示一种表示。你不能创建直接指针,尽管在整个实现过程中都有指针。主要区别在于,在Java中,你不能对指针进行算术运算。这本书的意思是解释使用引用的概念,这两种语言都允许你管理它,Java不允许对指针进行算术运算……Java(因为这个词至少在C++中使用),它有引用。JVM可能在其实现中使用指针,但是“指针”实际上不是java语言本身的概念。(是的,我知道,“指针”这个词。出现在

NullPointerException
类的名称中,但在我看来,这只是Java中许多未经原作者深思熟虑的名称之一。)
NullReferenceException
会更好。大多数JVM不使用引用计数垃圾收集器。这就是我用“最简单的术语”陈述的原因这意味着在使用引用计数时可以理解垃圾收集。我也同意你的答案。虽然它在其使用术语中称为NullPointerException。在我看来,它只是意味着没有赋值,这与C/C++管理它的方式不同。在C/C++中,如果你通过指针知道内存,你可以直接访问内存,但你不能这样做Java中的at。因为您永远不知道内存地址,这将归结为为什么Java使用按值传递和从不按引用传递的概念。@Acewin,按值传递和按引用传递的问题与语言是否具有C风格指针无关。更新不会反映在“别名变量”中基本类型的。