【问题标题】:the static concept in javajava中的静态概念
【发布时间】:2013-01-30 21:46:01
【问题描述】:

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

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

【问题讨论】:

  • 能不能把你说的那个没有让你看懂的答案链接起来,让这里的人不要再重复同样的事情了。
  • 如果可能的话,问一些你不明白的具体事情。
  • 这意味着每个班级只有一个版本。其中“它”是一个方法或一个变量。 (显然还有一些更复杂的地方,但简而言之就是这样)。
  • @CasualT.. static 关键字不仅仅是一个版本,它毕竟不能区分静态方法和实例一。
  • 谢谢你们的快速响应这是所要求的主题stackoverflow.com/questions/413898/…再次感谢您,但我想了解更多关于静态关键字的信息,如果它不仅仅是说只有一个版本那么它会做什么,因为如果使用它的原因是说只有一个版本,那么为什么不使用 final (所以我们从一开始就让它不可更改)?

标签: java variables object interface static


【解决方案1】:

我认为这有助于理解 非静态 的含义,即声明时没有使用关键字 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

但是,静态字段不是按对象存在,而是按类存在。所以在下面的例子中,无论你有多少(如果有的话!)类Y 的对象,都只有一个字段g

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,它只是存在并且可以或多或少地像在自己的文件中定义的类一样使用。

【讨论】:

  • 感谢您的回答,它为我解决了很多问题,但我仍然对方法有一些疑问。此外,如果我们有一个静态的整个类,那么它的所有组件静态?
  • 关于方法:有什么不明白的?您可以将任何非静态方法视为静态方法,其中第一个参数命名为 this 并且 always 指向声明该方法的类的实例(因此方法 不能在不提供这样的实例的情况下调用)。关于班级:没有。内部类的静态/非静态属性只是定义是否可以访问外部类的实例。
  • 好的,这对我来说已经足够接近了 :) 非常感谢您的努力并提供了一个结构简单且结构合理的答案(示例女巫是一个巨大的好处)不过,最后一件事是静态接口?如果至少有他们的方法不能是静态的,对吗? {再次感谢您}
  • 这个问题比较高级,我认为在编程过程中,这不会正常弹出。但是为了完整起见,我建议阅读此 Q/A:stackoverflow.com/questions/71625/…
  • 好,谢谢,我会继续阅读它我不敢相信我已经跳过了学习 Java 的这个概念!!!无论如何谢谢我现在肯定知道为什么主要方法应该是静态的:)
【解决方案2】:

基本上,静态意味着/提供两件事:

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

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

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

【讨论】:

  • 我不认为这是对静态的很好的解释,抱歉,而不是像单例这样的用例。
  • 那么 static 和 final 有什么区别,而 final 可以有很多实例呢?
  • @puce 每个静态变量都是一个单例。
  • @Adistan final 是不可变的,即一旦初始化,其值就不能改变。你可以有静态决赛或静态非决赛
  • 好的,谢谢我看到了所有不同的答案并试图完全理解它,我认为我已经接近了......手指交叉! :)
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多