大家一起和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>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...
随机推荐
- 15个带给您优秀用户体验的移动应用 UI 设计
在今天在移动 App 界面设计中,你可以看到不同创意类型的视觉效果.特别是在 Dribbble 上面,有有很多移动应用程序的 UI 概念设计,让你惊叹.如果你想获得灵感,那很有必要看看下面15个优秀用 ...
- jquery easyui dialog Bug解决方案
最近一直都在用easyui前端框架来开发设计UI,但在使用Dialog时,发现如果页面内容比较多,就会出现问题,首先看一下我的原代码: <input type="button" ...
- [ORM] Entity Framework(1) CodeFirst快速入门
Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案 对象关系映射(英语:Object Relational Mapping ...
- poi中getPhysicalNumberOfRows()和getLastRowNum()区别
getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况. getLastRowNum()获取的是最后一行的编号(编号从0开始). 通过getPhysic ...
- XSS 和 CSRF 攻击
web安全中有很多种攻击手段,除了SQL注入外,比较常见的还有 XSS 和 CSRF等 一.XSS(Cross Site Scripting)跨站脚本 XSS其实就是Html的注入问题,攻击者的输入没 ...
- ok6410 android driver(5)
Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...
- Entity FrameWork 增删查改
Add #region 1.0 新增+void Add() /// <summary> /// 新增 /// </summary> static void Add() { // ...
- c# 文件另存为代码
利用.NET中的File.Copy方法 命名空间:System.IO 重载列表:Copy(string sourceFilePath,string targetFilePath) sourceFile ...
- 如何理解css中的float
最近一段时间一直在为一个即将上线的新站进行一些前端开发.自然,对CSS的使用是必不可少的了.我们在CSS 中很多时候会用到浮动来布局.常见的有 float:left 或者 float:right .简 ...
- TreeBuilder科学的树创建器
public static class TreeBuilder { public static List<dynamic> Build(IEnumerable<dynamic> ...