初始化和清理,是一个生命周期的起始。在java中,对象的初始化和对象的回收是怎样的呢?

  在开发c++的时候,有构造器的概念。即对象的创建,首先默认调用构造器进行初始化。在java中也有“构造器”。java对象的创建与初始化是捆绑在一起的,在对对象创建的同时,对对象进行初始化设置。在编写构造方法的时候,假如不写构造方法,则会系统使用默认的无参构造方法。但是如果你自己有定义构造方法了,那系统就不会帮你做了。这里有一个小tips,在写构造方法的时候没有返回值。是“没有返回值”,而不是返回值为空。那又有什么区别呢?返回值为空,只是返回值为空而已(@-@),它也能返回其他值。但是没有返回值就是不能返回任何值。

  这里,我们跳到方法的重载。我们知道,方法的重载是通过参数的不同来区别的,不是通过返回值。那为什么不能通过返回值呢?举个栗子,假如你的方法功能不需要返回值,根本不care返回值,那你怎么区别不同的方法呢?只能通过参数啦。所以……你懂。

  我们再说说java中的this指针。this指针的定义是“调用方法的那个对象”。只能用于方法的内部,表示正在调用这个方法的对象。其实我一直对这个this的体会不会很清晰,但是可以换一个思路,那就好想多了。我们知道,对象的生成后被存储在堆中。我们可以把一个个在堆中的对象想象成一个个箱子。不同的箱子去调用同一个方法,我总要知道到底是哪个箱子调用的啊?那就用this表明。(不知道这样说是不是更好理解……)。当然this也能作为一个对象返回,返回当前对象。

  有this指向对象本身,那也有不含this的。那就是static。作为“类全局”方法,static方法内部不能调用非静态方法(当然啦,一个非this的怎么能调用一个需要this对象的方法呢)。

  好,现在我们说到垃圾的回收(GC)。

  在java中,经常被大家提起的就是垃圾回收机制。我们知道,垃圾回收机制通过软指针来监控每个对象,判断对象受否为空,后面不会再使用,对无用的对象自动回收,释放内存。当然,这一切都是GC自动处理,程序员无法控制。如果非要在释放时程序员要做一些事情,那就用finalize()方法。但是这个也是“建议”GC这样做,真正做还是要GC自己决定。因此有的对象可能不被垃圾回收。因为GC的唯一目的是回收不需要再使用的内存,因此你的finalize的作用必须是做内存回收。那什么情况下用finalize方法呢?如果你的程序内存申请除了new以外,还进行了混编,用了c/c++的内存申请方法,那就要在finalize中明确释放。 所以说java的垃圾回收和其他语言的析构函数是不一样的。

  对于垃圾回收器如何工作的,这里简单说一下。首先是在java的对象存储中,将所有对象存放在堆,其实速度是比较快的,因为java通过堆指针进行内存的分配,可以快速进行对象的分配、存储。JVM在实现垃圾回收机制时,采用自适应的垃圾回收技术。不同的java虚拟机,其实实现机制不一样。一类是停止-复制方式,就是先暂定程序运行,再把存活的对象复制到另一块新堆。一种是标记-清扫机制。就是从堆栈和静态存储区出发,遍历所有引用。堆存活的对象进行标记,标记结束后释放没有标记的对象,再重新整理不连续的内存。

  在对成员的初始化时,java会自动对其进行初始化赋值,且不能阻止。就算后面对那个变量进行赋值,系统也要先初始化赋值。但是对于静态变量和非静态的还是有点不一样的。一般的非静态变量,在运行后会进行初始化。但是静态数据成员在需要使用的时候才会初始化。比如说一个类里面,有静态和非静态的。new一个该类的对象,会先初始化静态变量,再初始化非静态变量。

  哈哈,当我看第五章觉得后面没有什么看的了时候,发现了一个彩蛋——可变参数列表。这个平时还真没用过。怎么用呢?其实就是当你的方法要传入的参数的个数不知道有几个,更或者不知道要传什么类型的参数的时候,可以用这个。

  

//什么都不知道
void test(Object... args)
{
for(Object obj : args)
{ System.out.print(obj+ "");
}
} //指定参数类型
void test(interger... args)
{
for(Object obj : args)
{ System.out.print(obj+ "");
}
}

  其实这种用法,个人感觉虽然很方便,但是也不应该滥用吧,可能会让程序变的比较乱,不清晰,只能在特定的小范围使用。因为java的自动装箱,所以可以在调用的时候直接用基本类型。因为所有的类型都是继承的object,因此都能用。 

  最后,我们说说java SE5的新类型枚举,enum。和switch一起使用更配哦。

  

大家一起和snailren学java-(四)初始化与清理的更多相关文章

  1. Java的初始化与清理

    大家都知道,Java是站在巨人的肩上成功的,它是在C&C++的基础上进一步的开发,投入面向对象开发的怀抱.Java吸取了很多以前的教训,加入自己很多独创的方式.在程序语言发展初期,许多C程序员 ...

  2. Chapter5_初始化与清理_用构造器初始化

    接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...

  3. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  4. .net基础学java系列(四)Console实操

    上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...

  5. 重学 Java 设计模式:实战单例模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...

  6. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  7. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...

  8. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...

  9. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

随机推荐

  1. 【转载】Debian/Ubuntu常见安装软件错误解决方案

    转载自:http://blog.csdn.net/eqera/article/details/6375293 1.错误: Can't find X includes. Please check you ...

  2. cart中回归树的原理和实现

    前面说了那么多,一直围绕着分类问题讨论,下面我们开始学习回归树吧, cart生成有两个关键点 如何评价最优二分结果 什么时候停止和如何确定叶子节点的值 cart分类树采用gini系数来对二分结果进行评 ...

  3. thread_LockSupport

    LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...

  4. C#设计模式——策略模式(Strategy Pattern)

    一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...

  5. Jquery:ajax跨域请求处理

    昨天朋友想做个图片懒加载的效果,朋友是前端的,我这边给他提供数据,程序写好了放到服务器上,本地测试访问时却报jquery跨域的问题,于是找度娘了解了一下jquey如何处理,网上有很多参考文章,但没细看 ...

  6. 关于IIS寄宿WCF服务,客户端不能生成代理类

    我在使用VS2010写好WCF的Web服务后,部署在IIS7.0上,可以在IE9上进行访问,并且能显示XML数据,如下图 然后我在项目的客户端进行服务的添加引用,如下图 VS2010自动生成代理类,但 ...

  7. 【C#进阶系列】00 序

    老早就被各种推荐<CLR via C#>这本书了,然而一直没去学. 因为工作中所需要的.NET功底目前算是足以应付了,而前端却不熟,所以跑去学了一段时间前端的知识. 终于算是把前端方面的基 ...

  8. JPA(5)使用二级缓存

    jpa的缓存分为一级缓存和二级缓存,一级缓存值得是会话级别的,而二级缓存是跨会话级别的. 使用二级缓存,使用到了Ehcache,首先第一步需要在配置文件中配置使用了二级缓存 <shared-ca ...

  9. fibonacci封闭公式

    Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f ...

  10. 泛函编程(13)-无穷数据流-Infinite Stream

    上节我们提到Stream和List的主要分别是在于Stream的“延后计算“(lazy evaluation)特性.我们还讨论过在处理大规模排列数据集时,Stream可以一个一个把数据元素搬进内存并且 ...