大家一起和snailren学java-(四)初始化与清理
初始化和清理,是一个生命周期的起始。在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-(四)初始化与清理的更多相关文章
- Java的初始化与清理
大家都知道,Java是站在巨人的肩上成功的,它是在C&C++的基础上进一步的开发,投入面向对象开发的怀抱.Java吸取了很多以前的教训,加入自己很多独创的方式.在程序语言发展初期,许多C程序员 ...
- Chapter5_初始化与清理_用构造器初始化
接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...
- 零基础学Java第四节(字符串相关类)
本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...
- .net基础学java系列(四)Console实操
上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...
- 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...
- 零基础学Java第五节(面向对象一)
本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...
随机推荐
- [linux]记录如何设置一个新的vps
背景 我正在做一个小项目,做好了打算上线,所有需要买个服务器,看了一圈,发现还是卖个vps合算.买了之后,进行了一些列的设置,这里记录一下,以便后面查看. 系统: ubuntu 内存:1G 一.更改时 ...
- 在ubuntu下创建wifi供移动端使用
转自:http://jingyan.baidu.com/album/ea24bc39b03fc6da62b331f0.html?picindex=8 完全正确是流程 另外 还需要本机能够连上内网的vp ...
- 从零开始,CentOS6安装ghost博客
买了个Bandwagon的VPS来科学上网的,寻思着空间还大顺便做个博客呗. 然后就安装了AMH面板,再搞了个wordpress博客玩玩. 接触到Ghost博客的时候,心血来潮想装一个. 然后就试着搞 ...
- 组合数学 + STL --- 利用STL生成全排列
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- .Net实现微信公众平台开发接口(三) 之 “信息回复”
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本.图片.图文.语音.视频.音乐).请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器 ...
- 不经意间网易开源镜像去掉了FreeBSD的镜像
http://mirrors.163.com/ FreeBSD已经到了这么不招人待见的地步了么? 网易曾经可是FreeBSD的大户啊.
- 小白学Linux--虚拟机下安装Ubuntu16
最近接收到任务,说是下半年可能要搞全文检索.听到后顿时炸锅了,一方面是对新技术的兴奋(当然主要还是这技术比较值钱),另一方面,我TM连Linux都不会玩,怎么搞全文检索.怀揣着对开源世界的无线向往(恐 ...
- Spring RMI Example
一: 提供服务的远程一端 1-1. applicationContext.xml <?xml version="1.0" encoding="UTF-8" ...
- ServiceStack.Text反序列化lowercase_underscore_names格式的JSON
代码: [Test] public void Test() { JsConfig.PropertyConvention = JsonPropertyConvention.Lenient; var js ...
- Android 手机卫士13--进程设置
1.显示隐藏系统进程 修改ProcessManagerActivity的Adapter ..... @Override public int getCount() { if(SpUtil.getBoo ...