首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不了解java中对象的作用域(java新手混淆)

不了解java中对象的作用域(java新手混淆)
EN

Stack Overflow用户
提问于 2013-07-15 13:15:47
回答 8查看 5.5K关注 0票数 7

这个问题是基于 This in Java第2版第109页中的 scope of object 一章,它说当我们使用创建一个对象时,它会在超出范围的时候挂起。它给出了这个例子:

代码语言:javascript
复制
{ 
  String s = new String("a string"); 
} /* end of scope */ 

然后它会说,

引用的在作用域的末尾消失。但是,s所指向的String对象仍然占用内存。在这段代码中,无法访问对象,因为对它的唯一引用超出了作用域。

因此,如果我理解正确的话,文本"a string“仍然在内存中,但是具有第一个字符'a‘的内存地址的指针并不存在。这就是它的意思吗?

它接着说,

事实证明,因为用

创建的对象可以在你想要的时间内一直存在,所以在C++中,一大堆Java编程问题都会消失。

为什么这会是有利的?在上面的例子中,字符串数据继续驻留在内存中,没有办法访问它(因为指针在它超出范围后被销毁),这只会消耗资源。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-07-15 13:19:32

一旦Object超出scope,它将准备好进行垃圾收集,直到GC收集分离的对象,它将占用内存。

票数 2
EN

Stack Overflow用户

发布于 2013-07-15 13:30:41

简单地说,段中引用变量s的作用域:

代码语言:javascript
复制
{ 
  String s = new String("a string"); 
} /* end of scope */ 

在花括号之间。这意味着s只存在于开始和结束{ }之间。然而,在该块中发生了一些事情。

在大括号内,调用new操作符来创建String对象的实例。将为对象分配内存,并将对该对象的引用分配给变量s

在代码块的末尾,s不再存在,因此它持有的引用也不再存在。但是,String对象仍然存在于内存中。但是,由于不再有任何变量保存对它的引用,因此程序的任何部分都不能再访问它。此时,该对象符合垃圾回收的条件。

在对象被垃圾回收之前,它仍然占据系统内存中的一席之地,即使程序不再能够访问它。

票数 3
EN

Stack Overflow用户

发布于 2013-07-15 13:29:57

翻到第215页,了解垃圾收集器是如何工作的。

在Java代码运行时,垃圾收集器会定期运行,以查找未被引用的所有对象,并释放它们所占用的内存。发生这种情况时,将在对象上调用finalize方法(如果已定义)。此时,您可以执行对象所需的任何清理。

使用c++时,您必须担心使用delete关键字自行释放内存-否则会导致内存泄漏。

使用Java,您可以用内存分配管理来换取托管对象生命周期管理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17647194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档