多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### [指定初始化](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e6%8c%87%e5%ae%9a%e5%88%9d%e5%a7%8b%e5%8c%96) 怎么给一个变量赋初值呢?一种很直接的方法是在定义类成员变量的地方为其赋值。以下代码修改了 InitialValues 类成员变量的定义,直接提供了初值: ~~~ // housekeeping/InitialValues2.java // Providing explicit initial values public class InitialValues2 { boolean bool = true; char ch = 'x'; byte b = 47; short s = 0xff; int i = 999; long lng = 1; float f = 3.14f; double d = 3.14159; } ~~~ 你也可以用同样的方式初始化非基本类型的对象。如果**Depth**是一个类,那么可以像下面这样创建一个对象并初始化它: ~~~ // housekeeping/Measurement.java class Depth {} public class Measurement { Depth d = new Depth(); // ... } ~~~ 如果没有为**d**赋予初值就尝试使用它,就会出现运行时错误,告诉你产生了一个异常(详细见"异常"章节)。 你也可以通过调用某个方法来提供初值: ~~~ // housekeeping/MethodInit.java public class MethodInit { int i = f(); int f() { return 11; } } ~~~ 这个方法可以带有参数,但这些参数不能是未初始化的类成员变量。因此,可以这么写: ~~~ // housekeeping/MethodInit2.java public class MethodInit2 { int i = f(); int j = g(i); int f() { return 11; } int g(int n) { return n * 10; } } ~~~ 但是你不能这么写: ~~~ // housekeeping/MethodInit3.java public class MethodInit3 { //- int j = g(i); // Illegal forward reference int i = f(); int f() { return 11; } int g(int n) { return n * 10; } } ~~~ 显然,上述程序的正确性取决于初始化的顺序,而与其编译方式无关。所以,编译器恰当地对"向前引用"发出了警告。 这种初始化方式简单直观,但有个限制:类**InitialValues**的每个对象都有相同的初值,有时这的确是我们需要的,但有时却需要更大的灵活性。