在C+中声明对象+;vs java 我已经用C++了,我正在学习java,

在C+中声明对象+;vs java 我已经用C++了,我正在学习java,,java,c++,new-operator,Java,C++,New Operator,用java声明对象让我很困惑 我们用java编写 myclass myobject = new myclass(); myobject.mymethod(); 与C++中的代码相同吗? myclass *myobject = new myclass(); myobject->mymethod(); i、 e是在堆上分配的内存吗?如果它在堆上,为什么我们永远不会释放内存。我相信新的关键词是一样的。 如果是这样,我们如何在堆栈上分配内存 与C++中的代码相同吗? myclass *myob

用java声明对象让我很困惑

我们用java编写

myclass myobject = new myclass();
myobject.mymethod();

与C++中的代码相同吗?

myclass *myobject = new myclass();
myobject->mymethod();
i、 e是在
堆上分配的内存吗?如果它在堆上,为什么我们永远不会释放内存。我相信新的关键词是一样的。

如果是这样,我们如何在堆栈上分配内存

与C++中的代码相同吗?

myclass *myobject = new myclass();
myobject->mymethod();
对。都一样

i、 内存是在堆上分配的吗

是的

如果它在堆上,为什么我们永远不会释放内存

当对象不再可访问时,允许它访问垃圾收集器。i、 e当没有对该对象的有效引用或(取消引用)


如果是这样,我们如何在堆栈上分配内存


当特定的线程执行开始时,与该线程相关的变量将被放置在堆栈上,并在该线程的作业完成后立即删除。每个线程都有自己的堆栈。

正如您所想,
new
操作符在堆上分配一个新对象。Java中的内存不会被显式释放——一旦对象不再具有访问根,它就有资格被释放。垃圾收集线程会周期性地释放此内存。

但如果说此
C++
代码是等效的,这并不是不准确的:

myclass* myobject = new myclass();
myobject->mymethod();
这也不完全一样

Java有一个垃圾收集器,因此,正如您所注意到的,您不必在
Java
中释放对象

因此,与原始
Java
更接近的可能是:

std::shared_ptr<myclass> myobject = std::make_shared<myclass>();
myobject->mymethod();
这样,在保持垃圾收集智能指针的安全性和便利性的同时,不会损失任何效率


参见:

在阅读了这个问题的其他答案和其他一些文章后,我明白了

< C++和java代码都做了非常相似的事情,除了语法不同,java使用引用而不是指针(java没有指针)。 这里,

myclass-myobject是myobject的声明

声明只是通知编译器我们将使用myobject引用类型为myclass的变量。它没有分配内存

newmyclass()正在实例化对象(在堆中分配内存)并返回对该对象的引用。
它还通过调用构造函数myclass()初始化对象

澄清一个非常基本的疑问

inti=>声明对象并在堆栈中为其分配内存

myclass-myobject=>仅声明对象的引用变量(它还需要4个字节或8个字节,具体取决于系统)。它不分配实例变量存储的实际内存

换句话说,在为基本数据类型而不是非基本数据类型声明时分配内存。对于非基本数据类型,我们需要使用new关键字分配它们

为什么我们从不释放记忆

Java有一个垃圾收集器,它可以自动为我们做这件事

我们如何为堆栈中的对象分配内存


我们不能。堆栈中只能存储基本数据类型。

new关键字返回指向堆中已分配内存的指针,对吗?但是java中没有指针…但是C++中的引用是不同的。我仍然不明白new关键字在做什么,以及如果总是在堆中分配内存,为什么需要调用new。“我们如何在堆栈上分配内存?”——在Java中,您不能(除了基本类型)。