Що насправді робить підкреслення в цьому коді Java? [зачинено]


81

Я тільки почав вивчати Java.

Мій друг, який допомагає мені вчитися, щойно надіслав мені це і сказав "розгадай".

На жаль, я не можу прочитати це. Мені здається Perl.

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

Що це означає?


17
Це питання обговорюється на мета . Візьмемо аргументи за чи проти закриття / видалення там.
Адам Лір

63
@anotherordinary Вам, мабуть, слід відмовитись від свого друга як вчителя програмування, якщо він / вона вважає, що сказати тобі це зрозуміти було б хорошим способом вивчити цю мову. Згадувати неповажні дрібниці зовсім не корисно. Набагато менше, коли ви починаєте вивчати мову.
Enno Shioji

2
@EnnoShioji Чудовий момент. «Неістотно». Вибачте.
Асад Саедуддін,

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 合法類別名稱{合法類別名稱(){}}

29
Я особисто люблю
редакцію

4
У вашому get crazyприкладі мало помилок . (1) ви забули додати крапку з комою після ____=__(два рази), (2) якщо ви намагаєтесь перевантажити _метод, то вам потрібно також передати тип, так і _(___)повинно бути _(_ ___). Ось як це може виглядати class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Почекай хвилинку. Чи я щойно налагоджував підкреслення? Настав час гальма.
Пшемо

@Pshemo Лол, я ніколи насправді не хотів серйозно ставитися до цього коду: P фіксовано
tckmn

Отримайте +1 за коментар до моєї відповіді. Не міг придумати іншого способу нагородити вас.
Ед Хіл

71

_ це ім'я класу, підкреслення - дійсне ім'я змінної Java, вам просто потрібно відступити свій код, щоб його деобфускатировать:

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

Подібно до:

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

Редагувати: завдяки @Daniel Fischer

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

Резюме

  • _ - це назва класу, наприклад, class _{
  • _- це ім’я члена класу, наприклад, на _ _;та_=this
  • _ - це назва конструктора, наприклад at _()

Пам'ятайте: Java використовує шість різних просторів імен:

  • Імена пакетів,
  • імена типів,
  • імена полів (змінних),
  • імена методів,
  • локальні імена змінних (включаючи параметри) та
  • етикетки.

Крім того, кожен оголошений перелік має власний простір імен. Ідентичні назви різних типів не суперечать; наприклад, метод може бути названий так само, як і локальна змінна .


3
Помилки немає. Він компілюється дуже добре, як я набрав. Я просто досі цього не розумів.
ще один звичайний

2
Імена типів @GrijeshChauhan та імена змінних мають різні простори імен. class FOO { FOO FOO; }робіт.
Даніель Фішер,

1
Наприклад, у Haskell типи та значення також мають різні простори імен. Різниця полягає в тому, що регістр має значення, ім’я типу повинно починатися з великої літери, тому ви не можете назвати жодне старе значення як тип, а лише конструктори, але data Foo = Foo | Bar Intпрацює. Звичайно, це може працювати лише на тих мовах, де категорію ідентифікатора можна з’ясувати з того місця, де він з’являється.
Даніель Фішер

2
@anotherordinary прочитав мою оновлену відповідь. Я також додав посилання
Grijesh Chauhan

2
@GrijeshChauhan Я це бачу. Спасибі :)
ще один звичайний

12

ну це хороший приклад. Java дозволяє Unicode бути ідентифікаторами, щоб ви могли написати щось на зразок:

classlass {
ⲥlass claѕѕ;
}

тут назва класу c - 'ⲥ' (U + 2CA5 КОПТИЧНИЙ МАЛИЙ ЛІТЕР SIMA) і

назва об'єкта 'ѕ' (U + 0455 КИРИЛИЧНИЙ МАЛИЙ ЛІТЕР DZE).


Ви не можете мати змінну з іменем class, це ключове слово.
nickb

14
@nickb: це не ключове слово Java 'class'. як я вже згадував , що ім'я об'єкта 'claѕѕ'має , 'ss'які не є символами ASCII. так насправді ім'я об'єкта полягає в claѕѕтому, що cla\u0455\u0455'я думаю, це очищає непорозуміння. :)
ashgkwd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.