2016-01-29 25 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