Middle
Кадом намудҳои синфҳои дохилӣ мавҷуданд?
sobes.tech AI
Ҷавоб аз AI
Класи вградени (Nested Classes) в Java се делят на два основни типа:
-
Статични вградени класове (Static Nested Classes)
- Обозначени с модификатора
static. - Действат като обикновени статични членове на класа-обвивка.
- Могат да имат достъп до статичните членове на външния клас (дори и ако са частни).
- Не имат директен достъп до нестатичните членове на външния клас.
- Създават се без екземпляр на външния клас:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- Обозначени с модификатора
-
Вградени класове (Inner Classes)
Вградени класове не са обозначени с
staticи са свързани с екземпляр на външния клас. Те се подразделят на:-
Член- класове (Member Inner Classes)
- Обявяват се на ниво член на класа-обвивка, но извън неговите методи.
- Имат достъп до всички членове на външния клас, включително и частните.
- За създаването им е необходим екземпляр на външния клас:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Локални класове (Local Classes)
- Създават се вътре в методи, конструктори или инициализационни блокове.
- Областта им на видимост е ограничена до блока, в който са deklarирани.
- Не могат да бъдат deklarирани с модификатори за достъп (
public,private,protected). - Могат да имат достъп до
finalили ефективноfinalлокални променливи на външния блок. - Не могат да се използват извън блока, в който са дефинирани.
-
Анонимни класове (Anonymous Classes)
- В по същество, това са локални класове без име.
- Обявяват се и се инстанцират едновременно.
- Използват се за реализиране на абстрактен клас или интерфейс "на място".
- Както и локалните класове, имат достъп до
finalили ефективноfinalлокални променливи на външния блок.
Примерна структура:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Статичен вградени клас
static class StaticNestedClass {
void accessOuter() {
// Може да се обръща към статичните членове на външния клас
int value = staticOuterField;
// Не може да се обръща към нестатичните членове на външния клас
// int value2 = outerField; // Грешка при компилация
}
}
// Член- клас (Вътрешен клас)
class MemberInnerClass {
void accessOuter() {
// Може да се обръща към всички членове на външния клас
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // ефективно final
// Локална класа
class LocalClass {
void accessOuter() {
// Може да се обръща към членове на външния клас и локални final/ефективно final променливи
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Анонимна класа (реализираща интерфейса Runnable)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Може да се обръща към членове на външния клас и локални final/ефективно final променливи
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}