2

我似乎无法理解静态关键字(java)所以我用谷歌搜索并查看了这个网站上的一个帖子,虽然我确信答案是决定性和明确的 - 它总是在这里 - 我似乎没有理解它有两个原因;我不是以英语为母语的人,这门语言对我来说有点模糊,而且它缺乏在类、类实例、接口(如果可能)、接口和变量实例、列表和数组等方面的使用示例。我真的很感激任何帮助,请让英语尽可能简单;)谢谢 Aditsan

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

4

2 回答 2

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()在 class 内部,您可以使用orY调用此方法(如果是 instanceof ,如上)。在这里,我也更喜欢第一种写下来的方式。因为在静态方法中您没有对对象实例的引用(在非静态方法中命名),所以您无法从静态方法内部访问特定的非静态字段 - 仅仅是因为与特定对象没有明确的关联.Y.n()y1.n()y1Ythis

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

于 2013-01-30T22:12:20.267 回答
0

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

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

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

解释(2):按照上面(1)的说法,您可以很容易地看到为什么静态“事物”以与上下文无关的方式运行很重要。也就是说,他们不知道是谁打电话给他们或出于什么目的。当他们被调用时,他们不会从过去借任何东西,他们需要当前调用者的所有输入,他们只是做他们的工作,对未来什么都不记得。

于 2013-01-30T21:55:40.220 回答