|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 回忆一遥远 于 2017-8-21 09:58 编辑
初始化与清理
成员初始化
非静态实例初始化
Java 中有类似实例初始化的语法吗,用来初始化,每一个对象的非静态变量。
例子:
- class Mug{
- Mug(int mk){
- System.out.println("Mug(" + mk + ")");
- }
- void f(int mk) {
- System.out.println("f(" + mk + ")");
- }
- }
- public class Mugs {
- Mug mug1;
- Mug mug2;
- {
- mug1 = new Mug(1);
- mug2 = new Mug(2);
- System.out.println("mug1 & mug2 initialized");
- }
- Mugs(){
- System.out.println("Mugs()");
- }
- Mugs(int i){
- System.out.println("Mugs(int)");
- }
- public static void main(String[] args) {
- System.out.println("Inside main()");
- new Mugs();
- System.out.println("new Mugs() completed");
- new Mugs(1);
- System.out.println("new Mugs(1) completed");
- }
- }
复制代码
输出:
- Inside main()
- Mug(1)
- Mug(2)
- mug1 & mug2 initialized
- Mugs()
- new Mugs() completed
- Mug(1)
- Mug(2)
- mug1 & mug2 initialized
- Mugs(int)
- new Mugs(1) completed
复制代码
可以看出实例初始化子句
- {
- mug1 = new Mug(1);
- mug2 = new Mug(2);
- System.out.println("mug1 & mug2 initialized");
- }
复制代码
看上去与静态初始化子句一摸一样,但少了 static 关键字。
这种语法对于支持“匿名内部类”的初始化是必须的,它也能让我们可以保证无论调用了哪个显式构造器,某些操作都会发生。
数组初始化
数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
数组是通过方括号下标操作符 [ ] 来定义和使用的。
数组定义方法:
在类型名后加一对方括号:
int[] a;
方括号置于标识符后面:
int a[];
以上两种格式的含义是一样的,后一种符合 C/C++ 的习惯。
前一种格式更加合理,因为它表明类型是“一个 int 型数组”。
编译器不允许指定数组的大小。
上面只是对数组的一个引用,没有给数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须写初始化表达式,数组可以在任何地方进行初始化。
一种特殊的初始化表达式必须在创建数组时出现,它是由一对花括号和里面的值组成的。这种情况下,存储空间的内存分配(等价使用 new)将由编译器负责。
例如:
int a = { 1, 2, 3, 4};
在 Java 中可以将一个数组赋值给另一个数组:
int b;
b = a;
事实上,这只是复制了一个引用:
- public class ArraysOfPrimitives {
- public static void main(String[] args) {
- int[] a = {1, 2, 3, 4};
- int[] b;
- b = a;
- for(int i = 0; i < b.length; i++) {
- b[i] = b[i] + 1;
- }
- for(int i = 0; i < a.length; i++) {
- System.out.println("a[" + i + "] = " + a[i]);
- }
- }
- }
复制代码
输出:
- a[0] = 2
- a[1] = 3
- a[2] = 4
- a[3] = 5
复制代码
由于 a 和 b 是相同数组的别名,因此对 b 的修改可以在 a 中看到。
所有数组都有一个固定成员 length ,他可以得知数组中包含多少元素,无法对其进行修改。
数组所能使用的最大下标是 length - 1 ,在 C/C++ 中,超过这个边界,它们会默默接受,而 Java 则能保护你免受数组越界的问题。
如果编写程序是不确定数组需要多少个元素,可以直接用 new 在数组中创建元素:
- import java.util.*;
- public class ArrayNew {
- public static void main(String[] args) {
- int[] a;
- Random rand = new Random();
- a = new int[rand.nextInt(20)];
- System.out.println("length of a = " + a.length);
- System.out.println(Arrays.toString(a));
- }
- }
复制代码
输出:
- length of a = 10
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
复制代码
输出表明:数组元素中的基本数据类型会自动初始化为空值。
Arrays.toString() 方法属于 java.util 标准类库,它会打印一维数组。
如果创建了一个非基本类型的数组,那么这就是一个引用数组。
以整形包装器 Integer 为例,它是一个类而不是基本类型:
- import java.util.*;
- public class ArrayClassObj {
- public static void main(String[] args) {
- Random rand = new Random();
- Integer[] a = new Integer[rand.nextInt(20)];
- System.out.println("length of a = " + a.length);
- for(int i = 0; i < a.length; i++) {
- a[i] = rand.nextInt(500);
- }
- System.out.println(Arrays.toString(a));
- }
- }
复制代码
输出:
- length of a = 6
- [498, 394, 285, 480, 74, 298]
复制代码
这里即使用 new 创建数组,它还只是一个引用数组。
可以用花括号括起来的列表来初始化对象数组(两种形式):
- import java.util.*;
- public class ArrayInit {
- public static void main(String[] args) {
- Integer[] a = {
- new Integer(1),
- new Integer(2),
- 3,
- };
- Integer[] b = new Integer[]{
- new Integer(1),
- new Integer(2),
- 3,
- };
- System.out.println(Arrays.toString(a));
- System.out.println(Arrays.toString(b));
- }
- }
复制代码
输出:
这两种形式中,初始化列表最后一个逗号是可选的。
尽管第一种形式很有用,但它也更加受限——只能用于数组刚被定义处。
可变参数列表
Java SE5 之后,可以方便地定义可变参数列表了。
Java SE5 之前:
- class A{}
- public class VarArgs {
- static void printArray(Object[] args) {
- for(Object obj : args)
- System.out.println(obj + " ");
- System.out.println();
- }
- public static void main(String[] args) {
- printArray(new Object[] {new Integer(47), new Float(3.14), new Double(11.11)});
- printArray(new Object[] {"one", "two", "three"});
- printArray(new Object[] {new A(), new A(), new A()});
- }
- }
复制代码
输出:
- 47
- 3.14
- 11.11
- one
- two
- three
- A@15db9742
- A@6d06d69c
- A@7852e922
复制代码
现在:
- public class NewVarArgs {
- static void printArray(Object... args) {
- for(Object obj : args)
- System.out.println(obj + " ");
- System.out.println();
- }
- public static void main(String[] args) {
- printArray(new Integer(47), new Float(3.14), new Double(11.11));
- printArray(47, 3.14F, 11,11);
- printArray("one", "two", "three");
- printArray(new A(), new A(), new A());
- printArray((Object[])new Integer[] {1, 2, 3, 4});
- printArray();
- }
- }
复制代码
输出:
- 47
- 3.14
- 11.11
- 47
- 3.14
- 11
- 11
- one
- two
- three
- A@15db9742
- A@6d06d69c
- A@7852e922
- 1
- 2
- 3
- 4
复制代码
有了可变参数,就再也不用显式地编写数组语法了,当指定参数时,编译器会为你去填充数组。
|
评分
-
查看全部评分
|