¿Qué hace realmente el guión bajo en este código Java? [cerrado]

81

Recién comencé a aprender Java.

Mi amigo, que me está ayudando a estudiar, me acaba de enviar esto y me dijo 'averigua esto'.

Desafortunadamente no puedo leer esto. Me parece Perl.

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

Qué significa eso?

otro ordinario
fuente
17
Esta pregunta se está discutiendo en meta . Tomemos argumentos a favor o en contra de cerrarlo / eliminarlo allí.
Adam Lear
63
@anotherordinary Probablemente deberías deshacerte de tu amigo como profesor de programación si piensa que decirte que averigües esto sería una buena manera de aprender este lenguaje. Recordar trivialidades irreverentes no es útil en absoluto. Mucho menos cuando estás empezando a aprender un idioma.
Enno Shioji
2
@EnnoShioji Gran punto. "Irrelevante". Lo siento.
Asad Saeeduddin
1
¿Alguien está intentando crear el "IOJCC"? (google "IOCCC")
Olivier Dulac
1
@EnnoShioji ¿Cómo es esta "trivia irrelevante" que hay que recordar? Cualquiera que se llame a sí mismo un programador de Java debería poder entender esto fácilmente.
phant0m

Respuestas:

154

_es el nombre de la clase. Es muy confuso, ¡pero funciona!

Con la clase renombrada:

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

Y limpiado:

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

Y puedes volverte loco con este extraño nombre :)

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

De hecho, incluso se admite Unicode, por lo que esto es válido:

class 合法類別名稱{合法類別名稱(){}}
tckmn
fuente
29
Personalmente me encanta la edición de @ Alvin :)
Bartek Banachewicz
4
Hay pocos errores en tu get crazyejemplo. (1) olvidó agregar punto y coma después ____=__(dos veces), (2) si está tratando de sobrecargar el _método, entonces también debe pasar el tipo, por lo que _(___)debería ser _(_ ___). Así es como puede verse class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Espera un minuto. ¿Acabo de depurar guiones bajos? Es hora de frenar.
Pshemo
@Pshemo Lol, nunca quise tomar en serio ese código: P arreglado
tckmn
Obtén un +1 por el comentario de mi respuesta. No se me ocurrió otra forma de recompensarte.
Ed Heal
71

_ es el nombre de la clase, el subrayado es un nombre de variable Java válido, solo necesita sangrar su código para desofuscarlo:

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

Me gusta:

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

Editar: gracias a @Daniel Fischer

Los nombres de tipos y los nombres de variables tienen espacios de nombres diferentes. y por ejemplo, el código class FOO { FOO FOO; }es válido en Java.

Resumen

  • _ es un nombre de clase, por ejemplo, en class _{
  • _es un nombre de miembro de la clase, por ejemplo, en _ _;y_=this
  • _ es un nombre de constructor, por ejemplo, en _()

Recuerde: Java utiliza seis espacios de nombres diferentes:

  • Nombres de paquetes,
  • nombres de tipo,
  • nombres de campo (variable),
  • nombres de métodos,
  • nombres de variables locales (incluidos los parámetros) y
  • etiquetas.

Además, cada enumeración declarada tiene su propio espacio de nombres. Los nombres idénticos de diferentes tipos no entran en conflicto; por ejemplo, un método puede tener el mismo nombre que una variable local .

Grijesh Chauhan
fuente
3
No hay error. Se compila muy bien mientras escribía. Simplemente no lo entendí hasta ahora.
otro ordinario
2
Los nombres de tipo de @GrijeshChauhan y los nombres de variable tienen espacios de nombres diferentes. class FOO { FOO FOO; }trabajos.
Daniel Fischer
1
En Haskell, por ejemplo, los tipos y valores también tienen diferentes espacios de nombres. Una diferencia es que el caso tiene significado, un nombre de tipo debe comenzar con una letra mayúscula, por lo que no puede nombrar ningún valor antiguo como un tipo, sino solo constructores, pero data Foo = Foo | Bar Intfunciona. Solo puede funcionar, por supuesto, en idiomas en los que puede averiguar la categoría de un identificador desde donde aparece.
Daniel Fischer
2
@anotherordinary leer mi respuesta actualizada También agregué un enlace
Grijesh Chauhan
2
@GrijeshChauhan Lo veo. Gracias :)
otro ordinario
12

bueno, ese es un buen ejemplo. Java permite que unicode sean identificadores para que pueda escribir algo como:

classlass {
ⲥlass claѕѕ;
}

aquí la c del nombre de la clase es 'ⲥ' (U + 2CA5 COPTIC MINÚSCULA SIMA) y

'ѕ' del nombre del objeto (U + 0455 LETRA CIRILICA MINÚSCULA DZE).

ashgkwd
fuente
No puede tener una variable nombrada class, es una palabra clave.
nickb
14
@nickb: no es una palabra clave de Java 'class'. como he mencionado, el nombre del objeto 'claѕѕ'tiene caracteres 'ss'que no son ascii. así que en realidad el nombre del objeto claѕѕes cla\u0455\u0455'Creo que esto aclara el malentendido. :)
ashgkwd