Was macht der Unterstrich in diesem Java-Code tatsächlich? [geschlossen]

81

Ich habe gerade angefangen, Java zu lernen.

Mein Freund, der mir beim Lernen hilft, hat mir das gerade geschickt und gesagt: "Finde das heraus".

Leider kann ich das nicht lesen. Es sieht aus wie Perl für mich.

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

Was heißt das?

ein anderer gewöhnlicher
quelle
17
Diese Frage wird auf Meta diskutiert . Nehmen wir Argumente für oder gegen das Schließen / Löschen.
Adam Lear
63
@anotherordinary Du solltest deinen Freund wahrscheinlich als Programmierlehrer fallen lassen, wenn er / sie dachte, es wäre ein guter Weg, diese Sprache zu lernen, wenn du dir sagst, dass du das herausfinden sollst. Sich an respektlose Trivia zu erinnern, ist überhaupt nicht nützlich. Viel weniger, wenn Sie anfangen, eine Sprache zu lernen.
Enno Shioji
2
@ EnnoShioji Toller Punkt. "Irrelevant". Es tut uns leid.
Asad Saeeduddin
1
versucht jemand das "IOJCC" zu erstellen? (Google "IOCCC")
Olivier Dulac
@EnnoShioji Wie ist diese "irrelevante Trivia", an die man sich erinnern muss? Jeder, der sich Java-Programmierer nennt, sollte dies leicht verstehen können.
Phant0m

Antworten:

154

_ist der Klassenname. Es ist sehr verwirrend, aber es funktioniert!

Mit der Klasse umbenannt:

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

Und aufgeräumt:

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

Und Sie können mit dieser seltsamen Benennung verrückt werden :)

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

Tatsächlich wird Unicode sogar unterstützt, daher gilt dies:

class 合法類別名稱{合法類別名稱(){}}
tckmn
quelle
29
Ich persönlich liebe die Bearbeitung von @ Alvin :)
Bartek Banachewicz
4
In Ihrem get crazyBeispiel gibt es nur wenige Fehler . (1) Sie haben vergessen, nach ____=__(zweimal) ein Semikolon hinzuzufügen. (2) Wenn Sie versuchen, die _Methode zu überladen , müssen Sie auch den Typ übergeben, so _(___)sollte es sein _(_ ___). So kann es aussehen class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Warte eine Minute. Habe ich gerade Unterstriche getestet? Es ist Zeit für eine Bremse.
Pshemo
@Pshemo Lol, ich wollte diesen Code nie wirklich ernst nehmen: P fixed
tckmn
Holen Sie sich eine +1 für den Kommentar zu meiner Antwort. Ich könnte mir keinen anderen Weg vorstellen, dich zu belohnen.
Ed Heal
71

_ ist der Klassenname, der Unterstrich ist ein gültiger Java-Variablenname. Sie müssen nur Ihren Code einrücken, um ihn zu deobfuscieren:

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

Mögen:

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

Edit: danke an @Daniel Fischer

Typ- und Variablennamen haben unterschiedliche Namespaces. und zum Beispiel ist Code class FOO { FOO FOO; }in Java gültig.

Zusammenfassung

  • _ ist ein Klassenname zB bei class _{
  • _ist ein Klassenmitgliedsname, zB bei _ _;und_=this
  • _ ist ein Konstruktorname zB bei _()

Denken Sie daran: Java verwendet sechs verschiedene Namespaces:

  • Paketnamen,
  • Typnamen,
  • Feldnamen (Variablen),
  • Methodennamen,
  • lokale Variablennamen (einschließlich Parameter) und
  • Etiketten.

Darüber hinaus hat jede deklarierte Aufzählung einen eigenen Namespace. Identische Namen verschiedener Typen stehen nicht in Konflikt. Beispielsweise kann eine Methode wie eine lokale Variable benannt werden .

Grijesh Chauhan
quelle
3
Es gibt keinen Fehler. Es wird gut kompiliert, während ich tippe. Ich habe es bis jetzt einfach nicht verstanden.
weiterer gewöhnlicher
2
@GrijeshChauhan Typnamen und Variablennamen haben unterschiedliche Namespaces. class FOO { FOO FOO; }funktioniert.
Daniel Fischer
1
In Haskell haben beispielsweise Typen und Werte auch unterschiedliche Namespaces. Ein Unterschied besteht darin, dass Groß- und Kleinschreibung eine Bedeutung hat. Ein Typname muss mit einem Großbuchstaben beginnen, sodass Sie keinen alten Wert wie einen Typ benennen können, sondern nur Konstruktoren, sondern data Foo = Foo | Bar Intfunktionieren. Es kann natürlich nur in Sprachen funktionieren, in denen Sie die Kategorie eines Bezeichners herausfinden können, von wo aus er erscheint.
Daniel Fischer
2
@anotherordinary las meine aktualisierte Antwort Ich fügte auch einen Link hinzu
Grijesh Chauhan
2
@GrijeshChauhan Ich sehe es. Danke :)
weiterer gewöhnlicher
11

Nun, das ist ein gutes Beispiel. Mit Java können Unicodes Bezeichner sein, sodass Sie Folgendes schreiben können:

class lass {
lass claѕѕ;
}

hier ist der Klassenname c 'ⲥ' (U + 2CA5 COPTIC SMALL LETTER SIMA) und

Objektname ist 's' (U + 0455 CYRILLIC SMALL LETTER DZE).

ashgkwd
quelle
Sie können keine Variable benennen class, es ist ein Schlüsselwort.
Nickb
13
@nickb: Es ist kein Java-Schlüsselwort 'class'. Wie ich bereits erwähnt habe, 'claѕѕ'hat dieser Objektname 'ss'keine ASCII-Zeichen. Der Name des Objekts lautet claѕѕalso, cla\u0455\u0455'ich denke, dies klärt Missverständnisse. :)
ashgkwd