2013-03-26 18 views
79

Właśnie zacząłem uczyć się Javy.Co to jest podkreślenie w tym kodzie Java?

Mój przyjaciel, który pomaga mi się uczyć, przysłał mi to i powiedział: "wymyśl to".

Niestety nie mogę tego przeczytać. Dla mnie wygląda na Perla.

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

Co to znaczy?

+17

To pytanie jest przedmiotem dyskusji [w sprawie meta] (http://meta.stackexchange.com/questions/173714/can-we-nuke-this-too-localized-question). Weźmy za to argumenty za lub przeciw zamknieciu/usunięciu. –

+63

@anotherordinary Powinieneś prawdopodobnie porzucić swojego przyjaciela jako nauczyciela programowania, jeśli pomyślałby, że powiedzenie ci, że to zrozumiesz, byłoby dobrym sposobem na naukę tego języka. Zapamiętywanie lekceważących ciekawostek w ogóle nie jest użyteczne. Znacznie mniej, gdy zaczynasz uczyć się języka. –

+2

@EnnoShioji Świetny punkt. "Bez znaczenia". Przepraszam. –

Odpowiedz

151

_ to nazwa klasy. To bardzo mylące, ale działa!

z klasą przemianowany:

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

I oczyścić:

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

I można zwariować z tym dziwne nazewnictwa :)

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

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

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

Ja osobiście uwielbiam edycję @ Alvina :) –

+3

W twoim przykładzie "wariata" jest kilka błędów. (1) zapomniałeś dodać średnika po '____ = __' (dwa razy), (2) jeśli próbujesz przeciążyć metodę '_' to musisz także przekazać typ, więc' _ (___) 'powinno być' _ (_ ___) '. Oto jak może wyglądać "class _ {_ __; _ ____; _() {__ = this; ____ = __;} _ (_ ___) {__ = ___;}}'. Poczekaj minutę. Czy właśnie debugowałem podkreślenia? Czas na hamulec. – Pshemo

+0

@Pshemo Lol, nigdy naprawdę nie zamierzałem poważnie traktować tego kodu: P naprawiono – Doorknob

69

_ jest nazwa klasy, podkreślenia jest ważna nazwa zmiennej Java, wystarczy, aby wciąć kod, aby go deobfuscate:

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

odczuwalna:

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

Edit: dzięki @Daniel Fischer

Wpisz nazwy i zmienną na mes mają różne przestrzenie nazw. i na przykład kod class FOO { FOO FOO; } jest poprawny w Javie.

Streszczenie

  • _ jest nazwa klasy przykład w class _{
  • _ jest członkiem klasy nazwa przykład w _ _; i _=this
  • _ jest nazwą konstruktor np w _()

Pamiętaj: Java używa six different namespaces:

  • nazw pakietów
  • nazwy typu,
  • Field (zmiennych) nazwiska,
  • nazwy metod,
  • zmiennej lokalnej nazwy (w tym parametry) i
  • etykiet.

Ponadto każde deklarowane wyliczenie ma swoją własną przestrzeń nazw. Identyczne nazwy różnych typów nie powodują konfliktu; na przykład metoda może być nazwana tak samo jak zmienna lokalna.

+3

Nie ma błędu. Kompiluje się dobrze, jak pisałem. Po prostu tego nie rozumiałem do tej pory. –

+2

@ Nazwy typów i nazwy zmiennych @GrijeshChauhan mają różne przestrzenie nazw. 'klasa FOO {FOO FOO; } 'działa. –

+0

@DanielFischer Dzięki .. To tylko w Javie **? ** ..Jaki inny język to robi? –

10

cóż, to dobry przykład. Java pozwala unicode być identyfikatory, dzięki czemu można napisać coś takiego:

class ⲥlass { 
ⲥlass claѕѕ; 
} 

tutaj klasa imię c jest 'ⲥ' (U + 2CA5 KOPTYJSKI mała litera SIMA) i

nazwa obiektu za 'ѕ' ​​(U + 0455 CYRILIC MAŁY LIST DZE).

+0

Nie można mieć zmiennej o nazwie "klasa", jest to słowo kluczowe. – nickb

+12

@nickb: nie jest słowem kluczowym Java "class". jak już wspomniałem, nazwa obiektu '' cla's'' ma ''ss'', który nie jest znakiem ASCII. więc faktycznie nazwa obiektu to 'cla 'to' cla \ u0455 \ u4545 "" Myślę, że to usuwa nieporozumienie. :) – ashgkwd