一,成员变量初始化方式
前提:java保证所有的成员变量有一个默认初值(0,false,null),这就是所谓的自动初始化
1、在声明中赋值;
*例:private int i = 1;
private String name = "";
private Object = new Object();
*也可以调用类中的方法来提供初值
*方法还可以带参数
public Class InitByMethod
{
private int i = f();
private int j = g(2);
public int f()
{
return 1;
}
public int g(int n)
{
return n;
}
}
2、在构造器中设置值;
。。。
3、初始化块;
*例: public class Employee
{
private int id;
private Name name;
//初始化块
{
id=0;
name=new Name()
}
}
class Name
{
private String firstName;
private String lastName;
Name() {
System.out.print("First-Last-Name");
}
}
*初始化块的执行时机:
只要构造类的对象,这些块就会被执行,然后再运行构造器的主体;
*执行的次数:
多次,即只要调用构造器(无论哪个构造器),初始化块都会被执行一次;
4、静态初始化;
**在声明时给静态成员变量赋值
***例 :
private static int i = 1;
private static Employee em=new Employee();
***注意 没有静态局部变量,即static关键字不能用于局部变量;
**静态初始化块
***例:public class Employee
{
private static int id;
private static Name name;
//静态初始化块
static {
id=0;
name=new Name()
}
}
class Name
{
private String firstName;
private String lastName;
Name() {
System.out.print("First-Last-Name");
}
}
*静态初始化的执行时机:
当首次生成这个类的一个对象的时(即类第一次加载时),或者首次访问属于那个类的静态数据成员时
*静态初始化的执行次数:
仅仅执行一次(类第一次加载时)
二、局部变量的初始化方式
对于方法的局不变量,java以编译时错误的形式来贯彻这种保证
三、初始化数据的顺序;
当新建一个对象时(new一个对象);new Dog();
1、所有的数据域自动初始化为默认值(0,false,null)(在堆上为这个对象分配存储空间,这块存储空间会被清零)
2、加载Dog.class类,按声明顺序依次执行静态初始化(声明中为静态成员变量赋值,静态初始化块)
3、按照在声明中出现的顺序,依次执行非静态初始化(声明中为非静态变量赋值,初始化块)
4、如果在构造器的第一行调用了第二构造器,则执行第二个构造器
5、执行这个构造器