Java类成员初始化与C++初始化的方式有很多不同,这部分知识相对比较基础,从而导致很多Java程序员对于Java类初始化机制不甚了了。下面就Java类成员初始化方式做一个梳理,希望对大家有益。
一、 所有变量使用前都要得到恰当的初始化
Java尽力保证:所有变量在使用前都得到恰当的初始化。
对于类成员变量,Java按照自动初始化的方式,如果是基本成员变量就赋值0,其他赋值null;
对于方法内部的局部变量,如果未赋值就直接使用的话,Java以编译时错误的形式形成错误报告,告诉你某个变量没有被初始化。
Java通过这种方式保证变量在使用前都是赋值的,这样就避免了C++中因为忘记变量初始化而产生的错误。
二、 指定初始化
Java有一种很直接的赋值方法,就是在定义类成员变量的地方为其赋值(C ++里是不能这样做的,尽管C++新手们总是想这样做)。
public class InitValue{
boolean bool = true;
char ch = 'x';
short s = 0xff;
float f = 3.14f;
double d = 3.1415926;
}
甚至可以通过调用方法来提供初始值,如果方法带参数的话,参数必须是之前被初始化了的:
public class MethodInit{
int i = f();
int j = g(i);
int f(){return 11;};
int g(intn){return n * 10;};
}
注意参数的初始化顺序,如果将int i= f();写到int j = g(i);之后就会出现编译错误,因为初始化j时的参数还没有被初始化,编译器认为这种向前引用是不正确的。
通过指定初始化,Java类的对象都会具有相同的初始值。如果我们希望构造不同初始化值得对象,可以通过构造函数达到这一目的。
三、 构造器初始化
我们可以通过带有参数的构造函数来构造Java 对象,通过输入不同的参数使得Java对象具有不同初始值。但要明确一点:无法阻止自动初始化的进行,它将在构造器被调用之前发生。如下代码:
public class Counter {
int i;
public Counter() {
i = 10;
}
}
变量域i会被自动初始化为0,然后被构造器赋值为10。
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。
四、 静态数据的初始化
静态数据属于类,只占用一份存储区域。静态初始化只有在必要时才会进行。当创建对象或者第一次访问静态数据时,它们才会被初始化,此后,静态对象不会再被初始化。