Этот вопрос обсуждается на мета . Приведем аргументы за или против закрытия / удаления его там.
Адам Лир
63
@anotherually Вам, вероятно, стоит отказаться от своего друга как учителя программирования, если он / она посчитали, что совет вам разобраться в этом будет хорошим способом выучить этот язык. Запоминать непочтительные мелочи вообще бесполезно. Тем более, когда вы начинаете изучать язык.
В вашем get crazyпримере есть несколько ошибок . (1) вы забыли добавить точку с запятой после ____=__(два раза), (2) если вы пытаетесь перегрузить _метод, вам также необходимо передать тип, что и _(___)должно быть _(_ ___). Вот как это может выглядеть class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Подожди минуту. Я только что отлаживал символы подчеркивания? Пришло время для тормоза.
Pshemo
@Pshemo Lol, я никогда не собирался серьезно относиться к этому коду: P fixed
tckmn
Получите +1 за комментарий к моему ответу. Не мог придумать другого способа наградить вас.
Эд Хил
71
_ - это имя класса, подчеркивание - это допустимое имя переменной Java, вам просто нужно сделать отступ в коде, чтобы деобфускировать его:
class_{
_ _;
_(){
_=this;
}
}
Подобно:
classA{
A A;
A(){
A=this;
}
}
Изменить: благодаря @Daniel Fischer
Имена типов и имена переменных имеют разные пространства имен. и, например, код class FOO { FOO FOO; }действителен на Java.
Кроме того, каждое объявленное перечисление имеет собственное пространство имен. Идентичные имена разных типов не конфликтуют; например, метод может называться так же, как локальная переменная .
Нет никакой ошибки. Он отлично компилируется, когда я набирал текст. Я просто не понимал этого до сих пор.
еще один обыкновенный
2
Имена типов @GrijeshChauhan и имена переменных имеют разные пространства имен. class FOO { FOO FOO; }работает.
Daniel Fischer
1
В Haskell, например, типы и значения также имеют разные пространства имен. Разница в том, что регистр имеет значение, имя типа должно начинаться с заглавной буквы, поэтому вы не можете называть какое-либо старое значение как тип, а только конструкторы, но data Foo = Foo | Bar Intработает. Конечно, он может работать только на языках, где вы можете определить категорию идентификатора, по которой он появляется.
Daniel Fischer
2
@anotherordinary прочтите мой обновленный ответ, я также добавил ссылку
Grijesh Chauhan
2
@GrijeshChauhan Я это вижу. Спасибо :)
еще один обычный
12
ну это хороший пример. Java позволяет Unicode быть идентификаторами, поэтому вы можете написать что-то вроде:
class ⲥlass{
ⲥlass claѕѕ;
}
здесь имя класса c - '' (U + 2CA5 КОПТИЧЕСКАЯ СТРОЧНАЯ БУКВА SIMA) и
'ѕ' в имени объекта (U + 0455 КИРИЛИЧЕСКАЯ СТРОЧНАЯ БУКВА DZE).
У вас не может быть переменной с именем class, это ключевое слово.
nickb
14
@nickb: это не ключевое слово Java 'class'. как я уже упоминал, это имя объекта 'claѕѕ'имеет 'ss'символы, отличные от ascii. так что на самом деле имя объекта - claѕѕэто, cla\u0455\u0455'я думаю, это устраняет недоразумение. :)
Ответы:
_
это имя класса. Это очень сбивает с толку, но работает!С переименованием класса:
class Something {Something something;Something(){something=this;}}
И почистил:
class Something { Something something; Something() { something=this; } }
И вы можете сойти с ума от этого странного наименования
:)
class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__=___;}}
Фактически, Unicode даже поддерживается, так что это действительно так:
class 合法類別名稱{合法類別名稱(){}}
источник
get crazy
примере есть несколько ошибок . (1) вы забыли добавить точку с запятой после____=__
(два раза), (2) если вы пытаетесь перегрузить_
метод, вам также необходимо передать тип, что и_(___)
должно быть_(_ ___)
. Вот как это может выглядетьclass _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}
. Подожди минуту. Я только что отлаживал символы подчеркивания? Пришло время для тормоза._
- это имя класса, подчеркивание - это допустимое имя переменной Java, вам просто нужно сделать отступ в коде, чтобы деобфускировать его:class _{ _ _; _(){ _=this; } }
Подобно:
class A{ A A; A(){ A=this; } }
Изменить: благодаря @Daniel Fischer
Резюме
_
это имя класса, например, вclass _{
_
имя члена класса, например at_ _;
и_=this
_
это имя конструктора, например, в_()
Помните: Java использует шесть разных пространств имен:
источник
class FOO { FOO FOO; }
работает.data Foo = Foo | Bar Int
работает. Конечно, он может работать только на языках, где вы можете определить категорию идентификатора, по которой он появляется.ну это хороший пример. Java позволяет Unicode быть идентификаторами, поэтому вы можете написать что-то вроде:
class ⲥlass { ⲥlass claѕѕ; }
здесь имя класса c - '' (U + 2CA5 КОПТИЧЕСКАЯ СТРОЧНАЯ БУКВА SIMA) и
'ѕ' в имени объекта (U + 0455 КИРИЛИЧЕСКАЯ СТРОЧНАЯ БУКВА DZE).
источник
class
, это ключевое слово.'class'
. как я уже упоминал, это имя объекта'claѕѕ'
имеет'ss'
символы, отличные от ascii. так что на самом деле имя объекта -claѕѕ
это,cla\u0455\u0455'
я думаю, это устраняет недоразумение. :)