Блок инициализации

Блок инициализации (initialization block) — понятие в объектно-ориентированном программировании, в основном известное из языка Java, которое представляет собой последовательность команд, выполняемых при создании (загрузке) классов и объектов. Разработано, чтобы значительно увеличить мощность конструктора. Существуют два типа: статический блок инициализации, обычно называемый для краткости статический блок (static block), и динамический блок инициализации (instance block).

Мотивация

При создании объекта выполняются различные команды, указанные в конструкторе. Иногда возникает необходимость расширения возможностей синтаксиса. Как правило, динамический блок существует только для удобства — он может быть легко заменен путем добавления функции загрузки и ее вызова из каждого конструктора. Однако статический блок в значительной степени увеличивает функциональность программы и поэтому используется намного чаще.

Статический блок инициализации

Статический блок — это, в сущности, конструктор для всего класса. Его синтаксис:

...
static {
	// Static block code
}
...

Он ставится между определениями полей и функциями класса. Команды будут выполняться в одном из двух случаев, том, который наступит раньше:

  1. При создании первого объекта класса в процессе работы программы, перед запуском конструктора.
  2. При первом вызове статической функции, перед выполнением.

То есть код выполняется при первой загрузке класса. В предлагаемом примере нужно создать класс, моделирующий автомобили, произведённые конкретной компанией, и сопровождающий их в целях отслеживания остальной части их существования, включая ситуацию в данный момент времени, владельцев, историю ремонта и т. д. Каждый объект — это автомобиль, а в классе есть статическое поле, которое содержит базу данных всех автомобилей. Основано на структуре map, когда ключ — это модель автомобиля, а содержание — группа автомобилей этой модели. Следующий код демонстрирует использование статического блока инициализации:

public class Car {
	static Map<String, Set<Car>> catalog;
	static {
		catalog = new HashMap<String, Set<Car>>();
		catalog.put("model105", new HashSet<Car>());
		catalog.put("model125", new HashSet<Car>());
		catalog.put("model140", new HashSet<Car>());
		catalog.put("model201", new HashSet<Car>());
	}
	public Car (String model) {
		catalog.get(model).add(this);
		// ...
	}
	// ...
}

Строку 4 можно легко присоединить к строке 2, без необходимости в статическом блоке. Однако строки 5—8 показывают потребность в нём — возможность выполнять сложные команды на уровне класса, которые на уровне объекта появились бы в конструкторе.

Динамический блок инициализации

Динамический блок представляет собой дополнение к конструктору. Его синтаксис:

...
{
	// Instance block code
}
...

Он ставится между определениями полей и функциями класса. Команды будут выполняться при создании объекта. Динамический блок — это добавка для упрощения написания конструктора, и он не приносит дополнительной функциональности. Он позволяет сэкономить создание функции запуска и добавление её вызова из всех конструкторов. Например, фрагмент кода:

public class Car {
	static int count = 0;
	public Car (String model) {
		init();
		// ...
	}
	public Car (String model, Double price) {
		init();
		// ...
	}

	private void init() {
		count++;
		System.out.println("Hello everyone, we have " + count + " cars now!");
	}
	// ...
}

равнозначен коду:

public class Car {
	static int count = 0;
	public Car (String model) {
		// ...
	}
	public Car (String model, Double price) {
		// ...
	}

	{
		count++;
		System.out.println("Hello everyone, we have " + count + " cars now!");
	}
	// ...
}

Порядок выполнения загрузки

При разработке языка Java был установлен постоянный порядок действий при загрузке. Во время загрузки класса порядок выглядит следующим образом:

  1. Определения статических полей родительских классов.
  2. Инициализация статических полей и выполнение статических блоков родительских классов.
  3. Определения статических полей класса.
  4. Инициализация статических полей и выполнение статических блоков класса.

Затем, при создании объекта, порядок выглядит следующим образом:

  1. Определения полей объекта из родительских классов.
  2. Инициализация полей и выполнение динамических блоков из родительских классов.
  3. Выполнение конструкторов из родительских классов.
  4. Определения полей объекта из его класса.
  5. Инициализация полей и выполнение динамических блоков из его класса.
  6. Выполнение конструктора из его класса.

