鱼C论坛

 找回密码
 立即注册
查看: 2613|回复: 0

[学习笔记] 0基础学习Java ——第五段 ---初始化与清理(下)

[复制链接]
发表于 2017-8-21 09:58:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 回忆一遥远 于 2017-8-21 09:58 编辑

初始化与清理




成员初始化



非静态实例初始化
Java 中有类似实例初始化的语法吗,用来初始化,每一个对象的非静态变量。
例子:
  1. class Mug{
  2.         Mug(int mk){
  3.                 System.out.println("Mug(" + mk + ")");
  4.         }
  5.         void f(int mk) {
  6.                 System.out.println("f(" + mk + ")");
  7.         }
  8. }

  9. public class Mugs {
  10.         Mug mug1;
  11.         Mug mug2;
  12.         {
  13.                 mug1 = new Mug(1);
  14.                 mug2 = new Mug(2);
  15.                 System.out.println("mug1 & mug2 initialized");
  16.         }
  17.         Mugs(){
  18.                 System.out.println("Mugs()");
  19.         }
  20.         Mugs(int i){
  21.                 System.out.println("Mugs(int)");
  22.         }
  23.         public static void main(String[] args) {
  24.                 System.out.println("Inside main()");
  25.                 new Mugs();
  26.                 System.out.println("new Mugs() completed");
  27.                 new Mugs(1);
  28.                 System.out.println("new Mugs(1) completed");
  29.         }

  30. }
复制代码

输出:
  1. Inside main()
  2. Mug(1)
  3. Mug(2)
  4. mug1 & mug2 initialized
  5. Mugs()
  6. new Mugs() completed
  7. Mug(1)
  8. Mug(2)
  9. mug1 & mug2 initialized
  10. Mugs(int)
  11. new Mugs(1) completed
复制代码


可以看出实例初始化子句
  1. {
  2.         mug1 = new Mug(1);
  3.         mug2 = new Mug(2);
  4.         System.out.println("mug1 & mug2 initialized");
  5. }
复制代码

看上去与静态初始化子句一摸一样,但少了 static 关键字。
这种语法对于支持“匿名内部类”的初始化是必须的,它也能让我们可以保证无论调用了哪个显式构造器,某些操作都会发生。



数组初始化


数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
数组是通过方括号下标操作符 [ ] 来定义和使用的。

数组定义方法:
        在类型名后加一对方括号:
                int[] a;
        方括号置于标识符后面:
                int a[];

以上两种格式的含义是一样的,后一种符合 C/C++ 的习惯。
前一种格式更加合理,因为它表明类型是“一个 int 型数组”。
编译器不允许指定数组的大小。
上面只是对数组的一个引用,没有给数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须写初始化表达式,数组可以在任何地方进行初始化。
一种特殊的初始化表达式必须在创建数组时出现,它是由一对花括号和里面的值组成的。这种情况下,存储空间的内存分配(等价使用 new)将由编译器负责。
例如:
        int a = { 1, 2, 3, 4};

在 Java 中可以将一个数组赋值给另一个数组:
        int b;
        b = a;


事实上,这只是复制了一个引用:

  1. public class ArraysOfPrimitives {

  2.         public static void main(String[] args) {
  3.                 int[] a = {1, 2, 3, 4};
  4.                 int[] b;
  5.                 b = a;
  6.                 for(int i = 0; i < b.length; i++) {
  7.                         b[i] = b[i] + 1;
  8.                 }
  9.                 for(int i = 0; i < a.length; i++) {
  10.                         System.out.println("a[" + i + "] = " + a[i]);
  11.                 }
  12.         }

  13. }
复制代码

输出:
  1. a[0] = 2
  2. a[1] = 3
  3. a[2] = 4
  4. a[3] = 5
复制代码

由于 a 和 b 是相同数组的别名,因此对 b 的修改可以在 a 中看到。

所有数组都有一个固定成员 length ,他可以得知数组中包含多少元素,无法对其进行修改。
数组所能使用的最大下标是 length - 1 ,在 C/C++ 中,超过这个边界,它们会默默接受,而 Java 则能保护你免受数组越界的问题。


