Klasa zagnieżdżona i wewnętrzna Java (z przykładami)

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 classistnieje 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 thissłowa kluczowego, aby uzyskać dostęp do zmiennej carType klasy zewnętrznej. Być może zauważyłeś, że zamiast używać this.carTypeużywaliśmy Car.this.carType.

Dzieje się tak, ponieważ gdybyśmy nie wspomnieli o nazwie klasy zewnętrznej Car, to thissł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 privatemetoda, możemy uzyskać do niej dostęp z klasy wewnętrznej.

Statyczna klasa zagnieżdżona

W Javie możemy również zdefiniować staticklasę 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.

Interesujące artykuły...