标签:执行 不用 使用 顺序 col 本质 ini 默认 class
初始化的目的:为成员变量初始化,赋值
初始化的四种方式:
1、默认值
2、显式初始化
1 【修饰符】 class 类名{ 2 【修饰符】 数据类型 成员变量 = 值; 3 }
3、代码块
1 【修饰符】 class 类名{ 2 static{ 3 //...静态代码块,给静态变量初始化 4 } 5 { 6 //...非静态代码块,给实例变量初始化 7 } 8 }
有的文章中把非静态代码块叫做构造块
4、构造器
注意:构造器为实例变量初始化,一般不用它来为静态变量初始化
有的文章中把构造器叫做构造方法
1 【修饰符】 class 类名{ 2 【修饰符】 类名(){ 3 //无参构造 4 } 5 【修饰符】 类名(形参列表){ 6 //有参构造 7 } 8 }
特点:
(1)所有类都有构造器
(2)如果一个类没有手动声明构造器,编译器会自动添加一个默认的无参构造;
如果我们手动声明了构造器,那么编译就不会自动添加无参构造了,如果需要,必须手动添加
(3)构造器的名称必须和类名完全一致
(4)构造器没有返回值类型
(5)构造器的修饰符:只能有权限修饰符(public,protected,缺省,private),不能有final,abstract,static等
1、类初始化
作用:给静态变量初始化
类初始化本质上是在执行一个<clinit>()方法,这个方法是由编译自己组装而成的,编译会把:
(1)静态变量的显式赋值
(2)静态代码块中代码
按照代码编写的顺序进行组装
每一个类的类初始化方法<clinit>()只会执行一次,第一次使用这个类的时候
1 public class Demo{ 2 private static int a = 1; 3 static{ 4 System.out.println("静态代码块1"); 5 } 6 private static int b = 1; 7 static{ 8 System.out.println("静态代码块2"); 9 } 10 }
1 //组装后 2 public class Demo{ 3 private static int a = 1; 4 private static int b; 5 <clinit>(){ 6 a = 1; 7 System.out.println("静态代码块1"); 8 b = 1; 9 System.out.println("静态代码块2"); 10 } 11 }
2、实例初始化
作用:创建实例对象时,为实例变量初始化
本质上:实例初始化过程是在执行<init>(【…】)的实例初始化方法
什么时候执行?每次new对象时执行
执行哪个?看调用哪个构造器,看new后面
一个类有几个实例初始化方法?看这个类有几个构造器
实例初始化方法<init>(【…】),由编译自己组装而成:
(1)实例变量的显式赋值
(2)非静态代码块
(3)构造器
其中(1)和(2)时按照顺序组装,(3)无论如何都在最后。而且(1)和(2)是在每一个实例初始化方法中都有,而(3)只找对应构造器的
1 public class Demo{ 2 private int a = 1; 3 { 4 System.out.println("非静态代码块1"); 5 } 6 private int b = 1; 7 public Demo(){ 8 System.out.println("无参构造"); 9 } 10 public Demo(int a, int b){ 11 this.a = a; 12 this.b = b; 13 System.out.println("有参构造"); 14 } 15 { 16 System.out.println("非静态代码块2"); 17 } 18 }
1 public class Demo{ 2 private int a; 3 private int b; 4 5 <init>(){ 6 a = 1; 7 System.out.println("非静态代码块1"); 8 b = 1; 9 System.out.println("非静态代码块2"); 10 System.out.println("无参构造"); 11 } 12 <init>(int a, int b){ 13 a = 1; 14 System.out.println("非静态代码块1"); 15 b = 1; 16 System.out.println("非静态代码块2"); 17 this.a = a; 18 this.b = b; 19 System.out.println("有参构造"); 20 } 21 }
3、类初始化与实例初始化的顺序
一定是先完成类初始化,然后再实例初始化
标签:执行 不用 使用 顺序 col 本质 ini 默认 class
原文地址:https://www.cnblogs.com/daidai66/p/11992910.html