Middle
Дар бораи синфҳои дарунсохт ва дар кадом ҳолатҳо истифода мешаванд, нақл кунед.
sobes.tech AI
Ҷавоб аз AI
Классҳои дарунсохт (Nested Classes) дар Java классҳое мебошанд, ки дар дохили дигар класс муайян карда шудаанд. Онҳо ба ду навъ тақсим мешаванд: Static Nested Classes ва Inner Classes.
Классҳои дарунсохти статикӣ
- Бо модификатори
staticэълон карда мешаванд. - танҳо ба аъзои статикии класи беруна дастрасӣ доранд (ҳатто пинҳоншудагон).
- ба аъзои ғайристатикии класи беруна дастрасӣ надоранд.
- Барои эҷоди намунаи класи дарунсохти статикӣ, намунаи класи беруна лозим нест:
// Класси беруна class Outer { static int outerStaticField; int outerInstanceField; // Класси дарунсохти статикӣ static class StaticNested { void accessOuter() { // Дастрасӣ ба майдони статикии класи беруна System.out.println(Outer.outerStaticField); // Дастрасӣ ба outerInstanceField ғайриимкон аст // System.out.println(outerInstanceField); // Хатои компилятсия } } } // Истифодаи класи дарунсохти статикӣ class Main { public static void main(String[] args) { Outer.StaticNested nestedObject = new Outer.StaticNested(); nestedObject.accessOuter(); } }
Inner Classes
- Бо модификатори
staticэълон карда намешаванд. - ба ҳамаи аъзои класи беруна (статикӣ ва ғайристатикӣ, ҳатто пинҳоншудагон) пурра дастрасӣ доранд.
- намунаи класи дохилӣ наметавонад бе намунаи класи беруна вуҷуд дошта бошад.
- Барои эҷоди намунаи класи дохилӣ, лозим аст, ки намунаи класи беруна вуҷуд дошта бошад:
// Класси беруна class Outer { static int outerStaticField; int outerInstanceField; // Класи дохилӣ class Inner { void accessOuter() { // Дастрасӣ ба майдони статикии класи беруна System.out.println(Outer.outerStaticField); // Дастрасӣ ба майдони ғайристатикӣ System.out.println(outerInstanceField); } } } // Истифодаи класи дохилӣ class Main { public static void main(String[] args) { Outer outerObject = new Outer(); Outer.Inner innerObject = outerObject.new Inner(); innerObject.accessOuter(); } }
Класси дохилӣ ба гурӯҳҳо тақсим мешаванд:
- Классҳои дохилии оддӣ: Ба таври мустақим дар бадани класи беруна муайян карда мешаванд.
- Классҳои маҳаллӣ: Дар дохили методҳо, конструкторҳо ё блокҳои инициализатсия муайян карда мешаванд ва танҳо дар дохили он блок дида мешаванд.
class Outer { void display() { class LocalInner { // Класси маҳаллӣ void message() { System.out.println("Класс маҳаллӣ"); } } LocalInner obj = new LocalInner(); obj.message(); } } - Классҳои анонимӣ: Классҳое бе номи, ки барои эҷоди намунаи класс ё интерфейс истифода мешаванд ва ба таври фаврӣ иҷрои онҳоро таъмин мекунанд. Баъзан бо гӯшкунандагони ҳодисаҳо (event listeners) истифода мешаванд.
interface Greeting { void sayHello(); } class Main { public static void main(String[] args) { Greeting greeting = new Greeting() { // Класс анонимӣ @Override public void sayHello() { System.out.println("Салом!"); } }; greeting.sayHello(); } }
Вақте ки класи дарунсохт истифода мешаванд:
- Гурӯҳбандии мантиқӣ: Агар класс танҳо қисми класи дигар бошад ва маънои онро дошта бошад, ки онҳоро гурӯҳбандӣ кардан лозим аст. Ин хондан ва нигоҳдории коди беҳтар мекунад.
- Инкапсулятсия: Классҳои дарунсохт метавонанд ба аъзои класи беруна дастрасӣ дошта бошанд, ки мустаҳкамтар пайвастагиро таъмин мекунад ва имконият медиҳад, ки тафсилоти иҷроияро пинҳон кард.
- Кодро хондан осонтар мекунад: Вақте ки як класс хурд ва содда танҳо дар як ҷой истифода мешавад, дохил кардани он метавонад коди шуморо тоза ва равшантар созад.
- Истифодаи самараноки захираҳо: Классҳои дохилӣ ба аъзои класи беруна дастрасӣ доранд бе зарурати онҳоро равшанан гузаронидан, ки метавонад коди шуморо содда кунад. Масалан, дар иҷрои итераторҳо.
- Иҷрои интерфейсҳо ё васеъ кардани классҳо дар контекст: Классҳои анонимӣ дар бисёр ҳолатҳо барои пешниҳоди иҷрои кӯтоҳмуддат барои интерфейсҳо ё классҳои абстрактӣ истифода мешаванд.
- Пинҳон кардани иҷроиш: Пинҳон кардани класс дар дохили класи дигар, ки онро аз берун намебинанд.
Мувофиқати байни классҳои дарунсохти статикӣ ва дохилӣ:
| Параметр | Класс дарунсохти статикӣ | Внутрии класс |
|---|---|---|
Модификатори static |
Бале | Не |
| Дастрасӣ ба аъзои класи беруна | Танҳо статикӣ (ҳатто хусусӣ) | Ҳама аъзои (статикӣ ва ғайристатикӣ, ҳатто хусусӣ) |
| Зарурияти намунаи класи беруна барои эҷод | Не | Бале |
| Вайроншавӣ бо намунаи класи беруна | Не | Бале |
Интихоб байни класс дарунсохти статикӣ ва дохилӣ вобаста аст, ки оё класи дарунсохт ба аъзои ғайристатикӣ дастрасӣ дорад ё не. Агар дорад, истифодаи класи дохилӣ беҳтар аст. Агар не, класс дарунсохти статикӣ интихоби беҳтар аст, зеро он бо намунаи класи беруна вобаста нест ва метавонад самараноктар бошад.