Neir0, всё понятно — без практики тоже мало что хорошего выходит. И мотивация нужна итд итп, всё верно. Но речь то не об этом. Теория — это необходимая основа. Программирование это не просто калякание кода (хотя, кому как, конечно). Сесть и писать сразу без оглядки на то, как нужно, как делают другие, и как вообще можно сделать — выходит полная фигня в 100% случаях. Видел я таких «ремесленников», ага. «Владение синтаксисом» — это вообще не программирование, и это даже не основы; язык — это всего лишь инструмент и не более.
з.ы. отстойно, что оповещения об ответах тут не приходят.
Сложно (или даже невозможно), потому что существует множество валидных code point вида U+00XX U+XX00, которые, очевидно, никак нельзя однозначно детектировать в подобных условиях.
Разумеется, будет так для закодированных ascii-символов только, так что надо смотреть вероятность появления итд. Для произвольного короткого текста определить будет сложно.
Епстественно(ц). Никаких многосложных if-ов на самом деле и нету в итоге. Ясно понятно, там всё превращается в цепочку проверок и джамп в зависимости от флагов. Всё точно также как и C/C++/всёостальное при превращении в машинный код.
Дополнение: это следует из того, что сектор — он сектор и есть, физическое понятие разметки винта. Блок — это уже просто логическое понятие, в разном контексте имеющее разное значение. Любая сущность, определяющая размер данных на винте, понятно что будет кратна минимально адресуемому блоку — сектору. ФС то какая?
Полагаю, что большинство знают как раз, потому и минусуют, потому что это не открытие и не WTF-жирным-шрифтом, а самая очевидная очевидность для любого программиста.
Да нет в байткоде этой информации. Откройте байткод самого класса и посмотрите. В байткоде вызова оно как будто бы есть, а на самом деле фактически тоже нету, есть только поле и всё.
Вот если вы в начале метода сделаете new Bar(), то получится как раз такое: вызовется static у Foo, потом static у Bar и напечатается 42.
А… так вопрос в том числе о том, почему в спецификации именно так. Тут немного с другого конца зайти можно в объяснении, но суть одна — никак нельзя по другому, вам объяснили ниже об инициализации. Я также сказал о невиртуальности статических сущностей. Как вы видите вообще вызов тогда статических методов, например? И то, что при вашей идее Bar.x и Foo.x будет выдавать разные результаты (в рантайме!) вас тоже не смущает? То что вы написали тут getstatic <Field int Bar.x> это просто нарисовалось, реально же статик имеется только один.
Всё верно, чего тут ещё в байткоде нарисуется? Но это же просто getstatic. В статик-блоке класса Bar там же используется аналогично putstatic Bar.x, поглядите и убедитесь. Хотя реально поле определено в классе Foo.
Вы же сами скинули отрывок из спецификации, который явно говорит о том, что речь о классе, в котором поле declared.
И это — не «использование в каком-либо виде», этот класс нигде не грузится, потому статик-метод и не должен выполниться.
Блин, перечитал, пояснил путано. Короче, статические методы невиртуальные и связываются на этапе компиляции. Потому же они и к this не имеют доступа и переопределяться не могут (хотя их перекрыть можно).