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

sta*_*nek 56 java

据我了解:

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

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

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

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

Pac*_*ace 70

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

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

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

  • 即使没有类的实例,也会存在静态字段.如果您的Foo类具有counter静态字段,则可以在不实例化该类实例的情况下访问它Foo.

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

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

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


sco*_*ttb 19

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

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

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

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

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

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

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


dav*_*ave 16

来自Cay Horstmann的Core Java:

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


Dav*_*men 9

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

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

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

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


Bee*_*ope 6

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

也许那么静态用于嵌套类并不是显然具有相同的精神,但它确实共享了你不需要包含类的实例来使用这个结构的方面.

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

对于为什么在编程语言中重复使用关键字的更一般性问题的一个答案是,通常在语言发展时引入特征 - 但是添加新关键字很困难,因为经常会破坏可能使用过的现有程序作为标识符.例如,Java实际上保留了关键字,const即使它在语言中未被使用,也许是为了允许将来扩展!

不愿意添加新关键字通常会导致旧关键字过载.


MK.*_*MK. 6

Java教程说

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

基本上"静态"意味着用它标记的实体与类的实例分离.静态方法没有与之关联的实例.静态字段在所有实例之间共享(基本上存在于类中,而不是在实例中).
静态嵌套类与封闭实例分开.你是对的,它有点令人困惑,因为你可以拥有一个静态嵌套类的实例,其中包含非静态方法和字段.
把static这个词想成"我正在声明一个实体,一个字段,一个方法或一个内部类,它与封闭的实例没有任何关系"