第五章 初始化和清理

<p>在java中,通过提供构造器,类的设计者可以确保每个对象都会得到初始化。在创建对象时,如果其类具有构造器,java会在用户有能力操作对象之前自动调用相应的构造器,从而确保初始化的进行</p> <p>采用构造器与类相同的名称解决两个问题:第一,所取的任何名字都可能和类的某个成员名称相冲突;第二,调用构造器是编译器的责任,所以必须让编译器知道应该调用哪个方法。</p> <p>方法重载:每一个重载的方法都必须有一个独一无二的参数列表。</p> <p>如果某个方法接受int型参数,它就会被调用;如果传入的数据类型小于方法中声明的形参类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char型参数的方法,就会把char直接提升为int型。</p> <p>this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this引用和其他对象的引用并无不同。在构造器中,如果为this添加了参数列表,将产生对符合此参数列表的某个构造器的明确调用。this的另一种用法是解决形参名称和数据成员名称相同产生歧义问题。</p> <h3>static含义</h3> <p>static方法就是没有this的方法。在<font color="#ff00ff">static方法</font>内部<font color="#00ffff">不能调用</font><font color="#ff00ff">非静态方法</font>,反过来倒是可以。<font color="#ff0080">而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法</font>。你可以在类中置入static方法以访问其他static方法和static域。</p> <h3>清理:终结处理和垃圾回收</h3> <p>java有垃圾回收器负责回收无用对象占据的内存资源。但是有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为了适应这种情况,java允许在类中定义一个名为finalize()方法。</p> <p>finalize()用于释放由某些特殊方法创建的对象所占的内存,如在java程序中调用非java语言创建对象占用内存。</p> <p>终结条件:当对某个对象不再感兴趣——即它可以被清理,这个对象应处于某种状态,使它的内存可以被安全的释放。在finalize()方法中定义对象的状态,可以发现对象中没有被适当清理的部分,找出程序隐晦的缺陷。</p> <h3>成员初始化</h3> <p>java尽力保证:所有变量在使用之前都得到恰当的初始化。对于方法的局部变量,java以编译时错误的形式来贯彻这种保证。</p> <p>类的每一个基本数据成员保证都会有一个初始值,如果在类里定义一个对象引用时,如果不将其初始化,会获得一个特殊值null。建议:在定义时明确初始化。</p> <p>无法阻止自动初始化的进行,它将在构造器调用之前发生。</p> <p>在类内部,变量定义的先后顺序决定了初始化的先后顺序。即使变量定义散落布于方法定义之间,它们仍就会在任何方法(包括构造器)被调用之前得到初始化。</p> <p>对象创建过程:1. 查找xxx.class文件 2.加载xxx.class文件,有关静态初始化的动作都会执行(静态初始化只会在类首次加载的时候进行一次) 3.new xxx()对象时,为对象分配足够的存储空间 4.存储空间被清零 5.执行所有出现在字段定义处的初始化动作 6.执行构造器</p> <h3>数组初始化:</h3> <p>int[] a; 定义数组a</p> <p>int[] a= new int[5]; 定义一个有5的元素的数组,并且把其中每个元素的值初始化为0</p> <p>int[] a= {0,1,2,4,3}; 定义一个有5的元素的数组,并且把其中元素的值依次初始化为0,1,2,4,3</p> <p>Integer[] s = new Integer[5]; 定义一个有五个元素的数组引用,并且每个元素为null</p> <p>Integer[] s = new Integer[]{new Integer(1),new Integer(2),3}; 定义一个有3个元素的数组引用,并且每个元素依次为:new Integer(1),new Integer(2),3</p> <p>可变参数列表:方法名f(类型… 形参名){//类型… 表示可变参数类别&#160; 形参名表示一个数组引用 <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(类型 参数名:形参名){//参数名表示可变参数列表中的每个元素&#160; for循环迭代可变参数列表中的每个元素 <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ... <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p> <h3>枚举类型(enum):</h3> <p>创建enum类时,编译器会自动添加一些有用信息:</p> <p>1.添加toString()方法:可以正确显示出每个enum实例的名称</p> <p>2.添加ordinal()方法:用来表示某个特定enum常量的声明顺序</p> <p>3.添加static values()方法:按照enum常量的声明顺序,产生由这些常量值构成的数组</p> <p>enum类型还可以在switch内部使用,如 :</p> <p>class Burrito{ <br />&#160;&#160;&#160; Spiciness degree;//这是enum类型的变量 <br />&#160;&#160;&#160; switch(degree){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; case NOT:..... //NOT、HOT、...等都是Spiciness(enum类型)类定义的常量值 <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; case HOT: ..... <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //others .... <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; default: ..... <br />&#160;&#160;&#160; } <br />}</p>

转载于:https://my.oschina.net/u/932901/blog/101508

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值