java中的静态概念

时间:2013-01-30 21:46:02

标签: java variables object interface static

我似乎无法理解静态关键字(java),因此我在Google上搜索了一下thread,但我确信答案是确凿的并且明确 - 总是在这里 - 我似乎没有理解它有两个原因;我不是母语为英语的人,语言对我来说有点模糊,它缺乏在类,类实例,接口(如果可能),接口和变量实例,列表和数组等方面的使用例子。 我真的很感激任何帮助,请尽量保持英语简单;) 谢谢 阿迪桑

编者注:请注意,原始海报是在询问示例,并且在您提供答案时不是母语为英语的人。从评论来看,OP似乎并不能很好地理解这个概念,无法询问那些没有意义的部分,所以示例会很棒!可能需要额外的细节和多个不同的解释才能找到效果最佳的答案组合。

2 个答案:

答案 0 :(得分:4)

我认为理解非静态的含义是有帮助的,即声明没有关键字static的字段/方法/ ....

声明没有关键字static的每个字段都存在作为对象的部分。如果您有两个对象,则这两个对象中的每一个都有一个可能包含不同内容的字段:

class X {
 int f;
}

X x1 = new X();
X x2 = new X();
x1.f = 5;
x2.f = 10;
// x1.f still is 5

但是,静态字段不是每个对象,而是每个类。因此,在下面的示例中,无论您拥有多少(如果有的话)类g对象,都只有一个字段Y

class Y {
  static int g;
}

Y y1 = new Y();
Y y2 = new Y();
y1.g = 5;
y2.g = 10;
// y1.g is 10, because y1.g and y2.g mean the exact same thing

我个人认为应该使用类(Y.g)而不是提及对象实例(y1.g)来访问静态字段,以便不存在任何对象实例的存在更明确。

对于方法,区别在于非静态方法与对象实例相关联,可以使用方法内的this进行访问。调用使用void m()声明的方法时,您可以访问调用它的对象的非静态(和静态)字段(因此对于上面示例中的x1.m(),您可以访问包含5的字段,对于x2.m(),您可以访问包含10的字段。

然而,可以在没有(对应的?)对象的情况下调用静态方法。如果声明在static void n()课程中为Y,则可以使用Y.n()y1.n()调用此方法(如果y1Y的实例,如上)。在这里,我更喜欢第一种写下来的方式。因为在静态方法中,您没有对 对象实例(在非静态方法中名为this)的引用,所以您无法从静态方法中访问特定的非静态字段 - 仅仅因为与特定对象没有明确的关联。

关于static和类定义:这是相当先进的。您可以在另一个类中声明一个类。如果内部类不是静态的,那么内部类的每个对象实例也都有对外部类的实例的引用(这也意味着如果你有一个外部类的实例,你只能创建一个内部类的实例)。这并不总是你想要的。通过声明内部类static它只是存在并且可以或多或少地使用,就像在其自己的文件中定义的类一样。

答案 1 :(得分:0)

基本上,静态暗示/提供两件事:

1)整个系统(JVM)中只存在一个“项目”实例 2)静态“项目”也是上下文/无状态

解释上述(1):假设您有一个膳食令牌发行者。无论系统中有多少用户/进程,所有令牌都必须由一个“东西”发布。你会把那个“东西”发展成静态的。然后你会决定那个“东西”是什么。它可以是一个执行复杂操作并实现复杂业务规则的类。然后,您将有一个静态类以“单一统一的方式”为整个系统发出令牌。有时候,重要的是令牌应该是“静态的”,但它的发布方式可能是非静态的。然后你只需要实现一个“静态”令牌计数器。

解释(2):按照上面(1)的说法,你可以很容易地看出静态“事物”以无上下文的方式运作的重要性。也就是说,他们不知道是谁叫他们或者是为了什么目的。当他们被召唤时,他们不会从过去借来任何东西,他们需要来自当前来电者的所有输入,他们只是做好自己的工作,并且对未来一无所知。