1

私はこの肯定に出くわしました.Javaのスコープとは何かという私の概念を変えました。C私のコンセプトは、「スコープは、宣言された変数にアクセスできるコードのセクションを指します」でした。

例:

public static void main(String[] args) {
    int x = 5;
    amIOutOfScope();        
    System.out.println("Am in the x variable scope again?");
}

private static void amIOutOfScope(){        
    System.out.println("am I outta scope? I can't access x here, Does it mean I'm outta scope?");
    //System.out.println(x);//wrong as hell
}

この断言は真実ですか?その場合、メソッド amIOutOfScope() に移動するとどうなりますか?変数 x の範囲外ですか? あなたはそれを何と呼びますか?. 誰か私にこれを明確にしてもらえますか?

更新: この確認は、SCJA Sun Certified Java Associate Study Guide - Exam CX-310-019 (McGraw-Hill、2009 年、第 5 章) 認定試験の質問番号 6 から取得した本に当てはまります。

4

4 に答える 4

4

Java での「スコープ」の定義は次のとおりです: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3

しかし、基本的にあなたのコンセプトは正しいです。スコープは、割り当てた名前が意味を持つコードの領域です。

于 2013-02-16T00:45:28.673 に答える
0

メソッドamIOutOfScopeは、パラメーターやクラス レベルの変数を含む、メソッド内で定義された変数のみを表示できます。ここでxはその基準を満たしていません。

于 2013-02-16T00:57:05.577 に答える
0

スコープを 2 つの主要なカテゴリに分類できます。

ローカル

これらの変数は関数内にあります。それらは、その関数内からのみアクセスできます。

ローカル変数は、ブロックとも呼ばれる、それらを囲む{およびに制限されます。}また、宣言前および特定の代入前にはアクセスできません。これが意味することは

{
    //aVar is not accessible here
    {
        //aVar is not accessible here
        Object aVar;
        //aVar access will not compile
        if(aCond()) aVar = new Object();
        //aVar access will not compile unless you did if(true)
        aVar = new Object();
        //aVar is accessible here
        {
            //aVar is accessible here
        }
        //aVar is accessible here
    }
    //aVar is not accessible here
}
{
    //aVar is not accessible here
}

別のメソッドは別の括弧のセットになるため、範囲外です。

そうでもなければ...

グローバル

グローバル変数は、ファイル全体で常にアクセスできます。グローバル変数は、クラスのブロック内で関数の外で宣言されるため、すべてのブロックがそれらにアクセスできます。FileName.variableグローバル変数には、またはでアクセスできますobjectName.variable。ファイル名またはオブジェクトの名前のどちらを使用するかは、それが使用されるかどうかによって異なりますstatic

さらに、メソッドはグローバル スコープの影響も受けます。

グローバル変数の例を次に示します。

public class Foo {
    public static int bar = 10;
    public static void main(String[] args) {
        System.out.println(bar);
    }
}

静的

変数が のstatic場合、そのオブジェクトのすべてのインスタンスで定数です。(すべての Java ファイルは実際にはオブジェクトであることを思い出してください)

変数が でないstatic場合、そのオブジェクトのインスタンスごとに一意です。

それは実際の範囲ではありませんが

プライベート/パブリック/パッケージ プライベート

でマークされているものはprivateすべて、ファイル全体でアクセスできますが、ファイルのみにアクセスできます。これはstaticCのようなものです。

でマークされているものはpublicすべて、どのファイルからでもアクセスできます。externこれはC からのものに似ています。

たとえば、マークされていないものint x;はパッケージ非公開と見なされます。これは、同じパッケージ (フォルダー) 内のすべてのファイルがアクセスできることを意味します。したがって、パッケージ内にある場合Foo.bar()、パッケージ内x.yの他のクラスはx.yを呼び出すことができますがFoo.bar()、内のクラスは呼び出すx.zことができません。

于 2013-02-16T00:55:10.237 に答える
0

メソッド変数のスコープは、JVM のスタック領域に関連しています...

したがって、ここでは main メソッドのスタック空間に x 変数があります...しかし、それが amIOutOfScope() メソッドに入ると..変数が存在しない別のスタック空間を参照します....

したがって、変数がスコープ外になったという意味ではありません...

amIOutOfScope().. から戻ると、変数 x がまだ存在する main メソッドのスタック空間に戻ります...

于 2013-02-16T00:46:23.437 に答える