Co właściwie robi podkreślenie w tym kodzie Java? [Zamknięte]

81

Właśnie zacząłem uczyć się języka Java.

Mój przyjaciel, który pomaga mi w nauce, właśnie wysłał mi to i powiedział „rozwiąż to”.

Niestety nie mogę tego przeczytać. Dla mnie wygląda jak Perl.

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

Co to znaczy?

inny zwykły
źródło
17
To pytanie jest omawiane na meta . Weźmy tam argumenty za lub przeciw zamykaniu / usuwaniu tego.
Adam Lear
63
@anotherordinary Prawdopodobnie powinieneś porzucić swojego przyjaciela jako nauczyciela programowania, jeśli on / ona pomyślałby, że powiedzenie ci tego byłoby dobrym sposobem na naukę tego języka. Zapamiętywanie lekceważących ciekawostek wcale nie jest przydatne. Znacznie mniej, gdy zaczynasz uczyć się języka.
Enno Shioji
2
@EnnoShioji Świetna uwaga. "Bez znaczenia". Przepraszam.
Asad Saeeduddin
1
czy ktoś próbuje utworzyć „IOJCC”? (google „IOCCC”)
Olivier Dulac,
1
@EnnoShioji Co to za „nieistotne ciekawostki”, o których należy pamiętać? Każdy, kto nazywa siebie programistą Java, powinien być w stanie to łatwo zrozumieć.
phant0m

Odpowiedzi:

154

_to nazwa klasy. To bardzo zagmatwane, ale działa!

Po zmianie nazwy klasy:

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

I uporządkowane:

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

I możesz oszaleć z tym dziwnym nazewnictwem :)

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

W rzeczywistości Unicode jest nawet obsługiwany, więc jest to ważne:

class 合法類別名稱{合法類別名稱(){}}
tckmn
źródło
29
Osobiście uwielbiam edycję @ Alvina :)
Bartek Banachewicz
4
W twoim get crazyprzykładzie jest kilka błędów . (1) zapomniałeś dodać średnik po ____=__(dwa razy), (2) jeśli próbujesz przeciążyć _metodę, musisz również przekazać typ, więc _(___)powinno być _(_ ___). Oto jak to może wyglądać class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Poczekaj minutę. Czy właśnie zdebugowałem podkreślenia? Czas na hamulec.
Pshemo
@Pshemo Lol, tak naprawdę nigdy nie chciałem traktować tego kodu poważnie: P fixed
tckmn
Uzyskaj +1 za komentarz do mojej odpowiedzi. Nie mogłem wymyślić innego sposobu na wynagrodzenie.
Ed Heal
71

_ to nazwa klasy, podkreślenie to poprawna nazwa zmiennej Java, wystarczy wciąć kod, aby go odszyfrować:

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

Lubić:

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

Edycja: dzięki @Daniel Fischer

Nazwy typów i nazwy zmiennych mają różne przestrzenie nazw. i na przykład kod class FOO { FOO FOO; }jest ważny w Javie.

Podsumowanie

  • _ to nazwa klasy, np. at class _{
  • _jest nazwą członka klasy, np. at _ _;i_=this
  • _ to nazwa konstruktora, np. at _()

Pamiętaj: Java używa sześciu różnych przestrzeni nazw:

  • Nazwy pakietów,
  • nazwy typów,
  • nazwy pól (zmiennych),
  • nazwy metod,
  • lokalne nazwy zmiennych (w tym parametry) i
  • etykiety.

Ponadto każde zadeklarowane wyliczenie ma własną przestrzeń nazw. Identyczne nazwy różnych typów nie kolidują; na przykład metoda może mieć taką samą nazwę jak zmienna lokalna .

Grijesh Chauhan
źródło
3
Nie ma pomyłki. Kompiluje się dobrze, gdy pisałem. Po prostu do tej pory tego nie rozumiałem.
kolejny zwykły
2
Nazwy typów i nazwy zmiennych @GrijeshChauhan mają różne przestrzenie nazw. class FOO { FOO FOO; }Pracuje.
Daniel Fischer
1
Na przykład w Haskell typy i wartości mają również różne przestrzenie nazw. Różnica polega na tym, że wielkość liter ma znaczenie, nazwa typu musi zaczynać się od dużej litery, więc nie możesz nazwać żadnej starej wartości, takiej jak typ, ale tylko konstruktory, ale data Foo = Foo | Bar Intdziała. Oczywiście może działać tylko w językach, w których można określić kategorię identyfikatora, z której się on pojawia.
Daniel Fischer
2
@anotherordinary przeczytaj moją zaktualizowaną odpowiedź Dodałem również link
Grijesh Chauhan
2
@GrijeshChauhan Widzę to. Dzięki :)
kolejny zwyczajny
12

cóż, to dobry przykład. W Javie unicode może być identyfikatorami, więc możesz napisać coś takiego:

classlass {
ⲥlass claѕѕ;
}

tutaj nazwa klasy c to 'ⲥ' (U + 2CA5 COPTIC MAŁA LITERA SIMA) i

nazwa obiektu to „” (U + 0455 CYRILLIC MAŁA LITERA DZE).

ashgkwd
źródło
Nie możesz mieć zmiennej o nazwie class, to słowo kluczowe.
nickb
14
@nickb: to nie jest słowo kluczowe Java 'class'. jak już wspomniałem, nazwa obiektu 'claѕѕ'ma 'ss'znaki spoza ASCII. więc w rzeczywistości nazwa obiektu claѕѕbrzmi: cla\u0455\u0455'Myślę, że to wyjaśnia nieporozumienie. :)
ashgkwd