Когда существует цепочка предков, все действия выполняются сначала для самого дальнего предка (класс Object), а затем вниз по цепочке в том же порядке до текущего класса.

При наличии более чем одного типа в одном и том же разделе выше, действия выполняются в порядке появления в программе. Например, следующий код:

public class T {
	static int i = 5;
	static {
		i = 10;
	}
	static {
		i = i * 3;
	}
}

присваивает в каждом объекте переменной i значение 30. Но код:

public class T {
	static {
		i = 10;
	}
	static int i = 5;
	static {
		i = i * 3;
	}
}

присваивает значение 15. То есть, вначале создается поле, а потом все действия выполняются в порядке, указанном в программе — первый блок, затем инициализация поля, затем второй блок.

Возможные проблемы

Использование переменной до её определения

Вопреки тому, что можно ожидать, следующий код:

public class T {
	static {
		i = 5;
		i = i + 1;
	}
	static int i = 5;
}

не пройдёт компиляцию в строке 4 на том основании, что правая переменная i была использована, прежде чем она была определена, несмотря на то что строка 3 пройдёт компиляцию и выполнится без проблем, несмотря на то что левая i в строке 4 не вызывает ошибку, и несмотря на то что во время работы при достижении начала строки 4 переменная была определена и получила значение. Это происходит потому, что размещение переменных (например, в строке 3) проверяется по списку переменных, определённых на данный момент в процессе выполнения программы, включая все статические поля, а использование такой переменной проверяется по местоположению определения.

Локальная статическая переменная

Вопреки тому, что можно ожидать, следующий код:

public class T {
	static {
		int i = 10;
	}
	public static void main(String[] args) {
		System.out.println(i);
	}
}

не пройдёт компиляцию в строке 6 на том основании, что переменная не определена, потому что определение переменной в статическом блоке не создает статическую переменную, а только локальную переменную в этом блоке. То есть код static {int i = 10;} не равнозначен коду static int i = 10;.

См. также

Ссылки

Read other articles:

Season of television series Vietnam IdolSeason 3Hosted byPhan AnhJudgesSiu Black Nguyễn Quang Dũng Quốc Trung Đặng Diễm QuỳnhWinnerUyên LinhRunner-upVăn Mai HươngFinals venueLan Anh Music Center ReleaseOriginal networkVTVOriginal releaseAugust 21 (2010-08-21) –December 25, 2010 (2010-12-25)Season chronology← PreviousSeason 2Next →Season 4 The third season of Vietnam Idol premiered on VTV6 on August 21, 2010. There are two episodes every Tuesday ...

 

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Guru Ram Das – berita · surat kabar · buku · cendekiawan · JSTOR Guru Ram DasBiografiKelahiran1534 (Kalender Masehi Gregorius) Lahore Kematian1581 (Kalender Masehi Gregorius) (46/47 tahun)Goindwal Sahib ...

 

1607–1898 Spanish possession in the Caribbean This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Captaincy General of Cuba – news · newspapers · books · scholar · JSTOR (May 2009) (Learn how and when to remove this template message) Captaincy General of CubaCapitanía General de Cuba (Spanish)1607–1899...

Nama ini menggunakan cara penamaan Spanyol: nama keluarga pertama atau paternalnya adalah Fàbregas dan nama keluarga kedua atau maternalnya adalah Soler. Cesc Fàbregas Fabregas bermain untuk Chelsea pada 2015Informasi pribadiNama lengkap Francesc Fàbregas Soler[1]Tanggal lahir 4 Mei 1987 (umur 36)[2]Tempat lahir Arenys de Mar, SpanyolTinggi 1,79 m (5 ft 10+1⁄2 in)[3]Posisi bermain Gelandang tengahInformasi klubKlub saat ini Como U-19 d...

 

