2013-04-12 31 views
2

我对Java中的局部变量和成员变量有疑问。情况是:有时如果我定义一个局部变量,那么该变量必须被传递到几个方法调用级别。我经常想,为什么要为类定义一个成员变量,以便该类中的变量可用。类的成员变量就像一个全局变量,可以在类中随处访问。Java中的局部变量或成员变量

  1. 这种情况下的最佳做法是什么?或者什么是正确的做法?

  2. 如果我将它定义为一个成员变量,它应该是一个静态或非静态变量?

回答

0
  1. 如果你决定宣布一个成员变量,那么你应该考虑的变量的作用域。如果您只是减少内部方法调用的参数数目,我会考虑将变量声明为private

  2. 你应该小心使用Static的,因为类的每个实例都将使用该变量的同一副本。

0

它是行为型的。如果变量是类属性的一部分,即表征类行为的特征,则将其定义为类成员变量,否则在方法内部定义局部变量。

在我看来,传递参数不会影响属性类型定义。

5

成员变量保持特性 - 属性是另一个词 - 在由类来表示你的程序的“东西”。如果你的变量持有这样的东西,使它成为一个成员变量;如果没有,不要。

静态变量保持类本身的特性,而不是该类的对象的特性。

不要做出决定根据是否“通...到方法调用的几个层次。

+0

要添加到此...请记住,您可以将参数从一个方法传递到同一个类中的另一个方法。另一方面,如果很多方法需要访问同一个变量,那么它很可能是一个成员变量。 –

+1

我同意它应该是,但我认为这是从错误的方向看它。如果你通过他们的方法如何设计你的类,你可以自下而上,并且*试着*通过检查单个树来查看森林。在你写*任何方法之前,应该决定什么成员变量;如果你有什么东西被“很多”传递,那么看看整个设计;也许还有别的东西应该是一个阶级,而不是。请记住,本身并没有错,通过很多方法传递变量。 – arcy

+0

我同意你的意见;我应该说,“你应该重新评估你的设计,看它是否应该是一个成员变量”,而不是“它应该是一个成员变量”。 –

0

这要看情况。

如果你希望所有(或几个),你的方法访问相同的成员变量,然后在类声明它。

静态或不依赖于阉该信息属于类(静态),或者对类(非静态)的一个实例。

0

1.)如果你打算用多种方法来使用它,并且需要t将它传递给其成员变量。如果只是为了这个方法而使它变成本地的。

2.)static意味着它们的只有一个被一切之间共享变量的实例。因此,例如,我有一个totalGameScore变量,无论发生什么,它都会保持我整个游戏的得分。你会想让这个变量static。除此之外,可以说我有一个health变量为我的敌人。每个敌人将拥有自己的health,所以我不会让这个变量static

您还可以声明成员变量private,以便其他类无法访问它们。 Constants通常应该始终是成员变量。

2

你的一般问题的思考,我想出了从我的经验,这些准则:

  • 使用最小poosible范围。如果一个局部变量很好,那么为什么使用一个成员变量?
  • 根据域对类进行建模。如果你有价值并且是类责任的一部分,那么将它建模为类成员似乎是合适的。

第二个问题:我通常将静态变量定义为最终的常量。多线程环境中的非最终静态成员可能很容易引入竞争条件。如果需要,更容易访问非静态成员线程安全的。

+0

将静态变量视为“最终”,但通常该变量必须更改。例如,你有一个ArrayList,其大小在调用某些方法时保持不断变化。所以,最终应该用在极限上。例如,你有一个该变量的静态初始化,那么你知道它在程序运行期间不会改变。对? – user697911

+0

声明一个ArrayList作为最终的静态成员,并且仍然可以从ArrayList添加或删除对象。最终的静态成员不能被重新分配=>对ArrayList的引用不能被修改。可以理解的? – remipod

+0

下面是一个很好的解释:http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html如果你想让静态最终的ArrayList不可修改,请检查这个方法http://docs.oracle。 COM/JavaSE的/ 6 /文档/ API/JAVA/util的/ Collections.html#unmodifiableList(java.util.List中) – remipod