2016-01-29 78 views
0

使用對象我有MainActivity類別及1級。在class1中,我有類似的東西其他類

public void ownedAdd(int a) 
{ 
    owned = owned +a; 
} 

很簡單。但是當我想在MainActivity中調用此方法時

Class1 obj1 = new Class1(); 
    Button button1 = (Button) findViewById(R.id.button1); 

    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      obj1.ownedAdd(10); 
     } 
    }); 

而在這個地方我有幾個問題。 Android Studio聲稱obj1需要聲明爲final。我不喜歡那樣。我想要做的是在main方法中使用class1對象。那可能嗎?我想讓幾個class1的對象每個都有一些變量作爲價格,擁有等,我不知道如何。對於任何幫助,非常感謝;)

+2

你爲什麼不只是聲明爲final? – khelwood

+1

「我不喜歡那樣。」爲什麼不?你不喜歡它什麼?它沒有幫助,你沒有顯示'main'方法或類似的東西...... –

+0

這是一個正確的方法嗎? –

回答

0

問題是,在JAVA中,除非變量在方法中聲明爲final,否則變量本身不能在JAVA中從方法訪問變量到方法中的匿名類全球的父級。

解決您的問題,設置obj1變量是全球性的。喜歡的東西:

public class MainActivity extends AppCompatActivity { 
    //Declare the obj1 object here 
    Class1 obj1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     //inflate layout and do other stuff 

     //from where you posted 
     obj1 = new Class1(); 
     Button button1 = (Button) findViewById(R.id.button1); 

     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       obj1.ownedAdd(10); 
      } 
     }); 
    } 
} 
+0

這不是「全局」,它只是「MainActivity」的成員變量。這樣做的缺點是它處於一個不必要的廣泛範圍 - 除了按鈕點擊監聽器改變值之外,您還必須擔心其他問題。只是爲了使局部變量最終更清晰。或者,就此而言,使其成爲匿名點擊偵聽器的成員變量。 –

+0

嗯,我們都知道在JAVA中沒有什麼叫「全局」,我的意思是它的範圍是整個類。這個答案是對發佈的關於不使用final的問題的回答,我甚至留下了一條評論,指出「最終」對象同樣適合他的任務。而且我不會認同這是一個缺點,因爲假設他以後需要從其他方法訪問對象,那麼這是唯一可行的解​​決方案,而不是必須在每次方法調用時傳遞對象。 –

+0

如果您知道這是不正確的術語,請不要使用它:)使用無意義的術語可能會混淆初學者。 –

0

從給定的代碼,你不需要提及比點擊收聽其他Class1實例,所以你可以簡單地使它的View.OnClickListener的成員變量:

button1.setOnClickListener(new View.OnClickListener() { 
     final Class1 obj1 = new Class1(); 

     @Override 
     public void onClick(View v) { 
      obj1.ownedAdd(10); 
     } 
    }); 

(雖然它仍然是值得使其最終)。

但是,它不是超級有用的樣子,因爲只有點擊監聽器可以訪問實例 - 你不能在其他控件中顯示的值,例如。最簡單的做法是使當前的局部變量final