Java Nested and Inner Class (Με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθετε για την ένθετη τάξη στην Java και τους τύπους της με τη βοήθεια παραδειγμάτων.

Στην Java, μπορείτε να ορίσετε μια κλάση σε μια άλλη τάξη. Αυτή η τάξη είναι γνωστή ως nested class. Για παράδειγμα,

 class OuterClass ( //… class NestedClass ( //… ) )

Υπάρχουν δύο τύποι ένθετων τάξεων που μπορείτε να δημιουργήσετε στην Java.

  • Μη στατική ένθετη τάξη (εσωτερική κλάση)
  • Στατική ένθετη τάξη

Συνιστώμενη ανάγνωση :

  • Τροποποιητές πρόσβασης Java
  • Στατική λέξη-κλειδί Java

Ας δούμε πρώτα τις μη στατικές ένθετες τάξεις.

Μη στατική ένθετη τάξη (εσωτερική τάξη)

Μια μη στατική ένθετη τάξη είναι μια τάξη σε μια άλλη τάξη. Έχει πρόσβαση σε μέλη της κλειστής τάξης (εξωτερική τάξη). Είναι συνήθως γνωστό ως inner class.

Δεδομένου ότι inner classυπάρχει στην εξωτερική τάξη, πρέπει να δημιουργήσετε πρώτα την εξωτερική τάξη, προκειμένου να δημιουργήσετε την εσωτερική τάξη.

Ακολουθεί ένα παράδειγμα για το πώς μπορείτε να δηλώσετε εσωτερικές τάξεις στην Java.

Παράδειγμα 1: Εσωτερική τάξη

 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()); ) )

Έξοδος :

 Cache επεξεργαστή = 4.3 Ταχύτητα ρολογιού Ram = 5.5

Στο παραπάνω πρόγραμμα, υπάρχουν δύο ένθετες τάξεις: Επεξεργαστής και RAM μέσα στην εξωτερική κλάση: CPU. Μπορούμε να δηλώσουμε την εσωτερική τάξη ως προστατευμένη. Ως εκ τούτου, έχουμε δηλώσει την τάξη RAM ως προστατευμένη.

Μέσα στην κύρια τάξη,

  • δημιουργήσαμε για πρώτη φορά μια παρουσία CPU εξωτερικής κλάσης με το όνομα cpu.
  • Χρησιμοποιώντας την παρουσία της εξωτερικής τάξης, δημιουργήσαμε στη συνέχεια αντικείμενα εσωτερικών τάξεων:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Σημείωση : Χρησιμοποιούμε τον .τελεστή κουκκίδων ( ) για να δημιουργήσουμε μια παρουσία της εσωτερικής κλάσης χρησιμοποιώντας την εξωτερική κλάση.

Πρόσβαση σε μέλη εξωτερικής τάξης εντός της εσωτερικής τάξης

Μπορούμε να έχουμε πρόσβαση στα μέλη της εξωτερικής τάξης χρησιμοποιώντας αυτήν τη λέξη-κλειδί. Εάν θέλετε να μάθετε σχετικά με αυτήν τη λέξη-κλειδί, επισκεφθείτε την Java αυτήν τη λέξη-κλειδί.

Παράδειγμα 2: Πρόσβαση σε μέλη

 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()); ) )

Έξοδος :

 Τύπος κινητήρα για 8WD = Μεγαλύτερος τύπος κινητήρα για 4WD = Μικρότερος

Στο παραπάνω πρόγραμμα, έχουμε την εσωτερική κλάση που ονομάζεται Engine μέσα στην εξωτερική κατηγορία Αυτοκινήτου. Εδώ, παρατηρήστε τη γραμμή,

 if(Car.this.carType.equals("4WD")) (… )

Χρησιμοποιούμε thisλέξη-κλειδί για πρόσβαση στη μεταβλητή carType της εξωτερικής κλάσης. Μπορεί να έχετε παρατηρήσει ότι αντί να χρησιμοποιεί this.carTypeέχουμε χρησιμοποιήσει Car.this.carType.

Είναι επειδή εάν δεν είχαμε αναφέρει το όνομα της εξωτερικής κατηγορίας Αυτοκινήτου, τότε η thisλέξη-κλειδί θα αντιπροσωπεύει το μέλος μέσα στην εσωτερική τάξη.

Ομοίως, έχουμε επίσης πρόσβαση στη μέθοδο της εξωτερικής τάξης από την εσωτερική τάξη.

 if (Car.this.getCarName().equals("Crysler") (… )

Είναι σημαντικό να σημειωθεί ότι, αν και getCarName()είναι μια privateμέθοδος, μπορούμε να έχουμε πρόσβαση σε αυτήν από την εσωτερική τάξη.

Στατική ένθετη τάξη

Στην Java, μπορούμε επίσης να ορίσουμε μια staticτάξη μέσα σε μια άλλη τάξη. Αυτή η τάξη είναι γνωστή ως static nested class. Οι στατικές ένθετες τάξεις δεν ονομάζονται στατικές εσωτερικές τάξεις.

Σε αντίθεση με την εσωτερική κλάση, μια στατική ένθετη τάξη δεν μπορεί να έχει πρόσβαση στις μεταβλητές μελών της εξωτερικής τάξης. Είναι επειδή η στατική ένθετη τάξη δεν απαιτεί από εσάς να δημιουργήσετε μια παρουσία της εξωτερικής τάξης.

 OuterClass.NestedClass obj = new OuterClass.NestedClass();

Εδώ, δημιουργούμε ένα αντικείμενο της στατικής ένθετης τάξης χρησιμοποιώντας απλώς το όνομα κλάσης της εξωτερικής κλάσης. Ως εκ τούτου, η εξωτερική τάξη δεν μπορεί να αναφέρεται χρησιμοποιώντας OuterClass.this.

Παράδειγμα 3: Στατική εσωτερική τάξη

 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()); ) )

Έξοδος :

 Συνολικές θύρες = 3

Στο παραπάνω πρόγραμμα, δημιουργήσαμε μια στατική τάξη με το όνομα USB μέσα στην τάξη MotherBoard. Παρατηρήστε τη γραμμή,

 MotherBoard.USB usb = new MotherBoard.USB();

Εδώ, δημιουργούμε ένα αντικείμενο USB χρησιμοποιώντας το όνομα της εξωτερικής κλάσης.

Τώρα, ας δούμε τι θα συνέβαινε εάν προσπαθήσετε να αποκτήσετε πρόσβαση στα μέλη της εξωτερικής τάξης:

Παράδειγμα 4: Πρόσβαση σε μέλη της εξωτερικής τάξης στο Static Inner Class

 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()); ) )

Όταν προσπαθούμε να εκτελέσουμε το πρόγραμμα, θα λάβουμε ένα σφάλμα:

 σφάλμα: μη στατική μεταβλητή που δεν μπορεί να αναφερθεί από ένα στατικό περιβάλλον

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.
  • Οι μη στατικές ένθετες τάξεις (εσωτερικές τάξεις) έχουν πρόσβαση σε άλλα μέλη της εξωτερικής / κλειστής τάξης, ακόμη και αν δηλώνονται ιδιωτικές.

ενδιαφέροντα άρθρα...