1. Klasy wewnętrzne
Niedawno dowiedziałeś się, że istnieją zmienne statyczne i metody statyczne, ale okazuje się, że są też klasy statyczne. Ale zacznijmy trochę z daleka.
W języku Java deklarowanie klas w ramach klas jest całkowicie możliwe. A nawet klasy w klasach, które są w klasach w klasach. Wszystko wygląda na bardzo proste:
class ВнешнийКласс
{
переменные класса
методы класса
class ВнутреннийКласс
{
переменные класса
методы класса
}
}
Po prostu deklarujemy jedną klasę wewnątrz drugiej - i to wszystko.
Przykład:
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;
}
}
Klasy wewnętrzne są statyczne lub niestatyczne. Klasy statyczne są również nazywane zagnieżdżonymi ( static nested class ), niestatyczne są po prostu nazywane klasami wewnętrznymi ( inner class ).
2. Klasy statyczne
Klasy zagnieżdżone statycznie mogą być używane poza klasą nadrzędną. Jeśli taka klasa ma modyfikator dostępu publicznego, może być używana w dowolnym miejscu w programie. Takie klasy w rzeczywistości nie różnią się od zwykłych klas. Chociaż istnieje kilka różnic.
Nazwa klasy
Jeśli chcesz odwołać się do statycznej klasy zagnieżdżonej nie z jej klasy nadrzędnej, ale z innego miejsca w programie, musisz określić nazwę klasy: składa się ona z nazwy klasy nadrzędnej i nazwy klasy zagnieżdżonej. Ogólna forma tej nazwy jest następująca:
КлассРодитель.ВложенныйКласс
Przykłady:
Klasa nadrzędna | klasa zagnieżdżona | W pełni kwalifikowana nazwa klasy zagnieżdżonej |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Jeśli klasa zagnieżdżona ma swoją własną klasę zagnieżdżoną, ich nazwy są po prostu sklejone kropką.
Typowym przykładem klasy zagnieżdżonej w JDK jest klasa Entry wewnątrz klasy Map . Jeśli chcesz uzyskać zestaw par elementów z obiektu HashMap
, metoda entrySet()
zwróci ci zestaw par elementów typu .Set<Map.Entry>
Oto wpis - jest to klasa zewnętrzna i wewnętrzna.Map.Entry
Utwórz obiekt
Tworzenie obiektu zagnieżdżonej klasy statycznej jest bardzo proste. To wygląda tak:
КлассРодитель.ВложенныйКласс Nazwa = new КлассРодитель.ВложенныйКласс();
Wszystko, jak przy zwykłych klasach, tylko nazwa jest podwójna.
Wywoływanie metod statycznych
Jeśli klasa statyczna ma metody statyczne, można uzyskać do nich dostęp w taki sam sposób, jak w przypadku metod statycznych zwykłych klas (tylko nazwa klasy jest teraz podwójna).
КлассРодитель.ВложенныйКласс.статическийМетод();
Dostęp do zmiennych statycznych
Dostęp do publicznych zmiennych statycznych zagnieżdżonej klasy jest również łatwy:
КлассРодитель.ВложенныйКласс.NazwaСтатическойПеременной
3. Cechy klas statycznych
Statyczne klasy wewnętrzne są najmniej warte nazywania statycznymi. Zachowują się dokładnie tak, jak normalne klasy . Nie ma żadnych ograniczeń w dostępie do nich z metod niestatycznych.
Jeśli pracujesz z wewnętrzną klasą statyczną wewnątrz jej klasy nadrzędnej, nie zauważysz żadnej różnicy w stosunku do tego, czy ta klasa wewnętrzna była zwykłą klasą (nie zagnieżdżoną ani statyczną).
Przykład:
Wewnętrzna klasa statyczna Punkt | Zwykła klasa Punkt |
---|---|
|
|
Jeśli weźmiesz jakąś zagnieżdżoną klasę statyczną i usuniesz ją z jej klasy nadrzędnej, wszystko, co się zmieni, to to, że nowa klasa nie będzie już mogła uzyskać dostępu do private static
zmiennych i metod poprzedniej klasy nadrzędnej.
Przykład:
Wewnętrzna klasa statyczna Punkt | Zwykła klasa Punkt |
---|---|
|
|
Metoda main
w zwykłej klasie Point
nie może uzyskać dostępu do private static
zmiennej points
klasy Solution
!
W rzeczywistości jest to główna różnica między zagnieżdżoną klasą statyczną a zwykłą klasą. Metody zagnieżdżonej klasy statycznej mają dostęp do wszystkich zmiennych statycznych i metod swojej klasy nadrzędnej, nawet jeśli są zadeklarowane private
.
Cóż, jeśli to rozgryziesz, co w tym takiego zaskakującego? Modyfikator private
wyraźnie stwierdza, że do zmiennych i metod wyznaczonych przez ten modyfikator można uzyskać dostęp tylko z poziomu ich klasy. Wewnętrzna klasa statyczna znajduje się w klasie nadrzędnej? Tak, więc nie ma problemu: kontaktuj się tyle, ile chcesz.