在这个Java代码中,下划线实际上做了什么?

ano*_*ary 81 java syntax

我刚开始学习Java.

我帮助我学习的朋友刚刚给我发了这个并说'弄清楚'.

不幸的是我无法读到这个.对我来说它看起来像Perl.

class _{_ _;_(){_=this;}}
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

Doo*_*nob 154

_是班级名称.这是一个非常令人困惑的,但它的工作原理!

随着类重命名:

class Something {Something something;Something(){something=this;}}
Run Code Online (Sandbox Code Playgroud)

并清理:

class Something {
    Something something;
    Something() {
        something=this;
    }
}
Run Code Online (Sandbox Code Playgroud)

而你可以对这个奇怪的命名感到疯狂 :)

class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__=___;}}
Run Code Online (Sandbox Code Playgroud)

实际上,甚至支持Unicode,因此这是有效的:

class ??????{??????(){}}
Run Code Online (Sandbox Code Playgroud)

  • 我个人喜欢@Alvin的编辑:) (29认同)
  • 你的'疯狂'例子中几乎没有错误.(1)你忘了在`____ = __`之后添加分号(两次),(2)如果你试图重载`_`方法然后你也需要传递类型,所以`_(___)`应该是`_ (_ ___)`.以下是它的外观`class _ {_ __; _ ____; _(){__ = this; ____ = __;} _(_ ___){__ = ___;}}`.等一下.我刚刚调试了下划线吗?是时候刹车了. (4认同)

Gri*_*han 71

_ 是类名,下划线是一个有效的Java变量名,您只需缩进代码即可对其进行反混淆处理:

class _{
    _ _;
    _(){
     _=this;
   }
}
Run Code Online (Sandbox Code Playgroud)

喜欢:

class A{
    A A;
    A(){
     A=this;
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑:感谢@Daniel Fischer

类型名称和变量名称具有不同的名称空间.例如,代码class FOO { FOO FOO; }在Java中有效.

摘要

  • _ 是一个类名,例如在 class _{
  • _是一个类成员名称,例如at _ _;_=this
  • _ 是一个构造函数名称,例如at _()

请记住:Java使用六个不同的命名空间:

  • 包名称,
  • 类型名称,
  • 字段(变量)名称,
  • 方法名称,
  • 局部变量名(包括参数)和
  • 标签.

此外,每个声明的枚举都有自己的命名空间.不同类型的相同名称不冲突; 例如,方法可以被命名为与局部变量相同.

  • 没有错.它打印时编译得很好.直到现在我才明白这一点. (3认同)
  • @GrijeshChauhan类型名称和变量名称具有不同的名称空间.`FOO {FOO FOO; 工作. (2认同)
  • @anotherordinary阅读我更新的答案我也添加了一个链接 (2认同)
  • @GrijeshChauhan我明白了.谢谢 :) (2认同)

ash*_*kwd 11

那是个很好的例子.Java允许unicode成为标识符,因此您可以编写如下内容:

class ?lass {
?lass cla??;
}
Run Code Online (Sandbox Code Playgroud)

这里的班级名称c是'ⲥ'(U + 2CA5 COPTIC SMALL LETTER SIMA)和

对象名称'''(U + 0455 CYRILLIC SMALL LETTER DZE).

  • @nickb:它不是Java关键字`'class'`.正如我所提到的,对象名称''claѕѕ''有'ss'`这是非ascii字符.所以实际对象的名字是`clainces`是`cla\u0455\u0455'.我认为这清除了误解.:) (13认同)