初始化和清理
“不安全”的编成,其安全问题包括:初始化和清理
一:初始化
1用构造函数来确保初始化。
2方法的重载
名字管理是编程语言底一项重要特性。创建对象的时候,你会给内存空间起名字,
而方法是动作的名字。
可以用参数个数和类型来区分重载的方法。但是不能用返回值来区分。
3构造函数
默认大构造函数是“无参数”的构造函数,但如果你写了一个没有构造函数的类
那么编译器会自动为你创建一个末人大构造函数。但是,只要定义了构造函数(无论有无参数),编译器就不会再自动创建默认的构造函数。
在构造函数里调用构造函数,需要注意两点:
A;在一个构造函数里可以用this调用另一个构造函数,但是不能调用两个
B:记得在程序的最前面调用构造函数
否则编译器会报错
4:static
你可以不通过对象,直接对类调用static方法,(本义)。它和c里的全局函数一样,然而java不允许有全局函数,类的static方法只能访问其他static发放和static数据成员。
二: 清理:finalization和垃圾回收
假设对象所占据的是一些特殊的,不是用new分配的内存,垃圾回收器只知道该如何释放用new分配的内存,所以它就不知道该如何释放这些“特殊的”内存。所以java提供了一个叫finalize()的方法,你可以自己定义类的这个方法。
1所谓的拆构函数就是对象清理的时候必须调用的函数。但是这里一定要搞清楚c++和java的区别。C++的对象总是会得到清理的,而java对象并不总是会被回收的,换言之:
a:对象不一定会被垃圾器回收。
B; 垃圾回收不是拆构。
2:须记:
A;垃圾回收只于内存有关。(也就是说,垃圾回收的唯一目的,就上一要将那些不能为程序所用的内存恢复出来)
3:不论对象是以什么方式创建的,内存释放都是由垃圾回收器负责的。
4:finalize()还有一很有趣的用途,这时它就不要求每次都被调用到了,这就是检查对象的中止条件
三:成员的初始化
1用构造函数进行初始化,但是你要记住,你并没有排除自动的初始化,它在构造函数进行之前就已经完成了。举例:

Public class Counter { 

 Int I; 

 Counter(){ 

 I=9; 

} 

}


I会被先初始化为0,然后才是7
2初始化的顺序
对类而言,初始化的顺序由变量在类的定义里面的顺序(位置)决定的,但是变量的初始化会优先于任何方法,甚至是构造函数的调用。
3:静态初始化只运行一次。
4:数组的初始化
举例:

public class Arrays 

{ 

 public static void main(String[] args) 

 { 

 int a1[]={1,2,3,4,5}; 

 int a2[]; 

 a2=a1; //a 

 for(int i=0;i<a2.length;i++){ 

 a2[i]++;//b 

 } 

 for(int i=0;i<a1.length;i++){ 

 System.out.println("a1["+i+"}=:"+a1[i]); 

 } 

 //预测结果 --- 实际结果 

 //a[1]=1; --- a[1]=2; 

 //a[2]=2; --- a[2]=3; 

 //a[3]=3; --- a[3]=4; 

 //a[4]=4' --- a[4]=4' 

 //a[5]=5; --- a[5]=5; 

 } 

};


说明:第a句:a2=a1 你真正做的是复制reference,使a2的对象和a1的对象一样引用同一块内存;第b句: a[i]++ 其改变的是内存的值,所以a1的值也就变了
java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是java的原始数据类型,Integer是java为int提供的封装类
对于原始类型定义的数组,可以这样直接定义,例如:int[] a1 = new int[4];
对于Integer这个引用类型(或一般其他自己定义的类),这样定义数组后
Integer[] a2 =new Integer[5];这只是一个reference的数组,所以只要还没有创建新的Integer对象来初始化这些reference,初始化的过程还没结束,然而,如果你忘了创建对象,那么程序运行的时候,当你要用到数组的空位置的时候,就会得到一个异常。(a1不会发生异常,a2会发生异常。)