2013-10-23 231 views
2

我目前正在參加CSE的入門課程,並且有一些課堂材料的問題。在一個幻燈片,教授定義了這個方法:聲明變量和範圍

public int myMethod() 
{ 
    int retval, itemp = 100; 
    retval = itemp; 
    { 
    int retval, itemp = 75; 
    retval = itemp; 
    } 
    return retval; 
} 

從什麼教授說,retval的回報/持有值100,但是當我打開的Eclipse /命令行和寫的方法,它止跌不會編譯。它一直說retval被宣佈了兩次,因此不會編譯程序。對於這裏出了什麼問題的任何指導?另外,「retval = itemp」的含義是什麼? ?它們都被初始化爲相同的值,那麼這個線的目的是什麼?

+0

「它們都被初始化爲相同的值」? in line 「int retval,itemp = 100;」他們都沒有初始化爲相同的價值。只有itemp被初始化。如果您嘗試打印retval,則會顯示變量未初始化的錯誤。 如果寫入,兩個變量初始化爲相同的值retval = itemp = 100; – User42

+0

你的教授可能正在考慮c/C++,其中一個代碼塊{{}}可能有自己的*局部變量。 –

回答

1

Eclipse /命令行寫的方法,它不會編譯。它一直說retval被宣佈了兩次,因此不會編譯程序。

更好的也許會是代碼如下所示:

public class Foo { 
    int retval, itemp = 100; 


    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     System.out.println(foo.myMethod()); 
    } 

    public int myMethod() { 
     retval = itemp; 
     { 
     int retval, itemp = 75; 
     retval = itemp; 
     } 
     return retval; 
    } 
} 

此外,什麼是點 「RETVAL = ITEMP;」 ?

這設置retVal變量來保存一個值。


他們都初始化爲相同的值,所以是有該行目的?

不,他們不是。 itemp在兩個位置保存了一個不同的值。

+0

啊,這很有道理;我的教授寫的很混亂。爲了驗證,因爲retval和itemp是在myMethod()中重新聲明的,所以它們被認爲是局部變量,因此在「{}」之外不可見?謝謝你的幫助 – xheyhenry

+0

@xheyhenry:他們只在他們聲明的範圍內可見。 –

1

這不會編譯,因爲您不能在same scope中聲明兩次具有相同identifier的變量。

什麼你可以做的是在給定的範圍內重新聲明現有變量:

class MyClass { 
    private int myVar = 1; 

    public void redeclare() { 
    // ... 
    int myVar = 2; 
    System.out.println(myVar); 
    // ... 
    } 
} 

這工作,因爲myVar的是在redeclare()範圍visible,但它並沒有宣佈!

{}沒有創建一個全新的範圍,所以你的老師想要做的失敗。

此外:

int retval, itemp = 100; 
retval = itemp; 

這裏的第一行聲明都RETVAL ITEMP 但僅初始化 ITEMP所以RETVAL未初始化。這就是爲什麼第二行將itemp值分配給它的原因。但是由於這些是原始值它將複製itemp的值並將它放在堆棧上,所以現在您有2個不同的值。改變一個不會改變另一個。

沒有冒犯教授。但如果我是你,我會放棄這些幻燈片,並抓住一本關於Java的好書(核心Java或Java中的Thinking)以及CS書籍的一些介紹(因爲這是本課程的目標?)像「計算機程序的結構和解釋」。

+0

感謝您的回覆,我最初以爲int retval,itemp = 100;初始化BOTH變量。 – xheyhenry