我应该在哪里声明我的变量?

use*_*961 5 java android scope

在类的开头声明我的变量时,我不能在其他方法的条件语句中使用它们.我尝试在它工作的方法中声明它们但我不能使用方法之外的变量.

这是我的代码示例

protected void onClick(View v){
  switch(v.getId()){        
    int counter;
    case R.id.btsend:
      for (int i = 0;i<=0;i++){          
        if (true)
          counter += 1;          
      }

    TextView.setText(counter);

    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

这里没有"一刀切"的答案,因为声明变量有不同的原因.

静态变量(在类中直接使用static修饰符声明)是类范围的,而不是特定于单个实例.通常静态变量是final- 可变的全局状态是一个棘手的业务.

实例变量(直接在类中声明)用于记录对象的状态.它们将在每个实例方法中可用.

(实例和静态变量都是字段.)

局部变量(在构造函数或方法中声明)仅在该方法中可用,并且实际上是"临时"数据,仅对该单个方法调用是必需的.(如果以递归方式调用该方法,则每个调用都会获得自己独立的变量集.)

因此,对于每个变量,请考虑它是否在逻辑上是对象状态的一部分,并在适当的位置声明它.一旦你确定了它是什么类型的变量,你就可以确定物理位置.对于字段,在文件顶部,中间或底部(确切地说)确切位置无关紧要.字段之间的排序在初始化方面很重要,但无论是在使用它的方法之前还是之后都无关紧要.一般来说,将所有字段声明在一个一致的位置通常是个好主意 - 我个人经常这样做:

class Foo
{
    // Static variables
    // Instance variables
    // Constructors
    // Methods
    // Nested types
}
Run Code Online (Sandbox Code Playgroud)

......但这只是一个惯例.

对于局部变量,在尽可能小的范围内尽可能晚地声明它们通常是个好主意.所以代替:

int i;
int x;
for (i = 0; i < 10; i++) {
    x = i * i;
    System.out.println(x);
}
Run Code Online (Sandbox Code Playgroud)

这可能是首选:

for (int i = 0; i < 10; i++) {
    int x = i * i;
    System.out.println(x);
}
Run Code Online (Sandbox Code Playgroud)

通过限制变量的范围,通常更容易推理它.

  • 坚持下去,我必须采取屏幕转储.Skeet的照片旁边有-1的答案.请不要在接下来的20秒内对此进行投票! (12认同)

Ste*_*n C 5

你需要声明变量

  • 在Java语法允许声明的地方,和

  • 在一个适合...... 的预期寿命的地方.

因此,在您的示例中,您无法counter在此处声明,因为switch语句的语法不允许它.但你可以把它放在switch声明之前.或者在方法之前,或之后.

接下来你需要问自己counter应该"活" 多久.如果假设它只在onClick运行时生存,那么它需要在onClick方法内声明.但是如果它只是为了对象的实例而存活......那么它应该是一个实例变量......并在类的顶部声明.

等等 ...

简而言之,正确的答案取决于你想要做什么......


(在这种情况下,如果counter应该计算点击次数..."这件事"......它可能应该是一个实例变量.它也可能是一个静态变量,模数可能是一个糟糕的设计选择,并且由于其他原因可能是不正确的.局部变量肯定是不正确的,作为点击计数器.)


Dak*_*hah -2

您可以在全球范围内声明它,以便在任何您想要的地方访问它。要在全局范围内声明它,请在外部声明它。

要定义全局变量,您可以使用 static 关键字

public class Global {
    public static int a;
    public static int b;
}
Run Code Online (Sandbox Code Playgroud)

现在您可以通过调用从任何地方访问 a 和 b

Global.a;

Global.b;
Run Code Online (Sandbox Code Playgroud)

如果你不知道如何声明全局变量,你可能需要谷歌一下

  • 如果有人想在任何地方访问变量,那么他们的程序设计就会出现一些严重的问题。由于您的背景是 C,所以让我向您指出 http://stackoverflow.com/q/176118/1081110,其中有许多反对使用全局变量的论点。让我添加一些我自己的内容。隔离使用全局变量的代码以对其进行单元测试可能非常困难。跟踪程序的哪些部分使用全局变量很困难,这造成了可维护性的噩梦。相互依赖的范围很大,这增加了复杂性...... (2认同)
  • ...并降低可维护性。它们使得将库集成到您的程序中,甚至将多个开发人员的工作集成在一起变得困难,因为不能保证不同的作者没有使用相同的全局变量名称。所以综上所述,全局变量的问题非常多;但即使他们没有,这也不是一个好的答案,因为您只提到了一种类型的变量。这表明全局变量是所有范围问题的正确答案,而事实是存在许多不同类型的范围问题,并且不同...... (2认同)
  • ...解决方案适合每个人。所以,嗯,-1 表示只能使用一种变量;umm -1 再次倡导一种导致代码难以遵循、难以维护和难以测试的变量。你要求投反对票的人解释他们的立场;邓肯和我已经这样做了。现在我想请支持者解释**他们的**立场。这个答案的优点在哪里? (2认同)