W tym samouczku za pomocą przykładów dowiesz się o klasie zagnieżdżonej w Javie i jej typach.
W Javie można zdefiniować klasę w ramach innej klasy. Taka klasa jest znana jako nested class
. Na przykład,
class OuterClass ( //… class NestedClass ( //… ) )
W Javie można tworzyć dwa typy klas zagnieżdżonych.
- Niestatyczna klasa zagnieżdżona (klasa wewnętrzna)
- Statyczna klasa zagnieżdżona
Zalecana lektura :
- Modyfikatory dostępu Java
- Statyczne słowo kluczowe Java
Przyjrzyjmy się najpierw niestatycznym klasom zagnieżdżonym.
Niestatyczna klasa zagnieżdżona (klasa wewnętrzna)
Niestatyczna klasa zagnieżdżona to klasa należąca do innej klasy. Ma dostęp do członków klasy otaczającej (klasy zewnętrznej). Jest powszechnie znany jako inner class
.
Ponieważ inner class
istnieje w klasie zewnętrznej, musisz najpierw utworzyć instancję klasy zewnętrznej, aby utworzyć instancję klasy wewnętrznej.
Oto przykład, jak można zadeklarować klasy wewnętrzne w Javie.
Przykład 1: klasa wewnętrzna
class CPU ( double price; // nested class class Processor( // members of nested class double cores; String manufacturer; double getCache()( return 4.3; ) ) // nested protected class protected class RAM( // members of protected nested class double memory; String manufacturer; double getClockSpeed()( return 5.5; ) ) ) public class Main ( public static void main(String() args) ( // create object of Outer class CPU CPU cpu = new CPU(); // create an object of inner class Processor using outer class CPU.Processor processor = cpu.new Processor(); // create an object of inner class RAM using outer class CPU CPU.RAM ram = cpu.new RAM(); System.out.println("Processor Cache = " + processor.getCache()); System.out.println("Ram Clock speed = " + ram.getClockSpeed()); ) )
Wyjście :
Pamięć podręczna procesora = 4,3 Szybkość zegara pamięci RAM = 5,5
W powyższym programie istnieją dwie zagnieżdżone klasy: procesor i pamięć RAM wewnątrz klasy zewnętrznej: procesor. Możemy zadeklarować klasę wewnętrzną jako chronioną. Dlatego zadeklarowaliśmy klasę pamięci RAM jako chronioną.
Wewnątrz klasy głównej
- Najpierw stworzyliśmy instancję zewnętrznego procesora klasy o nazwie cpu.
- Korzystając z instancji klasy zewnętrznej, utworzyliśmy następnie obiekty klas wewnętrznych:
CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();
Uwaga : Używamy .
operatora kropka ( ) do tworzenia instancji klasy wewnętrznej przy użyciu klasy zewnętrznej.
Dostęp do członków klasy zewnętrznej w klasie wewnętrznej
Możemy uzyskać dostęp do członków klasy zewnętrznej za pomocą tego słowa kluczowego. Jeśli chcesz dowiedzieć się więcej o tym słowie kluczowym, odwiedź Javę to słowo kluczowe.
Przykład 2: Dostęp do członków
class Car ( String carName; String carType; // assign values using constructor public Car(String name, String type) ( this.carName = name; this.carType = type; ) // private method private String getCarName() ( return this.carName; ) // inner class class Engine ( String engineType; void setEngine() ( // Accessing the carType property of Car if(Car.this.carType.equals("4WD"))( // Invoking method getCarName() of Car if(Car.this.getCarName().equals("Crysler")) ( this.engineType = "Smaller"; ) else ( this.engineType = "Bigger"; ) )else( this.engineType = "Bigger"; ) ) String getEngineType()( return this.engineType; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the outer class Car Car car1 = new Car("Mazda", "8WD"); // create an object of inner class using the outer class Car.Engine engine = car1.new Engine(); engine.setEngine(); System.out.println("Engine Type for 8WD= " + engine.getEngineType()); Car car2 = new Car("Crysler", "4WD"); Car.Engine c2engine = car2.new Engine(); c2engine.setEngine(); System.out.println("Engine Type for 4WD = " + c2engine.getEngineType()); ) )
Wyjście :
Typ silnika dla 8WD = większy Typ silnika dla 4WD = mniejszy
W powyższym programie mamy wewnętrzną klasę o nazwie Engine wewnątrz zewnętrznej klasy Car. Tutaj, zwróć uwagę na linię,
if(Car.this.carType.equals("4WD")) (… )
Używamy this
słowa kluczowego, aby uzyskać dostęp do zmiennej carType klasy zewnętrznej. Być może zauważyłeś, że zamiast używać this.carType
używaliśmy Car.this.carType
.
Dzieje się tak, ponieważ gdybyśmy nie wspomnieli o nazwie klasy zewnętrznej Car, to this
słowo kluczowe będzie reprezentować członka wewnątrz klasy wewnętrznej.
Podobnie, uzyskujemy również dostęp do metody klasy zewnętrznej z klasy wewnętrznej.
if (Car.this.getCarName().equals("Crysler") (… )
Należy zauważyć, że chociaż getCarName()
jest to private
metoda, możemy uzyskać do niej dostęp z klasy wewnętrznej.
Statyczna klasa zagnieżdżona
W Javie możemy również zdefiniować static
klasę wewnątrz innej klasy. Taka klasa jest znana jako static nested class
. Statyczne klasy zagnieżdżone nie są nazywane statycznymi klasami wewnętrznymi.
W przeciwieństwie do klasy wewnętrznej statyczna klasa zagnieżdżona nie może uzyskać dostępu do zmiennych składowych klasy zewnętrznej. Dzieje się tak, ponieważ statyczna klasa zagnieżdżona nie wymaga tworzenia instancji klasy zewnętrznej.
OuterClass.NestedClass obj = new OuterClass.NestedClass();
Tutaj tworzymy obiekt statycznej klasy zagnieżdżonej , po prostu używając nazwy klasy zewnętrznej. W związku z tym nie można odwoływać się do klasy zewnętrznej przy użyciu OuterClass.this
.
Przykład 3: Statyczna klasa wewnętrzna
class MotherBoard ( // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( return usb2 + usb3; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class // using the name of the outer class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )
Wyjście :
Łączna liczba portów = 3
W powyższym programie stworzyliśmy statyczną klasę o nazwie USB wewnątrz klasy MotherBoard. Zwróć uwagę na linię,
MotherBoard.USB usb = new MotherBoard.USB();
Tutaj tworzymy obiekt USB używając nazwy klasy zewnętrznej.
Zobaczmy teraz, co by się stało, gdybyś spróbował uzyskać dostęp do członków klasy zewnętrznej:
Przykład 4: Dostęp do członków klasy Outer wewnątrz statycznej klasy wewnętrznej
class MotherBoard ( String model; public MotherBoard(String model) ( this.model = model; ) // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( // accessing the variable model of the outer classs if(MotherBoard.this.model.equals("MSI")) ( return 4; ) else ( return usb2 + usb3; ) ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )
Gdy spróbujemy uruchomić program, pojawi się błąd:
błąd: zmienna niestatyczna, do której nie można się odwoływać z kontekstu statycznego
This is because we are not using the object of the outer class to create an object of the inner class. Hence, there is no reference to the outer class Motherboard
stored in Motherboard.this
.
Key Points to Remember
- Java treats the inner class as a regular member of a class. They are just like methods and variables declared inside a class.
- Since inner classes are members of the outer class, you can apply any access modifiers like
private
,protected
to your inner class which is not possible in normal classes. - Since the nested class is a member of its enclosing outer class, you can use the dot (
.
) notation to access the nested class and its members. - Using the nested class will make your code more readable and provide better encapsulation.
- Niestatyczne klasy zagnieżdżone (klasy wewnętrzne) mają dostęp do innych członków klasy zewnętrznej / otaczającej, nawet jeśli zostały zadeklarowane jako prywatne.