Попробуем другой способ объяснить это ...
Это последовательность, которую JVM проходит, когда вы впервые ссылаетесь на класс MyClass
.
static { ... }
. Затем JVM инициализирует старую переменную myClass
в новом экземпляре MyClass
. Когда это произойдет, JVM замечает, что MyClass
уже загружен (байт-код) и в процессе инициализации, поэтому он пропускает инициализацию. Выделите память на кучу для объекта. Выполнить конструктор. Распечатайте значение obj
, которое все еще null
(так как оно не является частью инициализированных переменных кучи и конструктора). Когда конструктор заканчивается, выполните следующий статический инициализатор, который устанавливает obj
в новый экземпляр Object
. obj
не будет null
, а ссылкой на экземпляр Object
. Помните, что Java указывает, что переменной final
присваивается значение один раз. Дело не в том, что гарантированно присваивается значение, когда код ссылается на него, если вы не убедитесь, что код ссылается на него после его назначения.
Это не ошибка. Это определенный способ обработки использования класса во время его собственной инициализации. Если бы это было не так, то JVM переходила бы в бесконечный цикл. См. Шаг № 3.3 (если JVM не пропускает инициализацию для класса, который находится в процессе инициализации, он просто сохранит его инициализацию - бесконечный цикл).
Обратите внимание, что все это происходит на одном и том же который сначала ссылается на класс. Во-вторых, JVM гарантирует, что инициализация завершится до того, как любой другой поток сможет использовать этот класс.
Разница во втором аргументе. Второй аргумент substring
- это индекс, который должен останавливаться на (но не включать), но второй аргумент substr
- это максимальная длина для возврата.
Ссылки?
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr
https://developer.mozilla.org/en/ JavaScript / Справка / Global_Objects / String / подстрока
Slice vs Substr vs Substring vs [] Методы
Для каждого из этих javascript-методов существуют преимущества производительности. Пожалуйста, используйте эти функции соответственно.
Как было намечено в ответе yatima2975, есть дополнительная разница:
substr()
принимает отрицательную стартовую позицию как смещение от конца строки. substring()
нет.
Из MDN :
Если начало отрицательное, substr () использует его как индекс символа с конца строки
Итак, суммируем функциональные отличия:
substring(begin-offset, end-offset-exclusive)
, где начальное смещение -0
или больше
substr(begin-offset, length)
, где начальное смещение также может быть отрицательным
Разница - второй параметр. Их второй параметр, в то время как оба числа ожидают двух разных вещей:
При использовании подстроки второй параметр является первым индексом, который не должен включать:
var s = "string";
s.substring(1, 3); // would return 'tr'
var s = "another example";
s.substring(3, 7); // would return 'ther'
При использовании substr второй параметр - количество символов для включения в подстроку:
var s = "string";
s.substr(1, 3); // would return 'tri'
var s = "another example";
s.substr(3, 7); // would return 'ther ex'
Основное отличие состоит в том, что
substr () позволяет указать максимальную длину для возврата
substring () позволяет вам указывать индексы, а второй аргумент НЕ включен
Существуют некоторые дополнительные тонкости между substr () и substring (), такие как обработка равных аргументов и отрицательных аргументов. Также обратите внимание, что substring () и slice () аналогичны, но не всегда одинаковы.
length vs indices
"string".substr(2,4); // "ring" (start, length) length is the maximum length to return
"string".substring(2,4); // "ri" (start, end) indices / second value is NOT inclusive
"string".slice(2,4); // "ri" (start, end) indices / second value is NOT inclusive
watch out for substring swap
"string".substr(3,2); // "in"
"string".substring(3,2); // "r" (swaps the larger and the smaller number)
"string".slice(3,2); // "" (just returns "")
handling negative arguments
"string".substr(2,-4); // ""
"string".substring(2,-4); // "st" (converts negative numbers to 0, then swaps first and second position)
"string".slice(2,-4); // ""
substr
( MDN ) принимает параметры как (from, length)
. substring
( MDN ) принимает параметры как (from, to)
.
alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"
Вы можете помнить, что substring
принимает индексы, как и еще один метод извлечения строки, slice .
При запуске с 0 вы можете использовать любой из этих методов.
.substring()
принимает индексы. Вы можете помнить, потому что это единственное имя с именем «i». .slice()
также принимает индексы.
– colllin
21 January 2014 в 02:36
Еще одна проблема, с которой я недавно столкнулся, заключается в том, что в IE 8 "abcd".substr(-1)
ошибочно возвращает "abcd"
, тогда как Firefox 3.6 возвращает "d"
, как и следовало ожидать. slice
работает правильно на обоих.
Большая разница заключается в том, что substr()
- устаревший метод, который все еще можно использовать, но его следует использовать с осторожностью, поскольку в будущем они будут удалены полностью. Вы должны работать, чтобы удалить их использование из своего кода. И метод substring()
преуспел и указал предыдущий.
substr()
? Я прочитал его от нескольких человек, но я не могу найти какую-либо информацию в Интернете, которая поддерживает это заявление. Кроме того, Mozilla не включает его в список устаревших / устаревших функций: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– DanielM
8 November 2016 в 11:01