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?
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?
Respuestas:
_
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 合法類別名稱{合法類別名稱(){}}
get crazy
ejemplo. (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.
_
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 .
class FOO { FOO FOO; }
trabajos.
data Foo = Foo | Bar Int
funciona. Solo puede funcionar, por supuesto, en idiomas en los que puede averiguar la categoría de un identificador desde donde aparece.
bueno, ese es un buen ejemplo. Java permite que unicode sean identificadores para que pueda escribir algo como:
class ⲥlass {
ⲥ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).
class
, es una palabra clave.
'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. :)