Попробуйте:
<([^\s]+)(\s[^>]*?)?(?<!/)>
Он похож на ваш, но последний >
не должен быть после косой черты, а также принимает h1
.
Поскольку статика инициализируется в порядке, указанном в исходном коде.
Проверьте это:
class MyClass {
private static MyClass myClass = new MyClass();
private static MyClass myClass2 = new MyClass();
public MyClass() {
System.out.println(myClass);
System.out.println(myClass2);
}
}
Это напечатает:
null
null
myClassObject
null
EDIT
Хорошо, давайте сделаем это более понятным.
Является ли это ясно?
EDIT 2
Как указал Варман, ссылка на себя будет нулевой пока он инициализируется. Что имеет смысл, если вы думаете об этом.
, потому что статические поля инициализированы в том же порядке, который они определили.
@Pyrolistical
, так как исходный первый статический класс myclass не полностью построен ... результат i get is
null null testInitialize.MyObject@70f9f9d8 null
Попробуем другой способ объяснить это ...
Это последовательность, которую JVM проходит, когда вы впервые ссылаетесь на класс MyClass
.
static { ... }
. Затем JVM инициализирует старую переменную myClass
в новом экземпляре MyClass
. Когда это произойдет, JVM замечает, что MyClass
уже загружен (байт-код) и в процессе инициализации, поэтому он пропускает инициализацию. Выделите память на кучу для объекта. Выполнить конструктор. Распечатайте значение obj
, которое все еще null
(так как оно не является частью инициализированных переменных кучи и конструктора). Когда конструктор заканчивается, выполните следующий статический инициализатор, который устанавливает obj
в новый экземпляр Object
. obj
не будет null
, а ссылкой на экземпляр Object
. Помните, что Java указывает, что переменной final
присваивается значение один раз. Дело не в том, что гарантированно присваивается значение, когда код ссылается на него, если вы не убедитесь, что код ссылается на него после его назначения.
Это не ошибка. Это определенный способ обработки использования класса во время его собственной инициализации. Если бы это было не так, то JVM переходила бы в бесконечный цикл. См. Шаг № 3.3 (если JVM не пропускает инициализацию для класса, который находится в процессе инициализации, он просто сохранит его инициализацию - бесконечный цикл).
Обратите внимание, что все это происходит на одном и том же который сначала ссылается на класс. Во-вторых, JVM гарантирует, что инициализация завершится до того, как любой другой поток сможет использовать этот класс.
Это потому, что Java выполняет статический раздел, чтобы он был объявлен. В вашем случае последовательность
Когда # 1 выполняется, obj все еще не инициализирован , поэтому он печатает нуль. Попробуйте следующее, и вы увидите разницу:
class MyClass {
private static final Object obj = new Object();
private static MyClass myClass = new MyClass();
public MyClass() {
System.out.println(obj); // will print null once
}
}
Вообще говоря, лучше избегать такой конструкции все вместе. Если вы пытаетесь создать синглтон, вот как выглядит этот фрагмент кода:
class MyClass {
private static final MyClass myClass = new MyClass();
private Object obj = new Object();
private MyClass() {
System.out.println(obj); // will print null once
}
}
myClass
сам статичен. – BalusC 30 March 2010 в 19:44null null myClassObjectref null
– Vaman Kulkarni 24 March 2012 в 17:21