Что на самом деле делает подчеркивание в этом Java-коде? [закрыто]

81

Я только начал изучать Java.

Мой друг, который помогает мне учиться, просто прислал мне это и сказал: «Разберись с этим».

К сожалению, я не могу это прочитать. Мне это кажется Perl.

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

Что это означает?

другой обычный
источник
17
Этот вопрос обсуждается на мета . Приведем аргументы за или против закрытия / удаления его там.
Адам Лир
63
@anotherually Вам, вероятно, стоит отказаться от своего друга как учителя программирования, если он / она посчитали, что совет вам разобраться в этом будет хорошим способом выучить этот язык. Запоминать непочтительные мелочи вообще бесполезно. Тем более, когда вы начинаете изучать язык.
Энно Сиодзи
2
@EnnoShioji Отличная точка. «Неактуально». Сожалею.
Asad Saeeduddin
1
кто-то пытается создать «IOJCC»? (Google "IOCCC")
Оливье Дюлак,
1
@EnnoShioji Как это "неуместные мелочи", которые нужно помнить? Любой, кто называет себя Java-программистом, должен легко это понять.
phant0m

Ответы:

154

_это имя класса. Это очень сбивает с толку, но работает!

С переименованием класса:

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

И почистил:

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

И вы можете сойти с ума от этого странного наименования :)

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

Фактически, Unicode даже поддерживается, так что это действительно так:

class 合法類別名稱{合法類別名稱(){}}
tckmn
источник
29
Мне лично нравится редакция @ Alvin :)
Bartek Banachewicz
4
В вашем get crazyпримере есть несколько ошибок . (1) вы забыли добавить точку с запятой после ____=__(два раза), (2) если вы пытаетесь перегрузить _метод, вам также необходимо передать тип, что и _(___)должно быть _(_ ___). Вот как это может выглядеть class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Подожди минуту. Я только что отлаживал символы подчеркивания? Пришло время для тормоза.
Pshemo
@Pshemo Lol, я никогда не собирался серьезно относиться к этому коду: P fixed
tckmn
Получите +1 за комментарий к моему ответу. Не мог придумать другого способа наградить вас.
Эд Хил
71

_ - это имя класса, подчеркивание - это допустимое имя переменной Java, вам просто нужно сделать отступ в коде, чтобы деобфускировать его:

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

Подобно:

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

Изменить: благодаря @Daniel Fischer

Имена типов и имена переменных имеют разные пространства имен. и, например, код class FOO { FOO FOO; }действителен на Java.

Резюме

  • _ это имя класса, например, в class _{
  • _имя члена класса, например at _ _;и_=this
  • _ это имя конструктора, например, в _()

Помните: Java использует шесть разных пространств имен:

  • Имена пакетов,
  • имена типов,
  • имена полей (переменных),
  • имена методов,
  • имена локальных переменных (включая параметры) и
  • этикетки.

Кроме того, каждое объявленное перечисление имеет собственное пространство имен. Идентичные имена разных типов не конфликтуют; например, метод может называться так же, как локальная переменная .

Гриджеш Чаухан
источник
3
Нет никакой ошибки. Он отлично компилируется, когда я набирал текст. Я просто не понимал этого до сих пор.
еще один обыкновенный
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 быть идентификаторами, поэтому вы можете написать что-то вроде:

classlass {
ⲥlass claѕѕ;
}

здесь имя класса c - '' (U + 2CA5 КОПТИЧЕСКАЯ СТРОЧНАЯ БУКВА SIMA) и

'ѕ' в имени объекта (U + 0455 КИРИЛИЧЕСКАЯ СТРОЧНАЯ БУКВА DZE).

Ashgkwd
источник
У вас не может быть переменной с именем class, это ключевое слово.
nickb
14
@nickb: это не ключевое слово Java 'class'. как я уже упоминал, это имя объекта 'claѕѕ'имеет 'ss'символы, отличные от ascii. так что на самом деле имя объекта - claѕѕэто, cla\u0455\u0455'я думаю, это устраняет недоразумение. :)
ashgkwd