码迷,mamicode.com
首页 > 其他好文 > 详细

初始化

时间:2019-12-06 09:32:46      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:执行   不用   使用   顺序   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!