初始化和清理,是一个生命周期的起始。在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. 15个带给您优秀用户体验的移动应用 UI 设计

    在今天在移动 App 界面设计中,你可以看到不同创意类型的视觉效果.特别是在 Dribbble 上面,有有很多移动应用程序的 UI 概念设计,让你惊叹.如果你想获得灵感,那很有必要看看下面15个优秀用 ...

  2. jquery easyui dialog Bug解决方案

    最近一直都在用easyui前端框架来开发设计UI,但在使用Dialog时,发现如果页面内容比较多,就会出现问题,首先看一下我的原代码: <input type="button" ...

  3. [ORM] Entity Framework(1) CodeFirst快速入门

    Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案 对象关系映射(英语:Object Relational Mapping ...

  4. poi中getPhysicalNumberOfRows()和getLastRowNum()区别

    getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况. getLastRowNum()获取的是最后一行的编号(编号从0开始). 通过getPhysic ...

  5. XSS 和 CSRF 攻击

    web安全中有很多种攻击手段,除了SQL注入外,比较常见的还有 XSS 和 CSRF等 一.XSS(Cross Site Scripting)跨站脚本 XSS其实就是Html的注入问题,攻击者的输入没 ...

  6. ok6410 android driver(5)

    Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...

  7. Entity FrameWork 增删查改

    Add #region 1.0 新增+void Add() /// <summary> /// 新增 /// </summary> static void Add() { // ...

  8. c# 文件另存为代码

    利用.NET中的File.Copy方法 命名空间:System.IO 重载列表:Copy(string sourceFilePath,string targetFilePath) sourceFile ...

  9. 如何理解css中的float

    最近一段时间一直在为一个即将上线的新站进行一些前端开发.自然,对CSS的使用是必不可少的了.我们在CSS 中很多时候会用到浮动来布局.常见的有 float:left 或者 float:right .简 ...

  10. TreeBuilder科学的树创建器

    public static class TreeBuilder { public static List<dynamic> Build(IEnumerable<dynamic> ...