What is the underscore actually doing in this Java code?
我刚开始学JAVA。
帮我学习的朋友刚刚给我发了这个,说"想办法"。
不幸的是,我看不懂这个。我觉得它像Perl。
1
| class _{_ _;_(){_=this;}} |
这是什么意思?
- 这个问题正在meta上讨论。让我们在这里为关闭/删除它或反对关闭/删除它采取论据。
- @另外,如果你的朋友认为让你弄明白这是学习这种语言的一个好方法,你就应该放弃他/她作为编程老师的身份。记住不敬的琐事一点用处都没有。更不用说当你开始学习一门语言了。
- @恩诺肖吉很重要。"不相关"。对不起的。
- 是否有人试图创建"IOJCC"?(谷歌"ioccc")
- @恩诺肖吉,这个"不相关的琐事"需要记住吗?任何人称自己为Java程序员的人都应该能够很容易地理解这一点。
- PHANT0M:这里的"琐事"是Java允许单个下划线作为标识符的事实,我认为这不是有用的知识。
_是类名。这是一个非常令人困惑的问题,但它起作用了!
将类重命名为:
1
| class Something {Something something;Something(){something=this;}} |
清理干净:
1 2 3 4 5 6
| class Something {
Something something;
Something() {
something=this;
}
} |
号
你可以用这个奇怪的名字来疯狂。
1
| class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__=___;}} |
实际上,甚至支持Unicode,因此这是有效的:
1
| class 合法類別名稱{合法類別名稱(){}} |
。
- 我个人喜欢@alvin的编辑:)
- 您的get crazy示例中几乎没有错误。(1)你忘了在____=__后面加分号(两次);(2)如果你试图重载_方法,那么你还需要传递类型,所以_(___)应该是_(_ ___)。下面是它的外观。等一下。我刚调试了下划线吗?该刹车了。
- @噢,我从来没有认真对待过那条代码:P修正
- 对我的答案进行评论时,获得+1。想不出另一种奖励你的方法。
EDCOX1×0是类名称,下划线是一个有效的Java变量名,您只需缩进代码就可以对其进行模糊处理:
1 2 3 4 5 6
| class _{
_ _;
_(){
_=this;
}
} |
像:
1 2 3 4 5 6
| class A{
A A;
A(){
A=this;
}
} |
。
编辑:感谢@daniel fischer
Type names and variable names have different namespaces. and for example code class FOO { FOO FOO; } is valid in Java.
号
总结
- _是一个类名,例如在class _{上。
- _是一个类成员名称,例如在_ _;和_=this处。
- _是一个构造函数名,例如在_()处。
记住:Java使用六个不同的命名空间:
-
Package names,
-
type names,
-
field (variable) names,
-
method names,
-
local variable names (including parameters), and
-
labels.
In addition, each declared enum has its own namespace. Identical names of different types do not conflict; for example, a method may be named the same as a local variable.
号
- 没有错。它编译得和我键入的一样好。直到现在我才明白。
- @grijeshchauhan类型名和变量名具有不同的命名空间。class FOO { FOO FOO; }工程。
- "丹尼尔费舍尔谢谢……这只是爪哇语吗?"有其他语言能做到吗?
- 例如,在haskell中,类型和值也有不同的名称空间。不同的是,该大小写具有含义,类型名称必须以大写字母开头,因此不能像类型那样命名任何旧值,而只能命名构造函数,但data Foo = Foo | Bar Int起作用。当然,它只能在语言中工作,在语言中,您可以从标识符出现的地方找到它的类别。
- @丹尼尔菲舍尔非常感谢丹尼尔菲舍尔…我觉得很有趣。
- @另一个普通的阅读我更新的答案,我也添加了一个链接
- @我看到了。谢谢:)
- 我有一个交叉问题:在C++中也有承包商和类名,函数名重载和重写是相同的。它对命名空间还是C++编译器的内部表示不同名称的每个函数?很抱歉再次打扰你。
- 呃,C++不是我的领域。但是,除非我上次查看之后发生了变化,否则重载是通过名称管理来解决的,参数类型以某种方式包含在"实名"中。我认为C++中的类型名称和函数/构造函数名称在同一个命名空间中,但我不确定,而且懒得现在去查找它。
- 字段名和局部变量不是在同一个命名空间中吗?否则,您将无法隐藏变量,就像setter方法中常见的那样:void setValue(String value) { this.value = value;}。
- @不,我的意思是"是"和"是"都在同一个名称空间中。
- @另一个普通的嗨,你读过这个问题,它的答案模糊了2006年的C代码竞赛。
- @Grijeshchauhan:在您的评论中,您写到它们在同一个名称空间中,但这与您的回答(列出6个不同的名称空间)相矛盾。我会说"字段vs局部变量vs枚举成员"都只是作用域。
- @马阿蒂努斯是的,我注意到了。但我认为,因为我们使用this,所以两个名称空间相同。我不明白你说的'this is just scoping'是什么意思。请添加一些我自己感到困惑的信息/链接。
好吧,这是个很好的例子。Java允许Unicode作为标识符,这样就可以编写类似的内容:
1 2 3
| class ?lass {
?lass cla??;
} |
。
这里的类名c是'?'(U+2ca5哥普特文小写字母Sima)和
对象名的'?'(U+0455西里尔文小写字母Dze)。
- 不能有名为class的变量,它是关键字。
- NICB:它不是Java关键字EDCOX1,12。正如我所提到的,对象名'cla??'有'ss',它是非ASCII字符。所以实际上,对象的名字是cla??是cla\u0455\u0455',我认为这可以消除误解。:)