# Lambda的范圍
對于lambdab表達式外部的變量,其訪問權限的粒度與匿名對象的方式非常類似。你能夠訪問局部對應的外部區域的局部final變量,以及成員變量和靜態變量。
#### 訪問局部變量
我們可以訪問lambda表達式外部的final局部變量:
```
final int num = 1;
Converter<Integer, String> stringConverter =
(from) -> String.valueOf(from + num);
stringConverter.convert(2); // 3
```
但是與匿名對象不同的是,變量num并不需要一定是final。下面的代碼依然是合法的:
```
int num = 1;
Converter<Integer, String> stringConverter =
(from) -> String.valueOf(from + num);
stringConverter.convert(2); // 3
```
然而,num在編譯的時候被隱式地當做final變量來處理。下面的代碼就不合法:
```
int num = 1;
Converter<Integer, String> stringConverter =
(from) -> String.valueOf(from + num);
num = 3;
```
在lambda表達式內部企圖改變num的值也是不允許的。
#### 訪問成員變量和靜態變量
與局部變量不同,我們在lambda表達式的內部能獲取到對成員變量或靜態變量的讀寫權。這種訪問行為在匿名對象里是非常典型的。
```
class Lambda4 {
static int outerStaticNum;
int outerNum;
void testScopes() {
Converter<Integer, String> stringConverter1 = (from) -> {
outerNum = 23;
return String.valueOf(from);
};
Converter<Integer, String> stringConverter2 = (from) -> {
outerStaticNum = 72;
return String.valueOf(from);
};
}
}
```
#### 訪問默認接口方法
還記得第一節里面formula的那個例子么? 接口Formula定義了一個默認的方法sqrt,該方法能夠訪問formula所有的對象實例,包括匿名對象。這個對lambda表達式來講則無效。
默認方法無法在lambda表達式內部被訪問。因此下面的代碼是無法通過編譯的:
```
Formula formula = (a) -> sqrt( a * 100);
```