如果编写程序是不确定数组需要多少个元素,可以直接用 new 在数组中创建元素:
  1. import java.util.*;
  2. public class ArrayNew {

  3.         public static void main(String[] args) {
  4.                 int[] a;
  5.                 Random rand = new Random();
  6.                 a = new int[rand.nextInt(20)];
  7.                 System.out.println("length of a = " + a.length);
  8.                 System.out.println(Arrays.toString(a));
  9.         }

  10. }
复制代码

输出:
  1. length of a = 10
  2. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
复制代码

输出表明:数组元素中的基本数据类型会自动初始化为空值。

Arrays.toString() 方法属于 java.util 标准类库,它会打印一维数组。

如果创建了一个非基本类型的数组,那么这就是一个引用数组。

以整形包装器 Integer 为例,它是一个类而不是基本类型:
  1. import java.util.*;
  2. public class ArrayClassObj {

  3.         public static void main(String[] args) {
  4.                 Random rand = new Random();
  5.                 Integer[] a = new Integer[rand.nextInt(20)];
  6.                 System.out.println("length of a = " + a.length);
  7.                 for(int i = 0; i < a.length; i++) {
  8.                         a[i] = rand.nextInt(500);
  9.                 }
  10.                 System.out.println(Arrays.toString(a));
  11.         }

  12. }
复制代码

输出:
  1. length of a = 6
  2. [498, 394, 285, 480, 74, 298]
复制代码

这里即使用 new 创建数组,它还只是一个引用数组。

可以用花括号括起来的列表来初始化对象数组(两种形式):
  1. import java.util.*;
  2. public class ArrayInit {

  3.         public static void main(String[] args) {
  4.                 Integer[] a = {
  5.                                 new Integer(1),
  6.                                 new Integer(2),
  7.                                 3,
  8.                 };
  9.                 Integer[] b = new Integer[]{
  10.                                 new Integer(1),
  11.                                 new Integer(2),
  12.                                 3,
  13.                 };
  14.                 System.out.println(Arrays.toString(a));
  15.                 System.out.println(Arrays.toString(b));
  16.         }

  17. }
复制代码

输出:
  1. [1, 2, 3]
  2. [1, 2, 3]
复制代码

这两种形式中,初始化列表最后一个逗号是可选的。
尽管第一种形式很有用,但它也更加受限——只能用于数组刚被定义处。


可变参数列表
Java SE5 之后,可以方便地定义可变参数列表了。
Java SE5 之前:
  1. class A{}
  2. public class VarArgs {
  3.         static void printArray(Object[] args) {
  4.                 for(Object obj : args)
  5.                         System.out.println(obj + " ");
  6.                 System.out.println();
  7.         }
  8.         public static void main(String[] args) {
  9.                 printArray(new Object[] {new Integer(47), new Float(3.14), new Double(11.11)});
  10.                 printArray(new Object[] {"one", "two", "three"});
  11.                 printArray(new Object[] {new A(), new A(), new A()});
  12.         }

  13. }
复制代码

输出:
  1. 47
  2. 3.14
  3. 11.11

  4. one
  5. two
  6. three

  7. A@15db9742
  8. A@6d06d69c
  9. A@7852e922

复制代码


现在:

  1. public class NewVarArgs {
  2.         static void printArray(Object... args) {
  3.                 for(Object obj : args)
  4.                         System.out.println(obj + " ");
  5.                 System.out.println();
  6.         }
  7.         public static void main(String[] args) {
  8.                 printArray(new Integer(47), new Float(3.14), new Double(11.11));
  9.                 printArray(47, 3.14F, 11,11);
  10.                 printArray("one", "two", "three");
  11.                 printArray(new A(), new A(), new A());
  12.                 printArray((Object[])new Integer[] {1, 2, 3, 4});
  13.                 printArray();
  14.         }

  15. }
复制代码

输出:
  1. 47
  2. 3.14
  3. 11.11

  4. 47
  5. 3.14
  6. 11
  7. 11

  8. one
  9. two
  10. three

  11. A@15db9742
  12. A@6d06d69c
  13. A@7852e922

  14. 1
  15. 2
  16. 3
  17. 4


复制代码

有了可变参数,就再也不用显式地编写数组语法了,当指定参数时,编译器会为你去填充数组。





评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表