关于语法:在这个Java代码中,下划线实际上做了什么?

What is the underscore actually doing in this Java code?

我刚开始学JAVA。

帮我学习的朋友刚刚给我发了这个,说"想办法"。

不幸的是,我看不懂这个。我觉得它像Perl。

1
class _{_ _;_(){_=this;}}

这是什么意思?


_是类名。这是一个非常令人困惑的问题,但它起作用了!

将类重命名为:

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 合法類別名稱{合法類別名稱(){}}


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.


好吧,这是个很好的例子。Java允许Unicode作为标识符,这样就可以编写类似的内容:

1
2
3
class ?lass {
?lass cla??;
}

这里的类名c是'?'(U+2ca5哥普特文小写字母Sima)和

对象名的'?'(U+0455西里尔文小写字母Dze)。