为什么静态根据上下文有不同的含义?

时间:2016-02-19 04:26:45

标签: java

据我所知:

  • 静态类仅适用于嵌套类,这意味着嵌套类没有对外部类的引用。

  • 静态字段有点像全局变量,因为它只有一个实例,并且由同一个类的其他成员共享。

  • 静态方法意味着即使对象尚未实例化也可以调用它。

我正在介绍Java课程,并试图巩固我的知识,并试图弄清楚为什么不使用不同的关键字来表示不同的含义。

6 个答案:

答案 0 :(得分:70)

您的示例都是正确的,但是,它们都有一个共同的特征。单词static意味着不需要封闭实例

  • 在没有封闭实例的情况下,只能存在静态内部类。例如,如果您有一个类Foo和一个非静态内部类Bar,那么您无法在Bar的实例之外创建Foo的实例。

  • 静态方法意味着您不需要该类的实例来调用该方法。例如,您可以在没有实际String.format实例的情况下致电String

  • 即使没有类的实例,也会存在静态字段。如果您的Foo类具有静态counter字段,则无需实例化Foo类的实例即可访问该字段。

作为一个澄清点,考虑一个接口可以有静态类,静态字段和静态方法。但是,它不能拥有任何这些东西的非静态版本(忽略默认方法,这是特定的概念)。这是因为你永远不能创建一个接口实例,因此永远不会有一个封闭的实例。

您也可以将内部接口,注释和枚举声明为静态,尽管在这种情况下关键字完全是冗余的(例如,类似于声明接口方法摘要)。接口,注释和枚举与封闭类没有任何关系,因此静态无法将其带走。

最后一个拜占庭式的观点。如果执行静态导入(import static pack.age.Foo.*),您将能够对类中的任何静态项(包括接口,注释和枚举)进行非限定引用,无论它们是否被冗余标记为静态。

答案 1 :(得分:19)

  

为什么静态根据上下文有不同的含义?为什么   是不是没有使用不同的关键词?

它实际上没有不同的含义。

您可以使用static关键字在任何可能遇到的地方指出以下内容:

  

“不考虑或与任何特定实例的关系”

  • 静态字段是属于类而不是任何特定实例的字段。

  • 在类上定义了静态方法,并且没有this的任何概念。这种方法不能访问任何特定实例中的实例字段,除非将实例传递给它。

  • 静态成员类是一个嵌套类,它没有封闭类的概念,并且与其封闭类的任何特定实例没有关系,除非将这样的实例传递给它(例如它的构造函数的参数) )。

答案 2 :(得分:16)

来自Cay Horstmann的Core Java

  

“静态”一词有着悠久的历史。首先,在C to中引入了关键字static   表示退出块时不会消失的局部变量。在这种情况下,这个词   “静态”是有意义的:变量保持不变,并且在输入块时仍然存在   再次。然后静态在C中得到第二个含义,表示全局变量和函数   无法从其他文件访问。关键字static只是被重用,以避免   引入新关键字。最后,C ++重用了第三个关键字,不相关,   interpre-to表示属于类但不属于任何类的变量和函数   班级的特定对象。这与Java中关键字的含义相同。

答案 3 :(得分:9)

Java继承自C ++和C.在这些语言中,static还有两个含义。限定为static的局部变量(函数范围)的含义与类中的静态字段的含义有些相似。但是,Java不支持" static"的这种上下文。在文件范围内将C或C ++中的变量或函数限定为static意味着" Ssh!不要告诉链接器!"。 Java也不支持static的这种含义。

在英语中,同一个词可以有多种含义,具体取决于上下文。查找字典中任何常用单词,您会发现该单词的多个定义。有些词不仅有多重含义,而且有多个词性。 " Counter",例如,取决于上下文,可以是名词,动词,形容词或副词。其他词语可能具有相互矛盾的含义,具体取决于具体情况。 "道歉"可以意味着"我很抱歉!"或者它可能意味着"我一点也不抱歉!"后者的一个典型例子是“数学家的道歉"作者:G。H. Hardy。在这方面,英语并不是独一无二的;这同样适用于人类用来彼此沟通的任何语言。作为人类,我们习惯于根据语境具有不同含义的词语。

在关键词太少和计算机语言太多之间存在固有的冲突。 Lisp,Four和smalltalk是非常漂亮的语言,只有极少数(如果有的话)关键字。它们有一些特殊字符,例如lisp中的开括号和近括号。 (完全披露:我已经用这三种语言进行了编程,我很喜欢它。)这里有一个问题:祝你好好阅读你自己在事后六个月写的代码。更好的运气将代码转交给其他人。结果,这些语言的拥护者数量也相当有限。其他语言超过顶部并保留大量单词作为"关键字。" (完全披露:我也被迫用这些语言编程,我讨厌它。)

计算机语言中的关键字太少或太多都会导致认知失调。拥有相同的关键字有不同的上下文不同,因为作为人类,我们已经习惯了。

答案 4 :(得分:6)

我所看到的所有静态用法都有一些共性 - 在所有情况下,它们都意味着类/字段/方法与没有静态的情况下的类实例关联性较小。当然,静态字段和静态方法之间的等价性应该是明确的:它们是声明单个(每个类加载器)字段和方法的方式,这些字段和方法在这些字段上工作,与其他语言中的全局对象类似。

也许那么静态用于嵌套类并不是显而易见的,但它确实分享了你不需要包含类的实例来使用它的方面构造

所以我不认为这些特别不一致。

为什么在编程语言中为了显然不同的目的而重复使用关键字这一更普遍的问题的一个答案是,随着语言的发展,通常会引入功能 - 但是很难添加新的关键字,因为经常打破现有的程序可能已将其用作标识符。例如,Java实际上保留了关键字const,即使它在语言中未被使用,也许是为了允许将来扩展!

这种不愿意添加新关键字通常会导致旧关键字超载。

答案 5 :(得分:6)

Java Tutorial says

  

与类方法和变量一样,静态嵌套类是   与其外层相关联。和静态类方法一样,a   静态嵌套类不能直接引用实例变量或   在其封闭类中定义的方法:它只能通过它来使用它们   对象引用。

基本上"静态"意味着标有它的实体与一个类的实例分开。静态方法没有与之关联的实例。静态字段在所有实例之间共享(基本上存在于类中,而不是在实例中) 静态嵌套类与封闭实例分开。你是对的,它有点令人困惑,因为你可以拥有一个静态嵌套类的实例,其中包含非静态方法和字段。
想想静态这个词&#34;我宣布一个实体,一个字段,一个方法或一个内部类,它与封闭实例&#34; <无关。 / p>