Kodlarni initsializatsiya bloklari (static va non-static), konstruktorlar, shuningdek, static va non-static maydonlarni qanday tartibda o'quvchi tushunishga harakat qilamiz. Amalda buni ko'rish uchun, kodni ishga tushiramiz.
Kirishda bitta klass bor, unda barcha mumkin bo'lgan elementlar bor:
public class MyClass {
static {
System.out.println("Static blok №1.");
}
public static String staticField = setStaticField();
public MyClass() {
System.out.println("Konstruktor.");
}
static {
System.out.println("Static blok №2.");
}
{
System.out.println("Initsializatsiya bloki №1.");
}
public String nonStaticField = setNonStaticField();
{
System.out.println("Initsializatsiya bloki №2.");
}
private String setNonStaticField() {
System.out.println("Non-static maydon.");
return "nonStaticField";
}
private static String setStaticField() {
System.out.println("Static maydon.");
return "staticField";
}
public static void print() {
System.out.println("Print metodi.");
}
}
Endi bu klass bilan birga yana bir class yaratamiz, unda main metodi bor va uni ishga tushiramiz:
public class Solution {
public static void main(String args[]) {
System.out.println("hello");
}
}
MyClass klassidan hech narsa chiqarilmaydi. Chunki MyClass ga murojaat qilinmadi, klass umuman yuklanmadi. Endi MyClass klassining static print() metodini chaqirib ko'ramiz. Ikkita marta.
public class Solution {
public static void main(String args[]) {
MyClass.print();
MyClass.print();
}
}
Natija:
Static maydon.
Static blok №2.
Print metodi.
Print metodi.
Faqat static initsializatsiya bloklari amalga oshdi va static maydon initsializatsiya qilindi. Va bular faqat bir marta amalga oshdi. Sababi, print() metodining ikkinchi chaqirig'ida klass allaqachon yuklangan edi. Esda tuting: static maydonlar va initsializatsiya bloklari klass bilan birinchi marta o'zaro aloqaga kirishganda bir marta ishlaydi.
Diqqat qiling, static bloklar va maydonlar o'z e'lon tartibida bajariladi.
Keyinchalik static metod o'rniga, o'z klassimizning ikkita obyektini yaratishga harakat qilamiz:
public class Solution {
public static void main(String args[]) {
new MyClass();
System.out.println();
new MyClass();
}
}
Natija:
Static maydon.
Static blok №2.
Initsializatsiya bloki №1.
Non-static maydon.
Initsializatsiya bloki №2.
Konstruktor.
Initsializatsiya bloki №1.
Non-static maydon.
Initsializatsiya bloki №2.
Konstruktor.
Avval bir marta static bloklar va maydonlar, keyin har bir obyekt yaratilishi bilan non-static bloklar va maydonlar, va konstruktor ishlaydi. Maydonlar va initsializatsiya bloklari e'lon qilingan tartibda bajarilsa, konstruktor har doim oxirida ishlaydi, qaerda e'lon qilinganidan qat'iy nazar.
Misolni murakkablashtiramiz va ikki klass olamiz, bularning biri boshqasidan meros oladi:
public class ParentClass {
static {
System.out.println("Static blok №1 ota klass.");
}
public static String parentStatic = setParentStatic();
static {
System.out.println("Static blok №2 ota klass.");
}
{
System.out.println("Initsializatsiya bloki №1 ota klass.");
}
public String parentNonStatic = setParentNonStatic();
{
System.out.println("Initsializatsiya bloki №2 ota klass.");
}
public ParentClass() {
System.out.println("Konstruktor ota klass.");
}
private String setParentNonStatic() {
System.out.println("Non-static maydon ota klass.");
return "parentNonStatic";
}
private static String setParentStatic() {
System.out.println("Static maydon ota klass.");
return "parentStatic";
}
public String setChildNonStatic1() {
System.out.println("Non-static maydon child klass №1.");
return "childNonStatic2" + parentNonStatic;
}
}
public class ChildClass extends ParentClass {
static {
System.out.println("Static blok №1 child klass.");
}
public static String childStatic = setChildStatic();
static {
System.out.println("Static blok №2 child klass.");
}
public String childNonStatic1 = setChildNonStatic1();
{
System.out.println("Initsializatsiya bloki №1 child klass.");
}
public String childNonStatic2 = setChildNonStatic2();
{
System.out.println("Initsializatsiya bloki №2 child klass.");
}
public ChildClass() {
System.out.println("Konstruktor child klass.");
}
private String setChildNonStatic2() {
System.out.println("Non-static maydon child klass №2.");
return "childNonStatic";
}
private static String setChildStatic() {
System.out.println("Static maydon child klass.");
return "childStatic";
}
}
Ikki child klass ob'ektlarini yaratamiz:
public class Solution {
public static void main(String[] args) {
new ChildClass();
System.out.println();
new ChildClass();
}
}
Natija:
Static maydon ota klass.
Static blok №2 ota klass.
Static blok №1 child klass.
Static maydon child klass.
Static blok №2 child klass.
Initsializatsiya bloki №1 ota klass.
Non-static maydon ota klass.
Initsializatsiya bloki №2 ota klass.
Konstruktor ota klass.
Non-static maydon child klass №1.
Initsializatsiya bloki №1 child klass.
Non-static maydon child klass №2.
Initsializatsiya bloki №2 child klass.
Konstruktor child klass.
Initsializatsiya bloki №1 ota klass.
Non-static maydon ota klass.
Initsializatsiya bloki №2 ota klass.
Konstruktor ota klass.
Non-static maydon child klass №1.
Initsializatsiya bloki №1 child klass.
Non-static maydon child klass №2.
Initsializatsiya bloki №2 child klass.
Konstruktor child klass.
Yangilikdan shuni ko'rish mumkin, ota klassning static bloklari va o'zgaruvchilari child klassning static bloklaridan va o'zgaruvchilaridan oldin ishlaydi. Nostatik bloklar, maydonlar va konstruktorlar bilan ham huddi shunday: avval ota klass, keyin child klass. Bu childNonStatic1 maydonining misolidan ko'rinib turibdi. U ota klass metodidan foydalanadi va bu metod ota klass maydonidan foydalanadi, demak, childNonStatic1 maydoni initsializatsiya qilingan paytda, ota klass allaqachon yuklangan va ota klass o'zgaruvchilari initsializatsiya qilingan bo'lishi kerak.
Amalda siz bir vaqtning o'zida hamma narsani o'z ichiga olgan klasslarga duch kelmasligingiz mumkin, lekin nima qachon initsializatsiya qilinishini bilish foydali bo'ladi. Bu haqda suhbatlarda ko'p so'rashadi 😊
GO TO FULL VERSION