一、类的初始化
使用new关键字创建一个对象的时候,其实是调用了这个无参对象的构造方法进行的初始化,例如:
1 package day03; 2 3 4 5 class Demo01 { 6 7 public Demo01(){} 8 9 }
这个无参的构造函数可以隐藏,由JVM自动添加。因为构造函数能确保类的初始化。
二、成员初始化
Java会尽力保证每个变量在使用前都会获得初始化,初始化的分类如下:
1、编译器默认指定的字段初始化,基本数据类型的初始化
类型 |
初始值 |
Boolean |
False |
Char |
/u0000 |
Byte |
(byte)0 |
Short |
(short)0 |
Int |
0 |
Long |
0L |
Float |
0.0F |
Double |
0.0D |
2、其他对象类型的初始化,String也是一种对象,对象的初始化值都是null,也包括基本类型的包装类。
3、指定数值的初始化,例如:int a = 11,指定a的初始化值不是0而是11。
三、构造器初始化
利用构造器可以都某些方法和动作进行初始化,确定初始值,例如:
1 public class Demo02 { 2 3 int i; 4 5 public Demo02(){ 6 7 i = 100; 8 9 } 10 11 12 13 public static void main(String[] args) { 14 15 Demo02 d = new Demo02(); 16 17 System.out.println(d.i); 18 19 } 20 21 }
结果:
四、初始化顺序
静态属性—》静态方法块—》普通属性—》普通方法块—》构造函数—>方法
- 静态属性:static开头定义的属性
- 静态方法块:static{}包起来的代码块
- 普通属性:非static定义的属性
- 普通方法块:{}包起来的代码块
- 构造函数:类名相同的方法
- 方法:普通方法
1 package day03; 2 3 4 5 public class Demo03 { 6 7 //静态属性 8 9 private static String staticField = getStaticField(); 10 11 12 13 //静态方法块 14 15 static { 16 17 System.out.println(staticField); 18 19 System.out.println("静态方法块初始化"); 20 21 } 22 23 24 25 //普通属性 26 27 private String field = getFeild(); 28 29 30 31 //普通方法块 32 33 { 34 35 System.out.println(field); 36 37 } 38 39 40 41 //构造函数 42 43 public Demo03() { 44 45 System.out.println("构造函数初始化"); 46 47 } 48 49 50 51 public static String getStaticField() { 52 53 String staticField = "static Filed initial"; 54 55 return staticField; 56 57 } 58 59 60 61 public static String getFeild() { 62 63 String filed = "Field initial"; 64 65 return filed; 66 67 } 68 69 70 71 //主函数 72 73 public static void main(String[] args) { 74 75 new Demo03(); 76 77 } 78 79 }
结果:
可以看到这段代码的执行顺序是:静态属性初始化—》静态方法初始化—》普通属性初始化—》普通方法初始化—》构造函数初始化
五、数值初始化
数组是相同类型的、用同一个标识符封装到一起的一个对象或基本数据序列。数据通过[]定义使用。例如:
int [] arr1;或者int arr1[];这两种格式含义是一样的。
- 直接给每个元素赋值:int array[3] = {1,2,3];
- 给一部分赋值,后面的为默认初始化值0。int array{4] = {1,3};
- 由赋值参数个数决定数组的个数:int array[] = {2,34,1};
六、对象的销毁
虽然Java语言是基于C++的,但是它和C/C++有一个重要的特征就是不需要手动管理对象的销毁工作。Java的对象销毁工作是由Java虚拟机进行管理和销毁的。
对象作用域:这个决定了其内部定义的变量名的可见性和生命周期,通常是由{}的位置决定。例如:
1 { 2 3 int a = 19; 4 5 { 6 7 int b =20; 8 9 } 10 11 }
a会在两个{}作用域有效,b变量只在自己的作用域范围{}有效