スコープ
日本語 | 有効範囲 |
英語 | scope |
ふりがな | すこーぷ |
フリガナ | スコープ |
特定の変数の、その使用できる範囲。
変数は、宣言された箇所やアクセスコントロールによって「その変数を使用できる範囲」が決められる。
たとえばローカル変数であれば宣言されたブロック内のみである。
また、フィールドはアクセスコントロールによって決められる。ただし、フィールドに関しては「スコープ」という表現は使用しないことの方が多い。これは、スコープが「変数の寿命」と同意である場合が多いためである。
スコープは、あくまで「変数の使用範囲」が決められるだけである。
変数が参照型の場合、参照しているインスタンスは変数のスコープとは全く関係なく生き残ることに注意。
その点を考えると、スコープはむしろ「ブロック内でのプリミティブ型変数」にのみ当てはまるものであり、前時代的な表現のひとつとも言える。
変数は、宣言された箇所やアクセスコントロールによって「その変数を使用できる範囲」が決められる。
たとえばローカル変数であれば宣言されたブロック内のみである。
また、フィールドはアクセスコントロールによって決められる。ただし、フィールドに関しては「スコープ」という表現は使用しないことの方が多い。これは、スコープが「変数の寿命」と同意である場合が多いためである。
スコープは、あくまで「変数の使用範囲」が決められるだけである。
変数が参照型の場合、参照しているインスタンスは変数のスコープとは全く関係なく生き残ることに注意。
その点を考えると、スコープはむしろ「ブロック内でのプリミティブ型変数」にのみ当てはまるものであり、前時代的な表現のひとつとも言える。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
// フィールドはアクセスコントロールによって
// スコープが決定されます。
// (フィールドの場合は「スコープ」という表現は
// 使わない方が多いです)
public static void main( String[] args )
{
// なんでもないブロックの例。
{
// int型変数を宣言します。
int i = 100;
// iのスコープはここから。
// iのスコープはここまで。
}
// ブロックの外に出たのでiのスコープの範囲外です。
// System.out.println( i );
// コンパイルエラー:
// i は解決できません。
// 上記の例は、ブロックがifやforといったステートメントでも、
// メソッドでも、同じように当てはまります。
// スコープはあくまで「変数」に対してのみ当てはまることに注意。
// 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しても、ブロックの外でも生き続けます。
}
}
public class Sample
{
// フィールドはアクセスコントロールによって
// スコープが決定されます。
// (フィールドの場合は「スコープ」という表現は
// 使わない方が多いです)
public static void main( String[] args )
{
// なんでもないブロックの例。
{
// int型変数を宣言します。
int i = 100;
// iのスコープはここから。
// iのスコープはここまで。
}
// ブロックの外に出たのでiのスコープの範囲外です。
// System.out.println( i );
// コンパイルエラー:
// i は解決できません。
// 上記の例は、ブロックがifやforといったステートメントでも、
// メソッドでも、同じように当てはまります。
// スコープはあくまで「変数」に対してのみ当てはまることに注意。
// 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しても、ブロックの外でも生き続けます。
}
}
// Sample.java public class Sample { // フィールドはアクセスコントロールによって // スコープが決定されます。 // (フィールドの場合は「スコープ」という表現は // 使わない方が多いです) public static void main( String[] args ) { // なんでもないブロックの例。 { // int型変数を宣言します。 int i = 100; // iのスコープはここから。 // iのスコープはここまで。 } // ブロックの外に出たのでiのスコープの範囲外です。 // System.out.println( i ); // コンパイルエラー: // i は解決できません。 // 上記の例は、ブロックがifやforといったステートメントでも、 // メソッドでも、同じように当てはまります。 // スコープはあくまで「変数」に対してのみ当てはまることに注意。 // 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しても、ブロックの外でも生き続けます。 } }