对象的作用域

Java对象不具备与主类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。所以假若使用下面这段代码:

{
String s = new String("a string");
} /* 作用域的终点 */

那么句柄s会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法访问对象,因为指向它的唯一一个句柄已超出了作用域的边界。在后面的章节里,大家还会继续学习如何在程序运行期间传递和复制对象句柄。
这样造成的结果便是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。看来在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,根本无法确定它们是否可用。而且更麻烦的是,在C++里,一旦工作完成,必须保证将对象清除。
这样便带来了一个有趣的问题。假如Java让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。在C++里,这个问题最令程序员头痛。但Java以后,情况却发生了改观。Java有一个特别的“垃圾收集器”,它会查找用new创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在C++里很常见的一个编程问题:由于程序员忘记释放内存造成的“内存溢出”。

时间: 2024-08-22 14:42:30

对象的作用域的相关文章

深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解_基础知识

函数表达式 1.JavaScript中定义函数有2钟方法: 1-1.函数声明: 复制代码 代码如下: function funcName(arg1,arg2,arg3){  //函数体} ①name属性:可读取函数名.非标准,浏览器支持:FF.Chrome.safari.Opera. ②函数声明提升:指执行代码之前会先读取函数声明.即函数调用可置于函数声明之前. 1-2.函数表达式: 复制代码 代码如下: var funcName = function(arg1,arg2,arg3){  //函

王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包

转载请注明出处:王亟亟的大牛之路 本来打算把工作的事周末做掉点,但是发现在外面浪并不能迅速集中投入,为了避免不必要的BUG 还是明天在家做吧,那么久写一篇Python的文章吧,毕竟背着Mac出门不做些太对不起自己的肩膀了 废话不多,直接说内容,这篇文章的内容大致是围绕"闭包"走的,介绍下相关理论知识 作用域:对象有其存活的范围 闭包:内部函数可以引用外部函数的参数和局部变量(是不是听得云里雾里的,没事 看例子就明白了) 就像循环内声明的对象,除了循环也就无法获取他的值一样.就像在jav

(第一天)包装对象、作用域、创建对象

基本概念以及注意  直接量 :程序中直接使用的数据值.下面列出的都是直接量: 1 12 //数字 2 1.2 //小数 3 "hello world" //字符串文本 4 true //布尔值 5 /javascript/gi //正则表达式直接量  标识符 :必须以字母.下划线(_)或美元符($)开始   可选的分号 :如下代码 (1) 1 a = 3; /*两条语句分两行写,第一个分号可以省略*/ 2 b = 4;  a = 3; b = 4; 第一个分号则不能省略掉 (2) 1

问一下static对象的作用域

问题描述 在一个解决方案中,在其中一个项目,比如comomon类中定义了一个static对象obj,然后在解决方案的A项目中调用了这个类,给obj赋值然后在解决方案的B项目中获取这个obj,能获取到A项目的赋值吗?如果在C项目中lock这个obj,对其他项目又影响吗?项目ABC都是类库然后在项目D(winform或者web)使用 解决方案 解决方案二:在解决方案的B项目中获取这个obj,能获取到A项目的赋值吗?能如果在C项目中lock这个obj,对其他项目又影响吗?lock是针对跨线程的其他lo

Java对象的生命周期与作用域的讨论(转)

导读: Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间.由此,我们可以看出,只有T2是真正有效的时间,而T1.T3则是对象本身的开销.下面再看看T1.T3在对象的整个生命周期中所占的比例. 我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用.另外,默认情况下,调用

详解JSP的九大内置对象及四个作用域教程

九大内置对象 内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用 1-out: javax.servlet.jsp.JspWriter类型,代表输出流的对象.作用域为page(页面执行期) request:javax.servlet.ServletRequest的子类型,此对象封装了由WEB浏览器或其它客户端生成地HTTP 请求的细节(参数,属性,头标和数据).作用域为request(用户请求期). 方法由可查看API response:javax.ser

&#106avascript技术讲座-基于对象的&#106avascript语言

对象 JavaScript语言是基于对象的(Object-Based),而不是面向对象的(object-oriented).之所以说它是一门基于对象的语言,主要是因为它没有提供象抽象.继承.重载等有关面向对象语言的许多功能.而是把其它语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统. 虽然JavaScript语言是一门基于对象的,但它还是具有一些面向对象的基本特征.它可以根据需要创建自己的对象,从而进一步扩大JavaScript的应用范围,增强编写功能强大的Web文文件. 一.对象的

javascript中的对象

JavaScript语言是基于对象的(Object-Based),而不是面向对象的(object-oriented).之所以说它是一门基于对象的语言,主要是因为它没有提供象抽象.继承.重载等有关面向对象语言的许多功能.而是把其它语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统. 虽然JavaScript语言是一门基于对象的,但它还是具有一些面向对象的基本特征.它可以根据需要创建自己的对象,从而进一步扩大JavaScript的应用范围,增强编写功能强大的Web文档. 一.对象的基础知识

关于类对象的析构问题

我们按照正常的思路,来探讨一下这个问题. 首先是定义一个类,这里就不说明了. 然后是创建类的对象(实例化一个类),一般有两种方法:常规创建的方法和动态创建的方法.见代码事例: // 定义类 class A { public: ~A(); }; A::~A() { cout<<"析构"<<endl; } void main() { A a; // 常规创建的方法 A *p = new A; // 动态创建的方法 } 何时析构? (1)常规创建的方法就像我们创建一个