在定义类别时,您可以使用「建构方法」(Constructor)来进行对象的初始化,而在Java中并没有 「解构方法」(Destructor),而是利用finalize()函式来达到解构方法的作用,这则在 垃圾回收 讨论。
在Java中建构方法是与类别名称相同的公开方法成员,且没有传回值,例如:
public class SafeArray { // .. public SafeArray() {?// 建构方法 // .... } public SafeArray(参数) {?// // .... } }
在建构方法中,您可以定义无参数的建构方法,或具有参数的建构方法,程序在运行时,会根据配置对象时所指定的自变量数据型态等来决定,该使用哪一个建构方法。
下面这个程序中,您实作「安全的数组」,使用我们所定义的数组类别可以动态配置数组长度,并可事先检查存取数组的索引是否超出数组长度,在这个数组类别中,您实作了几个简单的功能,像是传回数组长度、设定数组元素值、取得数组元素值等等,我们的类别定义如下:
public class SafeArray { private int[] arr; public SafeArray() { this(10); } public SafeArray(int length) { arr = new int[length]; } public int[] getArray() { return arr; } public int getElement(int i) { if(i >= arr.length || i < 0) { System.err.println("索引错误"); return 0; } return arr[i]; } public int getLength() { return arr.length; } public void setElement(int i, int data) { if(i >= arr.length || i < 0) { System.err.println("索引错误"); return; } arr[i] = data; } }
建构方法中,如果不指定自变量的话,就会预设配置10个元素的数组,您也可以由指定的长度来配置数组;您在无自变量的建构方法中直接使用this() 来呼叫另一个有参数的建构方法,这是一种经常的作法,可以避免撰写一些重复的原始码。
下面这个程序示范如何使用自订的安全数组类别:
public class UseConstructor { public static void main(String[] args) { // 预设10个元素 SafeArray arr1 = new SafeArray();? // 指定配置20个元素 SafeArray arr2 = new SafeArray(20); for(int i = 0; i < arr1.getLength(); i++) arr1.setElement(i, (i+1)*10); for(int i = 0; i < arr2.getLength(); i++) arr2.setElement(i, (i+1)*10); for(int element : arr1.getArray()) System.out.print(element + " "); System.out.println(); for(int element : arr2.getArray()) System.out.print(element + " "); System.out.println(); } }
上面的程序中,您配置了两个SafeArray对象,一个使用预设的建构方法,所以arr1的数组元素会有10个,一个使用指定长度的建构方法,所以arr2的数组元素个 数是我们指定的20,建构方法依自变量不同而自行决定该使用哪一个建构方法。
对象在建构之前,对象的属性必须先初始完毕才会执行建构式,例如:
public class Some { private Other other = new Other(); public Some() { System.out.println("Some"); } } public class Other { public Other() { System.out.println("Other"); } }
如果建构Some:
Some some = new Some();
由于先初始Some的属性成员,所以会先显示"Other",再显示"Some"。
如果您如下撰写:
public class Test { { System.out.println("initial..."); } public Test() { System.out.println("Test"); } public Test(int i) { System.out.println("Test i"); } public static void main(String[] args) { new Test(); new Test(1); } }
在 { 与 } 之间的程序,会自动加入所有的建构函式开头,所以程序将显示:
initial... Test initial... Test i