繁体   English   中英

Java中的静态概念

[英]the static concept in java

我似乎无法理解静态关键字(java),所以我用它在Google网站上进行了搜索并查看了一个主题 ,尽管我确定答案是明确和明确的-它总是在这里-我似乎没有理解它有两个原因; 我不是英语母语人士,并且该语言对我来说有点含糊,并且缺少在类,类实例,接口(如果可能),接口和变量实例,列表和数组等中使用的示例。 我真的很感谢您的帮助,请保持英语尽可能的简单;)谢谢Aditsan

编者注:请注意,原始发帖人仅是在询问示例,在您提供答案时,它不会说英语。 从评论中可以看出,OP对这一概念的理解程度不够高,无法询问那些还没有意义的部分,因此示例将非常棒! 可能需要额外的细节和多种不同的解释才能找到最合适的答案组合。

我认为这有助于理解非静态的含义,即在没有关键字static情况下声明的field / methods /...。

没有关键字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

我个人认为应该使用类( Yg )来访问静态字段,而不要提及对象实例( y1.g ),这样可以更明确地显示没有任何对象实例的情况。

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

但是,可以在没有(对应?)对象的情况下调用静态方法。 如果声明是类Y内的static void n() ,则可以使用Yn()y1.n()调用此方法(如果y1Y的实例,如上所述)。 在这里,我也更喜欢将其写下来的第一种方法。 因为在静态方法,你不必对象实例的引用(被命名为this在非静态方法),你不能从一个静态方法内部访问特定的非静态字段-仅仅是因为没有明确的关联到一个特定的宾语。

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

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

1)整个系统(JVM)中仅存在一个“ item”的实例2)静态“ items”也没有上下文/状态

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM