1. Вътрешни класове
Наскоро научихте, че има статични променливи и статични методи. Оказва се, че има и статични класове. Но ще подходим към тази тема от дистанция.
В Java ви е напълно позволено да декларирате класове в класове. И дори класове в класове, които са в класове в класове. Всичко изглежда много просто:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
Просто декларираме един клас в друг. Толкова просто.
Пример:
public class Solution
{
static ArrayList<Point> points = new ArrayList<Point>();
public static void main(String[] args)
{
Point point = new Point();
point.x = 100;
point.y = 200;
points.add(point);
}
static class Point
{
int x;
int y;
}
}
Вложените класове могат да бъдат статични or нестатични. Статичните вложени класове се наричат просто статични вложени класове . Нестатичните вложени класове се наричат вътрешни класове ( вътрешни класове ).
2. Статични класове
Статичните вложени класове могат да се използват извън техния външен клас. Ако такъв клас има модификатора за публичен достъп, тогава той може да се използва навсякъде в програмата. Такива класове са почти неразличими от всеки обикновен клас. Но има няколко разлики.
Име на класа
Ако искате да се обърнете към статичен вложен клас от място, различно от неговия външен клас, трябва да посочите името на класа, което се състои от името на външния клас и името на вложения клас. Ето общия вид на това име:
OuterClass.InnerClass
Примери:
Външен клас | Вложен клас | Пълно име на вложения клас |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Ако вложен клас има свой собствен вложен клас, техните имена просто се свързват с точка.
Типичен пример за вложен клас в JDK е Entry
класът вътре в Map
класа. Ако искате да получите набор от двойки ключ-стойност, съхранени в HashMap
обект, използвайте entrySet()
метода, който връща .Set<Map.Entry>
Имайте предвид, че това е пример за външен клас и вложен клас.Map.Entry
Създаване на обект
Много е лесно да създадете обект от статичен вложен клас. Ето How изглежда:
OuterClass.NestedClass name = new OuterClass.NestedClass();
Всичко е същото като при обикновените класове, но името се състои от две части.
Извикване на статични методи
Ако статичен клас има статични методи, можете да получите достъп до тях по същия начин, Howто статичните методи на обикновените класове (но името на класа ще се състои от две части).
OuterClass.NestedClass.staticMethod();
Достъп до статични променливи
Достъпът до публичните статични променливи на вложен клас също е лесен:
OuterParent.NestedClass.nameOfStaticVariable
3. Характеристики на статичните класове
Статичните вложени класове имат най-малкото основание да се наричат статични. Те се държат точно като обикновените класове . Няма ограничения за достъп до тях от нестатични методи.
Ако работите със статичен вложен клас вътре във външния му клас, няма да забележите разлика от най-обикновения (не вложен и не статичен) клас.
Пример:
Статичен вложен клас Point | Обикновен клас точки. |
---|---|
|
|
Ако вземете няHowъв статичен вложен клас и го преместите извън външния му клас, единственото нещо, което ще се промени е, че новият клас вече няма да има достъп до private static
променливите и методите на предишния външен клас.
Пример:
Статичен вложен клас Point | Обикновен клас точки. |
---|---|
|
|
Методът main
в обикновения Point
клас няма достъп до private static
points
променливата на Solution
класа!
Това е основната разлика между статичен вложен клас и обикновен клас. Методите на статичен вложен клас имат достъп до всички статични променливи и методи на своя външен клас, дори ако са декларирани private
.
И ако се замислите, защо това трябва да е изненадващо? Модификаторът private
изрично казва, че променливите и методите, маркирани от този модификатор, могат да бъдат достъпни само от техния клас. Дали статичен вложен клас е във външния си клас? Да, значи няма проблем! Достъп до тях, колкото искате.
GO TO FULL VERSION