變數遮蔽 在程式設計中變數遮蔽英語variable shadowing或稱變數隱藏指的是當新變數與舊有變數同名此名稱暫時不再可用於存取舊有變數 通常此新變數會被定義於一作用域決策塊方法或內部類之中 以程式語言在解析識別碼即名稱而不只是變數的角度來看這就是名稱遮蔽而我們稱此舊有的變數被新變數遮蔽be shadowed by掉而新變數遮蔽了mask舊有的變數因為被遮蔽的名稱在後續使用上可能不便於判定它指向哪個變數所以此設計有時會迷惑使用者判定方法端看該程式語言如何進行名稱解析 ALGOL 是最早使用變數遮蔽此一設計的語言之一它是第一個使用程式塊來建立作用域的語言此設計也被其所衍生出的語言認可並採用其中就包含了 C C 和 Java C 則打破了這種傳承而允許在內部類與外部類之間方法與其包含的類之間執行變數遮蔽但不允許在 if 塊與其內的方法之間或switch块中的 case 陳述式之間進行變數遮蔽 有些語言有更多種遮蔽變數的模式例如 Kotlin 可以用函數內的變數遮蔽傳入的參數以及內部代碼塊的變數遮蔽外部代碼塊的變數而Java不允許這兩種模式但是此二語言都可以用傳遞給函數方法的參數來遮蔽類字段Class FieldRust 則允許相同代碼塊中透過重複聲明的方式來遮蔽變數 有些語言則是完全不允許變數遮蔽譬如 CoffeeScript