Middle
Ичке класстар жана кайсы учурларда колдонулушу жөнүндө айтып бер.
sobes.tech AI
AIден жооп
Javaда Иштөө класстары (Nested Classes) — бул башка класстын ичинде аныкталган класстар. Алар эки түргө бөлүнөт: статикалык (Static Nested Classes) жана ички класстар (Inner Classes):
Статикалык ички класстар
staticмодификатору менен жарыяланат.- тышкы класстын статикалык мүчөлөрүнө гана жеткиликтүү (жашырылган болсо да).
- тышкы класстын статикалык эмес мүчөлөрүнө жеткиликтүү эмес.
- статикалык ички класстын экземплярын түзүү үчүн тышкы класстын экземпляры керек эмес:
// Тышкы класс class Outer { static int outerStaticField; int outerInstanceField; // Статикалык ички класс static class StaticNested { void accessOuter() { // Тышкы класстын статикалык талаасына жетүү System.out.println(Outer.outerStaticField); // Тышкы класстын экземплярдык талаасына жетүү мүмкүн эмес // System.out.println(outerInstanceField); // Компиляция ката } } } // Статикалык ички классты колдонуу class Main { public static void main(String[] args) { Outer.StaticNested nestedObject = new Outer.StaticNested(); nestedObject.accessOuter(); } }
Ички класстар
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(); } }
Кайда колдонулат:
- Логикалык топтоо: Эгер класс башка класстын бөлүгү болсо жана алардын топтолушу маанилүү болсо. Бул кодду окууну жана тейлөөнү жакшыртат.
- Инкапсуляция: Ички класстар тышкы класстын мүчөлөрүнө жеткиликтүү болушу мүмкүн, бул тыгыз байланыш жана ишке ашыруунун деталдарын жашыруу мүмкүнчүлүгүн камсыздайт.
- Кодду жакшыраак окуу: Кичинекей, жөнөкөй класс бир гана жерде колдонулса, анын ички болушу кодду таза кылышы мүмкүн.
- Ресурстарды эффективдүү колдонуу: Ички класстар тышкы класстын мүчөлөрүнө жетүү үчүн алардын түздөн-түз өткөрүлүшүн талап кылбайт, бул кодду жөнөкөйлөтүшү мүмкүн. Мисалы, iteratorлердин ишке ашырылышы.
- Интерфейстерди ишке ашыруу же класстарды кеңейтүү: Анонимдүү ички класстар көбүнчө интерфейстердин же абстракттуу класстардын компакттуу ишке ашырылышын "жылдам" берүү үчүн колдонулат.
- Ишке ашыруу жашыруундугун камсыздоо: Класс башка класс ичинде жашырылат, сырттан көрүнбөйт.
Статикалык ички жана ички класстарды салыштыруу:
| Параметр | Статикалык ички класс | Ички класс |
|---|---|---|
Модуль static |
Ооба | Жок |
| Арыздарга жетүү | Тек гана статикалык (жашырылгандар да) | Бардык мүчөлөр (статикалык жана эмес, жашырылгандар да) |
| Тышкы класстын экземплярына талап | Жок | Ооба |
| Тышкы класстын экземплярына байланыш | Жок | Ооба |
Тандоо — статикалык ички класс же ички класс, тышкы класстын статикалык эмес мүчөлөрүнө жеткиликтүүлүк талаптарына көз каранды. Эгер керек болсо, ички классты колдонуу керек. Эгер керек болбосо, статикалык ички класс жакшыраак, анткени ал тышкы класстын экземплярына байланыштуу эмес жана көбүрөөк эффективдүү болушу мүмкүн.