据我了解:
静态类仅适用于嵌套类,这意味着嵌套类没有对外部类的引用.
静态字段有点像全局变量,因为它只有一个实例,并且由同一个类的其他成员共享.
静态方法意味着即使对象尚未实例化也可以调用它.
我正在介绍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
.除非将实例传递给它,否则此方法不能访问任何特定实例中的实例字段.
静态成员类是一个嵌套类,它没有封闭类的概念,并且与其封闭类的任何特定实例没有关系,除非将这样的实例传递给它(例如其构造函数的参数).
Java继承自C++和C.在这些语言中,static
有两个额外的含义.局限变量(函数范围)限定为static
与类中的静态字段有些相似的含义.但是,Java不支持"静态"这种上下文.static
在文件范围内对C或C++中的变量或函数进行限定意味着"Ssh!不要告诉链接器!".Java也不支持这种意思static
.
在英语中,根据上下文,相同的单词可以有多种含义.查找字典中任何常用单词,您会发现该单词的多个定义.有些词不仅有多重含义,而且有多个词性.例如,"计数器"可以是名词,动词,形容词或副词,具体取决于上下文.其他词语可能具有相互矛盾的含义,具体取决于具体情况."道歉"可能意味着"我很抱歉!" 或者它可以意味着"我一点也不抱歉!" 后者的一个典型例子是GH Hardy的"数学家的道歉".在这方面,英语并不是独一无二的; 这同样适用于人类用来彼此沟通的任何语言.作为人类,我们习惯于根据语境具有不同含义的词语.
在关键词太少和计算机语言太多之间存在固有的冲突.Lisp,Four和smalltalk是非常漂亮的语言,只有极少数(如果有的话)关键字.它们有一些特殊字符,例如lisp中的开括号和近括号.(完全披露:我已用所有这三种语言进行了编程,我很喜欢它.)这里有一个问题:祝你好好阅读自己在事后六个月写的代码.更好的运气将代码转交给其他人.结果,这些语言的拥护者数量也相当有限.其他语言超过顶部并保留大量单词作为"关键字".(完全披露:我也被迫用这些语言编程,我讨厌它.)
计算机语言中的关键字太少或太多都会导致认知失调.拥有相同的关键字有不同的上下文不同,因为作为人类,我们已经习惯了.
所有上面提到的静态用法都有一些共性 - 在所有情况下它们都意味着类/字段/方法与没有静态的情况下的类实例关联性较小.当然,静态字段和静态方法之间的等价性应该是明确的:它们是声明单个(每个类加载器)字段和方法的方法,这些字段和方法在这些字段上工作,与其他语言中的全局对象类似.
也许那么静态用于嵌套类并不是显然具有相同的精神,但它确实共享了你不需要包含类的实例来使用这个结构的方面.
所以我不认为这些特别不一致.
对于为什么在编程语言中重复使用关键字的更一般性问题的一个答案是,通常在语言发展时引入特征 - 但是添加新关键字很困难,因为经常会破坏可能使用过的现有程序作为标识符.例如,Java实际上保留了关键字,const
即使它在语言中未被使用,也许是为了允许将来扩展!
不愿意添加新关键字通常会导致旧关键字过载.
归档时间: |
|
查看次数: |
3009 次 |
最近记录: |