Carisio commune di Italia Tempat Negara berdaulatItaliaRegion di ItaliaPiedmontProvinsi di ItaliaProvinsi Vercelli NegaraItalia Ibu kotaCarisio PendudukTotal764  (2023 )GeografiLuas wilayah30,11 km² [convert: unit tak dikenal]Ketinggian183 m Berbatasan denganBalocco Buronzo Cavaglià Formigliana Salussola Santhià Villanova Biellese SejarahSanto pelindungLaurensius Informasi tambahanKode pos13040 Zona waktuUTC+1 UTC+2 Kode telepon0161 ID ISTAT002032 Kode kadaster ItaliaB782 Lain-la...

 

Partai Rakyat Nasional نیشنل پیپلز پارٹیKetua umumGhulam Murtaza Khan JatoiDibentuk1986Dibubarkan2013Digabungkan denganLiga Muslim Pakistan (N)Kantor pusatKarachiSayap pelajarFederasi Pelajar Rakyat NasionalWarnaMerah, putih dan hijau    Senat0 / 104Majelis Nasional2 / 342Majelis Sindh / 168<div error>Kesalahan ekspresi: Operator / tak terduga%; height: 1em;>Lambang pemiluTraktorBenderaPemilihan umum Partai Rakyat Nasional (bahasa Urdu: نیشنل ...

Bagian dari seri mengenai Sejarah Jerman Topik Lini masa Historiografi Sejarah militer Sejarah ekonomi Sejarah wanita Perubahan wilayah Daftar penguasa Jerman Permulaan sejarah Bangsa Jermanik Periode Migrasi Kerajaan Franka Abad Pertengahan Franka Timur Kerajaan Jerman Kekaisaran Romawi Suci Ostsiedlung Permulaan zaman modern Seksionalisme Abad ke-18 Kerajaan Prusia Unifikasi Konfederasi Rhein Konfederasi JermanZollverein Revolusi Jerman 1848 Konfederasi Jerman Utara Reich JermanKekaisaran J...

 

  提示:此条目页的主题不是沙巴民族统一机构。   提示:此条目页的主题不是卡达山杜顺人统一机构 (1961)。 此條目可参照英語維基百科相應條目来扩充。若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签�...

 

恩维尔·霍查Enver Hoxha霍查官方肖像照(摄于1980年代初)阿尔巴尼亚共产党中央委员会总书记任期1943年3月—1948年11月[1]前任無(首任)继任本人(劳动党中央委员会总书记)阿尔巴尼亚劳动党中央委员会总书记任期1948年11月—1954年7月[1]前任本人(共产党中央委员会总书记)继任本人(劳动党中央委员会第一书记)阿尔巴尼亚劳动党中央委员会第一书记任期1954�...

Yang MuliaAngelo ScolaUskup Agung MilanKardinal Scola pada 2009Keuskupan agungMilanPenunjukan28 Juni 2011Awal masa jabatan25 September 2011PendahuluDionigi TettamanziJabatan lainCardinal-Priest of Santi XII ApostoliImamatTahbisan imam18 Juli 1970oleh Abele ConigliTahbisan uskup21 September 1991oleh Bernardin GantinPelantikan kardinal21 Oktober 2003oleh Johanes Paulus IIPeringkatKardinal-ImamInformasi pribadiLahir7 November 1941 (umur 82)Malgrate, ItaliaDenominasiKatolik RomaJab...

 

In this name that follows Eastern Slavic naming customs, the patronymic is Nikolayevich and the family name is Durnovo. Ivan Nikolayevich Durnovo Ivan Nikolayevich Durnovo (Russian: Иван Николаевич Дурново, the patronymic is also transcribed as Nikolaevich; 13 March [O.S. 1 March] 1834 – 11 June [O.S. 29 May] 1903) was a Russian politician. He served as Chairman of the Committee of Ministers between 1895 and 1903, the precurso...

 

Historic county of England This article is about the English county. For the new unitary authority, see Westmorland and Furness. For other uses, see Westmoreland. WestmorlandHistoric countyFlagAncient extent of WestmorlandArea • 1831485,990 acres (1,966.7 km2)[1] • 1911505,330 acres (2,045.0 km2)[2] • 1961504,917 acres (2,043.33 km2)[2] Population • 191163,575[2] • 196167,180[2] ...

19th century Czech chemist, investigated atomic weights and rare earth elements Bohuslav BraunerBorn(1855-05-08)8 May 1855PragueDiedFebruary 15, 1935(1935-02-15) (aged 79)PragueNationalityCzechAlma materCharles University in PragueKnown forDetermination of atomic weightsRare-earth elementsScientific careerFieldsInorganic chemistryInstitutionsCharles University in Prague Bohuslav Brauner (May 8, 1855 – February 15, 1935) was a Czech chemist from the University of Prague, w...

 

Pour les articles homonymes, voir Permien (homonymie). PermienDyas Données clés Notation chronostratigraphique P Notation française r Notation RGF r Stratotype initial Perm (Russie) Niveau Période / Système Érathème / Ère - Éonothème / Éon PaléozoïquePhanérozoïque StratigraphieÉtendue DébutFin  298,9 ± 0,15 Ma  251,902 ± 0,024 Ma (extinction du Permien) Carbonifère TriasMésozoïqueSédimentaire Fossiles stratigraphiques fusulinidésammonites...

 

Painting by Édouard Manet Madame Manet at the PianoArtistÉdouard ManetYear1867-1868MediumOil on canvasLocationMusée d'Orsay, Paris Madame Manet at the Piano is a portrait by Édouard Manet of his wife Suzanne (née Leenhoff), painted in 1867-68 and now in the Musée d'Orsay, in Paris.[1] It highlights her talent on the piano, having played Wagner to Baudelaire during his last days.[2] Presentation In 1849 Manet's father appointed Suzanne Leenhoff as piano teacher for his so...

2018Poster rilis teatrikalSutradaraJude Anthany JosephProduserVenu KunnappillyDitulis olehAkhil P. Dharmajan (dialog)Jude Anthany Joseph(cerita)PemeranKunchacko BobanTovino ThomasAsif AliAparna BalamuraliVineeth SreenivasanTanvi RamPenata musikNobin PaulSinematograferAkhil GeorgePenyuntingChaman ChakkoDistributorKavya Film CompanyTanggal rilis5 Mei 2023Durasi148 men.BahasaMalayalam 2018 (judul kecil di layar sebagai Everyone is a Hero) adalah sebuah film bencana berbahasa Malayalam Indi...

 

「円楽党」の看板を掲げた若竹ビル(2009年12月撮影) 三ツ組橘は、圓楽一門の定紋である 五代目円楽一門会(ごだいめえんらくいちもんかい)は、5代目三遊亭圓楽の弟子とその一門による落語家団体。 概要・歴史 前身は1980年2月1日に5代目圓楽が一門弟子と共に設立した「大日本落語すみれ会」。1978年の落語協会分裂騒動で5代目圓楽が師匠6代目三遊亭圓生と共に「�...

 

Portuguese princess This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Infanta Maria da Assunção of Braganza – news · newspapers · books · scholar · JSTOR (February ...

Catholic bishop of Turin Claudius of TurinBishop of TurinChurchCatholic ChurchSeeTurinIn office817–827Personal detailsBornunknownpossible: SpainDied827possible: TurinTheological workEraMedieval ageTradition or movementCatholicismMain interestsIconoclasmNotable ideasIconoclasmEquality of the ApostlesFallibility of the Church Louis the Pious, Holy Roman Emperor and for a time a chief patron of Claudius. Claudius of Turin (or Claude) (fl. 810–827)[1][2] was the Catholic bisho...

 

Ancient Roman family Titus Statilius Taurus, consul in 37 and 26 BC, from Promptuarii Iconum Insigniorum, by Guillaume Rouille (1518?-1589). The gens Statilia was a plebeian family of Lucanian origin at ancient Rome. Members of this gens are first mentioned in the third century BC, when one of them led the Lucanian assault on the city of Thurii, and another commanded an allied cavalry troop during the Second Punic War; but at Rome the Statilii first come to attention in the time of Cicero, at...