深入学习java(四)

初始化(initialization)和清除(cleanup)
一、构造器(constructor)
在Java中,通过提供“构造器”,确保每个对象都会得到初始化。“构造器”的名称必须与类名完全相同(所以“每个方法的首字母小写”的编码风格不适用于构造器)。[color=blue]通过“构造器”将“初始化”与“创建”捆绑在一起,两者不能分离。[/color]二、方法重载(method overloading)
在Java中,为了让方法名相同而形式参数不同的构造器存在,必须用到“方法重载”。同时,尽管方法重载是构造器必须的,但它亦可应用于其它方法,且用法同样方便。
1、 区分方法重载
规则如下:
a) [color=blue]每个重载的方法都必须有独一无二的参数类型列表。[/color]b) 形式参数顺序不同也可以区分两个方法(不建议使用)。
2、 涉及基本类型的重载
[color=blue]基本类型能从一个“较小”的类型自动提升至一个“较大”的类型。[/color]
a) 例如对方法f1(int)及其重载的方法f2(long),f3(float),f4double)来说,输入参数 5被当作int值处理。如果某个方法接受int值,它就会被调用。至于其他情况,如果传入的实际参数类型“小于”方法中声明的形式参数类型,实际参数的类型就会被“提升”。char类型有所不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。
b) 如果传入的实际参数“大于”重载方法声明的形式参数。在调用时,就需要对传入的实际参数做“强制类型转换”,否则编译器会报错。但是,这是一种“窄化转换”,在转换过程中可能丢失信息。
3、 缺省构造器
若创建一个对象以后,没有创建该对象的构造器,Java编译器会为其自动创建一个缺省构造器(无参数)。但是如果该对象已经定义了一个构造器(无论有无参数),Java编译器都不会再自动创建缺省构造器。此时若调用的构造器参数类型不正确,编译器就会报错。
4、 this关键字
若希望在方法内部获得对当前对象的引用,可使用专门的关键字:this。[color=blue]this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。[/color]但如果在方法内部调用同一个类的其他方法,就不必使用this,直接调用即可。
a) 使用this关键字实现在一个构造器中调用另一个构造器。通常写this都是指“这个对象”或“当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,就表示:这将产生对符合参数列表的某个构造器的明确调用。实例如下:


public class Flower{
Flower(int petals){}
Flower(String s){}
Flower(String s,int petals){
this(petals);
this.s=s;
}
}

除构造器外,编译器禁止在其他任何方法中调用构造器。
b) static 的含义
静态(static)方法就是没有this的方法。在静态方法内部不能调用非静态方法,反过来则可以。而且可以不创建任何对象,仅通过类本身来调用静态方法。静态方法具有全局函数的意义,且由于其不存在this,所以不是通过“向对象发送消息”的方式来完成的。
三、清除(cleanup):终结(finalization)和垃圾回收(garbage collection)
[color=blue]Java中有垃圾回收器来回收无用对象占据的内存,但只能释放经由new分配的内存[/color]。对于特殊的内存区域(并非使用new),Java允许在类中定义一个名为finalize()的方法。其工作原理如下:一旦垃圾垃圾回收器准备好释放对象占用的内存,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
无论对象是如何创建,垃圾回收器会释放对象占据的所有内存。于是确认finalize()的使用范围:通过某种非“创建对象”的方式为对象分配了存储空间。如在Java中调用非Java代码,而在非Java代码中,也许会调用类似C的malloc()函数来分配内存空间。
无论是“垃圾回收”还是“终结”,都不一定会发生。若Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间在回收垃圾以回复内存上的。
四、成员初始化
Java尽力保证:所有变量在使用前都能得到恰当的初始化。对定义于方法内部的局部变量,强制要求提供初始值。[color=blue]对于类的数据成员是基本类型(类中任何方法都可以初始化或用到这个数据),若未提供初始值,Java会提供默认值。[/color]1、 指定初始化
a.直接提供初值

class InitialValues{
boolean b = true;
char c = ‘x’;
bye B = ‘47’;
int i = 99;
}

b.调用某个方法提供初值

class Init{
int i = f();
int j = g(i)
}

2、 构造器初始化

class Counter{
int i;
Counter(){ i = 1;}
}

3、 初始化顺序:在类内部,变量定义的顺序决定了初始化的顺序。
4、 静态数据的初始化:如果属于某个基本类型,而且也没有初始化,那么它会获得基本类型的标准初值;如果是一个对象引用,那么除非你新创建一个对象,并指派给该引用,否则它就是空值(null)。
5、 明确进行的静态初始化
在静态模块中集中初始化

class Spoon{
static int i,j;
static {
i = 1;
j = 2;
}
}


6、 非静态实例初始化

class Spoon{
int i,j;
{
i = 1;
j = 2;
}
}

五、数组初始化
1、数组的初始化可以在代码的任何地方,也可以使用一种特殊的初始化表达式,它必须在创建数组的地方出现。
int[] a = {1,2,3,4,5};

2、使用new来初始化。若数组的元素是基本数据类型,其元素值会自动转化为“空”值(对数字和字符,就是0;对布尔型,是false)
Int[] b = new int[rand.nextInt(20)];

若数组中的元素不是基本的数据类型,会遇到引用的问题,因为每一个数组元素都是都是一个引用,必须使用new

Integer[] c = {
new Integer(0),
new Integer(1),
new Integer(2),
};//数组长度固定

Integer[] d = new Integer[]{
new Integer(3),
new Integer(4),
new Integer(5),
};//数组长度不固定

3、多维数组的初始化与一维数组是一样的。
[color=red]总结:[/color]
经过学习,对Java中的构造器、初始化等有了深入的了解。比起以前的用到哪里查哪里感觉有了很大的提高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值