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

据我所知:

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

  • 静态字段就像一个全局variables,只有一个实例,它被同一个类的其他成员共享。

  • 静态方法意味着即使对象还没有实例化,也可以调用它。

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

你的例子都是正确的,但是它们都有共同的特征。 单词静态意味着一个封闭的实例是没有必要的。

  • 只有一个静态的内部类可以存在没有封闭的实例。 例如,如果你有一个Foo类和一个非静态的内部类Bar那么你不能在Foo一个实例之外创build一个Bar的实例。

  • 静态方法意味着你不需要类的实例来调用方法。 例如,您可以调用String.format而不用实际的String实例。

  • 即使没有该类的实例,静态字段也将存在。 如果您的Foo类有一个静态的counter字段,您可以访问它,而不用实例化Foo类的实例。

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

您也可以声明内部接口,注释和枚举是静态的,尽pipe在这种情况下关键字是完全多余的(例如类似于声明一个接口方法摘要)。 接口,注释和枚举与封闭类没有任何关系,所以静态不能真正把它拿走。

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

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

它并没有真正意义上的不同。

无论遇到什么情况,您都可以使用static关键字指示以下内容:

“不考虑或与任何特定事件的关系”

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

  • 在课堂上定义了一个静态方法,没有任何概念。 这种方法不能访问任何特定实例中的实例字段,除非实例被传递给它。

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

来自Cay Java Horstmann的Core Java :

“静态”一词有一段奇怪的历史。 首先,在C中引入关键字static来表示在退出块时不会消失的局部variables。 在这种情况下,术语“静态”是有意义的:当块再次进入时variables停留在那里并且仍然在那里。 然后静态在C中获得第二个含义,来表示不能从其他文件访问的全局variables和函数。 关键字静态只是重用,以避免引入新的关键字。 最后,C ++重复使用关键字作为第三个不相关的解释来表示属于类的variables和函数,而不是类的任何特定对象。 这与关键字在Java中的含义相同。

Java从C ++和Cinheritance。在这些语言中, static有两个额外的含义。 限定为static的局部variables(函数作用域)的含义有点类似于类中静态字段的含义。 但是Java不支持这种“静态”的上下文。 在C或C ++文件范围内将variables或函数限定为static意思是“Ssh!不要告诉链接器!”。 Java也不支持这种static意思。

在英语中,取决于上下文,相同的单词可以具有多种含义。 在字典中查找任何常用的单词,您会发现该单词的多个定义。 有些词不仅有多重含义,还有多个词性。 例如,“计数器”可以是名词,动词,形容词或副词,取决于上下文。 其他的词可以有矛盾的意思,取决于上下文。 “道歉”可能意味着“我很抱歉!” 也可能意味着“我一点也不抱歉” 后者的一个重要例子是GH Hardy的“math家的道歉”。 英语在这方面并不是独一无二的, 这同样适用于人类用于彼此沟通的任何语言。 作为人类,我们习惯于根据上下文具有不同含义的词语。

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

计算机语言中太less或太多的关键词会导致认知失调。 拥有相同的关键字在不同的背景下有不同的背景,因为作为人类,我们相当习惯于这一点。

Java教程说

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

基本上“静态”是指用它标记的实体与类的实例脱离。 静态方法没有与之关联的实例。 静态字段在所有实例之间共享(实质上存在于类中,而不是实例中)。
静态嵌套类与封闭实例分离。 你说得对,因为你可以有一个静态嵌套类的实例,里面有非静态的方法和字段。
把静态这个词看作是“我正在声明一个实体,一个字段,一个方法或者一个内部类,这个和封闭实例没有任何关系”

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

也许那么对于嵌套类的使用静态并不是明显的相同的精神,但它共享的方面, 你不需要包含类的实例来使用这个构造

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

关于为什么关键字被重复用于编程语言中明显不同的目的的更一般性问题的一个答案是,随着语言的发展,常常引入特征 – 但是添加新的关键词是困难的,因为经常破坏可能已经使用的现有程序作为一个标识符。 例如,Java实际上保留了关键字const即使它在语言中未被使用,也许为了将来的扩展!

这种不愿增加新的关键词往往会导致旧的关键词超载。