Java sisestatud ja siseklass (koos näidetega)

Selles õpetuses saate näidete abil õppida Java pesastatud klassi ja selle tüüpe.

Javas saate määratleda klassi teises klassis. Sellist klassi tuntakse kui nested class. Näiteks,

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

Java-s saate luua kahte tüüpi pesastatud klasse.

  • Mittestaatiline pesastatud klass (siseklass)
  • Staatiline pesastatud klass

Soovitatav lugemine :

  • Java juurdepääsu modifikaatorid
  • Java staatiline märksõna

Vaatame kõigepealt mittestaatilisi pesastatud klasse.

Mittestaatiline pesastatud klass (siseklass)

Mittestaatiline pesastatud klass on klass teises klassis. Sellel on juurdepääs ümbritseva klassi (välisklassi) liikmetele. See on üldtuntud kui inner class.

Kuna see inner classeksisteerib välisklassi sees, peate esmalt välisklassi eksisteerima, et siseklassi kiirendada.

Siin on näide selle kohta, kuidas saate Java siseklassid deklareerida.

Näide 1: siseklass

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

Väljund :

 Protsessori vahemälu = 4,3 mälukella kiirus = 5,5

Ülaltoodud programmis on kaks pesastatud klassi: protsessor ja RAM välisklassi sees: protsessor. Võime kuulutada siseklassi kaitstuks. Seega oleme kuulutanud RAM-klassi kaitstuks.

Põhiklassi sees,

  • lõime kõigepealt välisklassi protsessori eksemplari nimega cpu.
  • Välisklassi eksemplari kasutades lõime seejärel siseklasside objektid:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Märkus . Kasutame .operaatorit dot ( ) siseklassi eksemplari loomiseks välisklassi abil.

Juurdepääs siseklassi välisklassi liikmetele

Selle märksõna abil pääseme ligi välisklassi liikmetele. Kui soovite selle märksõna kohta lisateavet, külastage seda märksõna Java.

Näide 2: Liikmetele juurdepääs

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

Väljund :

 8WD mootori tüüp = suurem 4WD mootori tüüp = väiksem

Ülaltoodud programmis on meil välisklassi Auto sees siseklass nimega Mootor. Pange tähele joont,

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

thisVälise klassi muutujale carType pääsemiseks kasutame märksõna. Võib-olla olete märganud, et selle asemel, et kasutada, this.carTypeoleme kasutanud Car.this.carType.

Sellepärast, et kui me poleks maininud välisklassi Auto nime, siis thismärksõna esindab siseklassi liiget.

Samamoodi on meil juurdepääs välisklassi meetodile ka siseklassist.

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

Oluline on märkida, et kuigi meetod getCarName()on privatemeetod, pääseme sellele juurde siseklassist.

Staatiline pesastatud klass

Javas saame staticklassi defineerida ka teise klassi sees. Sellist klassi tuntakse kui static nested class. Staatilisi sisestatud klasse ei nimetata staatilisteks siseklassideks.

Erinevalt sisemisest klassist ei pääse staatiline sisestatud klass välisklassi liikme muutujatele juurde. Selle põhjuseks on see, et staatiline pesastatud klass ei nõua välisklassi eksemplari loomist.

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

Siin loome staatilise sisestatud klassi objekti, kasutades lihtsalt välisklassi klassi nime. Seega ei saa välisklassile viidata OuterClass.this.

Näide 3: Staatiline siseklass

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

Väljund :

 Sadamaid kokku = 3

Eespool nimetatud programmis oleme klassi MotherBoard sees loonud staatilise klassi nimega USB. Pange tähele joont,

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

Siin loome USB-objekti, kasutades välisklassi nime.

Vaatame nüüd, mis juhtuks, kui prooviksite pääseda välisklassi liikmetele:

Näide 4: juurdepääs välisklassi liikmetele staatilises siseklassis

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

Kui proovime programmi käivitada, kuvatakse tõrge:

 tõrge: mittestaatiline muutuja sellele ei saa staatilises kontekstis viidata

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.
  • Mittestaatilistel pesastatud klassidel (siseklassidel) on juurdepääs teistele välise / ümbritseva klassi liikmetele, isegi kui nad on kuulutatud privaatseteks.

Huvitavad Artiklid...