[英]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()
调用此方法(如果y1
是Y
的实例,如上所述)。 在这里,我也更喜欢将其写下来的第一种方法。 因为在静态方法,你不必对象实例的引用(被命名为this
在非静态方法),你不能从一个静态方法内部访问特定的非静态字段-仅仅是因为没有明确的关联到一个特定的宾语。
关于static
和类定义:这是相当高级的。 您可以在另一个类中声明一个类。 如果内部类不是静态的,则内部类的每个对象实例也都引用外部类的实例(这也意味着,只有拥有外部类的实例,您才能创建内部类的实例。 )。 这并不总是您想要的。 通过声明内部类的static
它只是存在并且可以或多或少地使用,就像在其自己的文件中定义的类一样。
基本上,静态暗示/提供了两件事:
1)整个系统(JVM)中仅存在一个“ item”的实例2)静态“ items”也没有上下文/状态
解释上面的(1):假设您有一个膳食令牌发行者。 无论系统中有多少用户/进程,所有令牌都必须由单个“事物”发出。 您将把“事物”开发为静态的。 然后,您将决定什么是“东西”。 它可能是执行复杂操作并实现复杂业务规则的类。 然后,您将有一个静态类以“单一统一方式”为整个系统发行令牌。 有时,重要的是令牌应该是“静态的”,但是令牌的发行方式可能是非静态的。 然后,您只需实现一个“静态”令牌计数器。
解释(2):按照上面对(1)的说法,您可以轻松地看到为什么静态“事物”以无上下文关系的方式运行很重要的原因。 也就是说,他们不知道是谁打电话给他们或出于什么目的。 当他们被呼叫时,他们不会从过去借用任何东西,他们需要当前呼叫者的所有输入,并且他们只是做自己的工作,对未来一无所知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.