ローカル変数
日本語 | 局所変数 |
英語 | local variable |
ふりがな | ろーかるへんすう |
フリガナ | ローカルヘンスウ |
メソッド内で宣言された、最も一般的な変数。
メソッドの中で宣言された、もしくはメソッドの引数として宣言された変数。
ただし、引数は「ローカル変数」とは呼ばない事の方が多い。
フィールド以外の変数、ということも言える。
ローカル変数はメソッドの中のどの行でも宣言することができる。
ただし、変数の使用範囲である「スコープ」は、宣言した箇所によって異なる。ローカル変数のスコープは、宣言した箇所から、宣言した箇所のブロックの最後まで、となる。
これはブロックであれば全て該当し、メソッドにも当てはまる。そのため、ローカル変数はメソッドの外から使用することはできない。
使用できなくなったローカル変数を再使用することはできないため、スコープから外れた時点でローカル変数は「死んだ」と見なされる。これがローカル変数の「寿命」である。
ただし、これらはあくまでも「変数」に対しての制限であり、変数が参照するクラスや配列のインスタンスには全く影響しない。
宣言したローカル変数が「参照型」の場合、その参照型変数はブロックから抜ければ寿命が来て消えてしまうが、参照先のインスタンスはまだ生きているため使用することができる。
そのため、ローカル変数のスコープや寿命はあくまで「変数」のみに適用されることを忘れないこと。
ローカル変数の変数宣言そのものを「ローカル変数宣言」と言う。
ローカル変数宣言は、ブロック内、もしくはforステートメントのfor初期化ステートメントでのみ行うことができる。
たとえば、通常のステートメント内ではローカル変数の宣言を行うことはできない。
詳しい形式については「変数宣言」を参照。
「メソッドの引数」もローカル変数とほぼ同様の性質を持つ。
メソッドの中で宣言された、もしくはメソッドの引数として宣言された変数。
ただし、引数は「ローカル変数」とは呼ばない事の方が多い。
フィールド以外の変数、ということも言える。
ローカル変数はメソッドの中のどの行でも宣言することができる。
ただし、変数の使用範囲である「スコープ」は、宣言した箇所によって異なる。ローカル変数のスコープは、宣言した箇所から、宣言した箇所のブロックの最後まで、となる。
これはブロックであれば全て該当し、メソッドにも当てはまる。そのため、ローカル変数はメソッドの外から使用することはできない。
使用できなくなったローカル変数を再使用することはできないため、スコープから外れた時点でローカル変数は「死んだ」と見なされる。これがローカル変数の「寿命」である。
ただし、これらはあくまでも「変数」に対しての制限であり、変数が参照するクラスや配列のインスタンスには全く影響しない。
宣言したローカル変数が「参照型」の場合、その参照型変数はブロックから抜ければ寿命が来て消えてしまうが、参照先のインスタンスはまだ生きているため使用することができる。
そのため、ローカル変数のスコープや寿命はあくまで「変数」のみに適用されることを忘れないこと。
ローカル変数の変数宣言そのものを「ローカル変数宣言」と言う。
ローカル変数宣言は、ブロック内、もしくはforステートメントのfor初期化ステートメントでのみ行うことができる。
たとえば、通常のステートメント内ではローカル変数の宣言を行うことはできない。
詳しい形式については「変数宣言」を参照。
「メソッドの引数」もローカル変数とほぼ同様の性質を持つ。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// なんでもないブロックの例。
{
// int型変数をiを宣言します。これがローカル変数になります。
int i = 100;
// iのスコープはここから。
// iのスコープはここまで。
}
// ブロックの外に出たのでiのスコープの範囲外です。
// System.out.println( i );
// コンパイルエラー:
// i は解決できません。
// 上記の例は、ブロックがifやforといったステートメントでも、
// メソッドでも、同じように当てはまります。
// ブロックから抜けた時点でiは寿命が来て死んだと考えます。
// なので、ローカル変数iを新たに宣言することができます。
int i = 200;
System.out.println( i );
// 200
// 同じスコープの中で、同じ名前のローカル変数を複数宣言することはできません。
// int i = 300;
// コンパイルエラー:
// 重複ローカル変数 i
// スコープはあくまで「変数」に対してのみ当てはまることに注意。
// Integerクラス参照型変数を用意します。
Integer integer = null;
// この参照型変数にインスタンスの参照をブロック内でセットします。
{
// まず、もうひとつIntegerクラス参照型変数を用意し、
// Integerクラスのインスタンスへの参照を格納します。
Integer integer2 = new Integer( 100 );
// integer2のスコープはここから。
// integer2の中に格納されている、さっきnewしたIntegerクラスの
// インスタンスへの参照をintegerにコピーします。
integer = integer2;
// これで、インスタンスへの参照はintegerとinteger2の
// 両方に格納されました。
// integer2のスコープはここまで。
}
// integerには、ブロック内でnewしたIntegerクラスのインスタンスへの
// 参照が格納されています。
System.out.println( integer.toString() );
// 100
// このように、ブロック内でnewしても、ブロックの外でも生き続けます。
// useLocal()メソッドを呼び出します。
Sample sample = new Sample();
int result = sample.useLocal();
System.out.println( result );
// 400
// ここで、useLocal()メソッド内のローカル変数iはすでに
// 寿命が来て死んでいます。なので、iは使用できません。
// resultには、iの中に格納されていた値400のコピーが
// 格納されているに過ぎません。
// ローカル変数宣言は、ブロック内、もしくはfor初期化ステートメント
// にのみ記述できます。
// たとえば、通常のステートメントの中に記述することはできません。
// 以下は、ステートメントのひとつ「代入」の中で
// ローカル変数宣言を行う例です。
// i = int i2 = 100;
// コンパイルエラー:
// トークン "i2" に構文エラーがあります。正しくは ".", "[" です。
}
/**
* ローカル変数を使うメソッド。
*/
private int useLocal()
{
// ローカル変数iを宣言します。
int i = 400;
// iのスコープはここから。
return i;
// iのスコープはここまで。
}
}
public class Sample
{
public static void main( String[] args )
{
// なんでもないブロックの例。
{
// int型変数をiを宣言します。これがローカル変数になります。
int i = 100;
// iのスコープはここから。
// iのスコープはここまで。
}
// ブロックの外に出たのでiのスコープの範囲外です。
// System.out.println( i );
// コンパイルエラー:
// i は解決できません。
// 上記の例は、ブロックがifやforといったステートメントでも、
// メソッドでも、同じように当てはまります。
// ブロックから抜けた時点でiは寿命が来て死んだと考えます。
// なので、ローカル変数iを新たに宣言することができます。
int i = 200;
System.out.println( i );
// 200
// 同じスコープの中で、同じ名前のローカル変数を複数宣言することはできません。
// int i = 300;
// コンパイルエラー:
// 重複ローカル変数 i
// スコープはあくまで「変数」に対してのみ当てはまることに注意。
// Integerクラス参照型変数を用意します。
Integer integer = null;
// この参照型変数にインスタンスの参照をブロック内でセットします。
{
// まず、もうひとつIntegerクラス参照型変数を用意し、
// Integerクラスのインスタンスへの参照を格納します。
Integer integer2 = new Integer( 100 );
// integer2のスコープはここから。
// integer2の中に格納されている、さっきnewしたIntegerクラスの
// インスタンスへの参照をintegerにコピーします。
integer = integer2;
// これで、インスタンスへの参照はintegerとinteger2の
// 両方に格納されました。
// integer2のスコープはここまで。
}
// integerには、ブロック内でnewしたIntegerクラスのインスタンスへの
// 参照が格納されています。
System.out.println( integer.toString() );
// 100
// このように、ブロック内でnewしても、ブロックの外でも生き続けます。
// useLocal()メソッドを呼び出します。
Sample sample = new Sample();
int result = sample.useLocal();
System.out.println( result );
// 400
// ここで、useLocal()メソッド内のローカル変数iはすでに
// 寿命が来て死んでいます。なので、iは使用できません。
// resultには、iの中に格納されていた値400のコピーが
// 格納されているに過ぎません。
// ローカル変数宣言は、ブロック内、もしくはfor初期化ステートメント
// にのみ記述できます。
// たとえば、通常のステートメントの中に記述することはできません。
// 以下は、ステートメントのひとつ「代入」の中で
// ローカル変数宣言を行う例です。
// i = int i2 = 100;
// コンパイルエラー:
// トークン "i2" に構文エラーがあります。正しくは ".", "[" です。
}
/**
* ローカル変数を使うメソッド。
*/
private int useLocal()
{
// ローカル変数iを宣言します。
int i = 400;
// iのスコープはここから。
return i;
// iのスコープはここまで。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // なんでもないブロックの例。 { // int型変数をiを宣言します。これがローカル変数になります。 int i = 100; // iのスコープはここから。 // iのスコープはここまで。 } // ブロックの外に出たのでiのスコープの範囲外です。 // System.out.println( i ); // コンパイルエラー: // i は解決できません。 // 上記の例は、ブロックがifやforといったステートメントでも、 // メソッドでも、同じように当てはまります。 // ブロックから抜けた時点でiは寿命が来て死んだと考えます。 // なので、ローカル変数iを新たに宣言することができます。 int i = 200; System.out.println( i ); // 200 // 同じスコープの中で、同じ名前のローカル変数を複数宣言することはできません。 // int i = 300; // コンパイルエラー: // 重複ローカル変数 i // スコープはあくまで「変数」に対してのみ当てはまることに注意。 // Integerクラス参照型変数を用意します。 Integer integer = null; // この参照型変数にインスタンスの参照をブロック内でセットします。 { // まず、もうひとつIntegerクラス参照型変数を用意し、 // Integerクラスのインスタンスへの参照を格納します。 Integer integer2 = new Integer( 100 ); // integer2のスコープはここから。 // integer2の中に格納されている、さっきnewしたIntegerクラスの // インスタンスへの参照をintegerにコピーします。 integer = integer2; // これで、インスタンスへの参照はintegerとinteger2の // 両方に格納されました。 // integer2のスコープはここまで。 } // integerには、ブロック内でnewしたIntegerクラスのインスタンスへの // 参照が格納されています。 System.out.println( integer.toString() ); // 100 // このように、ブロック内でnewしても、ブロックの外でも生き続けます。 // useLocal()メソッドを呼び出します。 Sample sample = new Sample(); int result = sample.useLocal(); System.out.println( result ); // 400 // ここで、useLocal()メソッド内のローカル変数iはすでに // 寿命が来て死んでいます。なので、iは使用できません。 // resultには、iの中に格納されていた値400のコピーが // 格納されているに過ぎません。 // ローカル変数宣言は、ブロック内、もしくはfor初期化ステートメント // にのみ記述できます。 // たとえば、通常のステートメントの中に記述することはできません。 // 以下は、ステートメントのひとつ「代入」の中で // ローカル変数宣言を行う例です。 // i = int i2 = 100; // コンパイルエラー: // トークン "i2" に構文エラーがあります。正しくは ".", "[" です。 } /** * ローカル変数を使うメソッド。 */ private int useLocal() { // ローカル変数iを宣言します。 int i = 400; // iのスコープはここから。 return i; // iのスコープはここまで。 } }