2013-02-16 67 views
2

我偶然發現了這個肯定,它改變了我對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的範圍?你會怎麼稱呼它?有誰能向我澄清這件事嗎?

UPDATE: 這afirmation是書SCJA Sun認證Java助理學習指南真正的 - 考試CX-310-019從認證考試題號6

採取(麥格勞 - 希爾,2009年,第5章)
+2

我沒有看到真正的問題。 – 2013-02-16 00:42:18

+0

http://en.wikipedia.org/wiki/Scope_%28computer_science%29 – 2013-02-16 00:44:15

+0

http://www.cs.berkeley.edu/~jrs/4/lec/08 – user1428716 2013-02-16 00:46:24

回答

3

的在Java「範圍」的定義是在這裏:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3

但基本上你的理念是正確的。範圍是您分配的名稱具有含義的代碼區域。

+1

所以如果我在函數amIOutOfScope()。我會超出範圍,因此肯定「當一個變量超出範圍,它不能回到範圍」是錯誤的? – PbxMan 2013-02-16 00:46:59

+1

「你」不在範圍之內。變量(或者實際上任何標識符)都有一個作用域(local/class/class static),我們說它在代碼中的不同位置或範圍內。 – 2013-02-16 00:50:34

+0

也許你被你的術語絆倒了..你不會超出範圍。當您調用amIOutOfScope方法時,會發生什麼情況是您創建了新的作用域(堆棧框架,如amit所示)。然後,「你」(執行線程)轉到新的範圍。該變量不在當前範圍內,但仍在您留下的範圍內,並且在您的方法返回時它將在那裏。 – Gus 2013-02-16 00:51:18

1

方法在JVM中的堆棧空間的變量範圍涉及...

所以這裏主要方法的堆棧空間有x變量...但一旦進去amIOutOfScope()method..we指不同的堆棧空間....其中變量不存在....

所以它並不意味着變量出去的範圍......

當你從amIOutOfScope()返回..你回去堆變量x仍然存在的主要方法的空間...

0

我們可以將範圍分爲兩大類:

本地

這些變量的函數。他們只能從該功能中訪問。

局部變量限於它們的封閉{},也稱爲塊。在申報之前和某些任務之前,他們也無法進入。我的意思是

{ 
    //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.variableobjectName.variable。您是否使用文件名或對象的名稱取決於它是否爲static

此外,方法也受全球範圍的影響。

這裏是一個全局變量的一個示例:

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

靜態

如果變量是static然後它是該對象的所有實例是恆定的。 (請記住,所有的Java文件都是真正的對象)

如果變量不是static,那麼它對於該對象的每個實例都是唯一的。

這不是一個真正的範圍雖然

標有private私人/公共/包專用

什麼是整個文件,但只有文件訪問。這類似於C的static

任何標有public的內容均可從任何文件訪問。這類似於來自C的extern

任何未標記的內容,例如int x;被視爲包私有。這意味着同一個包(文件夾)中的任何文件都可以訪問它。因此,如果我在x.y包中有Foo.bar(),包x.y中的任何其他類都可以調用Foo.bar(),但x.z中的類不能。

0

方法amIOutOfScope只能看到方法中定義的變量,包括參數和類級變量。這裏x不符合該標準。