このJavaコードで実際にアンダースコアは何をしていますか?[閉まっている]


81

私はJavaを学び始めたばかりです。

私の勉強を手伝ってくれている友達がこれを送ってくれて、「これを理解して」と言った。

残念ながら私はこれを読むことができません。私にはPerlのように見えます。

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

どういう意味ですか?


17
この質問はメタで議論されています。そこでそれを閉じる/削除することに賛成または反対の議論をしてみましょう。
AdamLear

63
@anotherordinary友達がこの言語を学ぶのに良い方法だと思ったら、プログラミングの先生として友達を捨てるべきでしょう。不遜な雑学クイズを覚えておくことはまったく役に立ちません。あなたが言語を学び始めているときははるかに少ないです。
Enno Shioji 2013年

2
@EnnoShioji素晴らしい点。「イレレバント」。ごめんなさい。
Asad Saeeduddin 2013年

1
「IOJCC」を作成しようとしている人はいますか?(google "IOCCC")
Olivier Dulac 2013年

1
@EnnoShioji覚えておく必要のあるこの「無関係な雑学クイズ」はどうですか?自分自身をJavaプログラマーと呼ぶ人は誰でも、これを簡単に理解できるはずです。
phant0m 2013年

回答:


154

_クラス名です。非常に紛らわしいですが、機能します。

クラスの名前が変更された場合:

class Something {Something something;Something(){something=this;}}

そしてクリーンアップ:

class Something {
    Something something;
    Something() {
        something=this;
    }
}

そして、あなたはこの奇妙な命名に夢中になることができます :)

class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__=___;}}

実際、Unicodeもサポートされているため、これは有効です。

class 合法類別名稱{合法類別名稱(){}}

29
私は個人的に
@Alvin

4
あなたのget crazy例にはいくつかの間違いがあります。(1)____=__(2回)の後にセミコロンを追加するのを忘れた、(2)_メソッドをオーバーロードしようとしている場合は、型も渡す必要があるので、そうする_(___)必要があります_(_ ___)。これがどのように見えるかですclass _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}。ちょっと待って。アンダースコアをデバッグしましたか?ブレーキの時間です。
pshemo 2013年

@Pshemo Lol、私はそのコードについて真剣に考えるつもりはありませんでした:P修正済み
tckmn 2013年

私の答えへのコメントに対して+1を取得します。あなたに報酬を与える別の方法を考えることができませんでした。
Ed Heal

71

_ はクラス名、アンダースコアは有効なJava変数名です。コードをインデントして、難読化を解除する必要があります。

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

お気に入り:

class A{
    A A;
    A(){
     A=this;
   }
}

編集: @DanielFischerに感謝します

タイプ名と変数名の名前空間は異なります。たとえば、コードclass FOO { FOO FOO; }はJavaで有効です。

概要

  • _ はクラス名です。 class _{
  • _はクラスメンバー名です。例:_ _;および_=this
  • _ コンストラクタ名です。 _()

注意:Javaは6つの異なる名前空間を使用します。

  • パッケージ名、
  • タイプ名、
  • フィールド(変数)名、
  • メソッド名、
  • ローカル変数名(パラメーターを含む)、および
  • ラベル。

さらに、宣言された各列挙型には独自の名前空間があります。異なるタイプの同一の名前は競合しません。たとえば、メソッドにはローカル変数と同じ名前を付けることができます


3
間違いはありません。入力したとおりに正常にコンパイルされます。今まで理解できませんでした。
別の通常の

2
@GrijeshChauhanタイプ名と変数名の名前空間は異なります。class FOO { FOO FOO; }動作します。
ダニエルフィッシャー

1
たとえば、Haskellでは、型と値にも異なる名前空間があります。大文字と小文字には意味があるという違いがあります。型名は大文字で始める必要があるため、型のように古い値に名前を付けることはできませんdata Foo = Foo | Bar Int。コンストラクターのみが機能します。もちろん、それが表示される場所から識別子のカテゴリを理解できる言語でのみ機能します。
ダニエルフィッシャー

2
@anotherordinary更新された回答を読むリンクも追加しました
Grijesh Chauhan 2013

2
@GrijeshChauhanなるほど。ありがとう:)
別の普通の

12

それは良い例です。JavaではUnicodeを識別子にすることができるため、次のように記述できます。

classlass {
ⲥlass claѕѕ;
}

ここで、クラス名のcは「ⲥ」(U + 2CA5 COPTIC SMALL LETTER SIMA)であり、

オブジェクト名の「ѕ」(U + 0455 CYRILLIC SMALL LETTER DZE)。


、という名前の変数を持つことはできませんclass。それはキーワードです。
nickb 2013年

14
@nickb:Javaキーワードではありません'class'。私は、オブジェクト名がいることを述べてきたように'claѕѕ'持っている'ss'非ASCII文字です。そう、実際にオブジェクトの名前はclaѕѕあるcla\u0455\u0455'私は、これは誤解をクリアだと思います。:)
ashgkwd 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.