„Java“ įdėta ir vidinė klasė (su pavyzdžiais)

Šioje pamokoje naudodamiesi pavyzdžiais sužinosite apie įdėtą „Java“ klasę ir jos tipus.

„Java“ galite apibrėžti klasę kitoje klasėje. Tokia klasė yra žinoma kaip nested class. Pavyzdžiui,

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

Yra dviejų tipų įdėtųjų klasių, kurias galite sukurti „Java“.

  • Nestatinė įdėta klasė (vidinė klasė)
  • Statinė įdėta klasė

Rekomenduojamas skaitymas :

  • „Java“ prieigos modifikatoriai
  • „Java“ statinis raktinis žodis

Pirmiausia pažvelkime į nestatiškas įdėtas klases.

Nestatinė įdėta klasė (vidinė klasė)

Nestatinė įdėta klasė yra kitos klasės klasė. Ji turi prieigą prie uždarosios klasės (išorinės klasės) narių. Jis paprastai žinomas kaip inner class.

Kadangi inner classegzistuoja išorinė klasė, pirmiausia turite išgauti išorinę klasę, kad išryškintumėte vidinę klasę.

Štai pavyzdys, kaip galite deklaruoti „Java“ vidines klases.

1 pavyzdys: Vidinė klasė

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

Išvestis :

 Procesoriaus talpykla = 4,3 „Ram Clock“ greitis = 5,5

Pirmiau pateiktoje programoje yra dvi įdėtos klasės: procesorius ir RAM išorinės klasės viduje: procesorius. Vidinę klasę galime paskelbti saugoma. Taigi, mes paskelbėme, kad RAM klasė yra saugoma.

Pagrindinės klasės viduje,

  • pirmiausia sukūrėme išorinės klasės procesoriaus egzempliorių, pavadintą cpu.
  • Tada naudodamiesi išorinės klasės egzemplioriumi mes sukūrėme vidinių klasių objektus:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Pastaba : Mes naudojame punktą ( .), kad sukurtume vidinės klasės egzempliorių, naudodami išorinę klasę.

Prieiga prie išorinės klasės narių vidinėje klasėje

Mes galime pasiekti išorinės klasės narius naudodami šį raktinį žodį. Jei norite sužinoti apie šį raktinį žodį, apsilankykite „Java“ šiame raktažodyje.

2 pavyzdys: Prieiga prie narių

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

Išvestis :

 8WD variklio tipas = didesnis 4WD variklio tipas = mažesnis

Pagal pirmiau pateiktą programą mes turime vidinę klasę, pavadintą „Variklis“, esančią išorinės klasės automobilyje. Čia atkreipkite dėmesį į eilutę,

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

Mes naudojame thisraktinį žodį, kad pasiektume „carType“ kintamąjį iš išorinės klasės. Galbūt pastebėjote, kad užuot naudoję, this.carTypemes naudojome Car.this.carType.

Taip yra todėl, kad jei nebūtume minėję išorinės klasės automobilio pavadinimo, tada thisraktinis žodis atspindės vidinės klasės narį.

Mes taip pat prieiname išorinės klasės metodą iš vidinės klasės.

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

Svarbu pažymėti, kad nors tai getCarName()yra privatemetodas, mes galime prieiti prie jo iš vidinės klasės.

Statinė įdėta klasė

„Java“ taip pat galime apibrėžti staticklasę kitos klasės viduje. Tokia klasė yra žinoma kaip static nested class. Statinės įdėtos klasės nėra vadinamos statinėmis vidinėmis klasėmis.

Skirtingai nuo vidinės klasės, statinė įdėta klasė negali pasiekti išorinės klasės narių kintamųjų. Taip yra todėl, kad statinė įdėta klasė nereikalauja sukurti išorinės klasės egzemplioriaus.

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

Čia mes kuriame statinės įdėtos klasės objektą, paprasčiausiai naudodami išorinės klasės klasės pavadinimą. Taigi negalima naudoti išorinės klasės OuterClass.this.

3 pavyzdys: statinė vidinė klasė

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

Išvestis :

 Iš viso uostų = 3

Pirmiau pateiktoje programoje mes sukūrėme statinę klasę, pavadintą USB, klasės plokštės viduje. Atkreipkite dėmesį į eilutę,

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

Čia mes kuriame USB objektą, naudodami išorinės klasės pavadinimą.

Pažiūrėkime, kas nutiktų, jei bandytumėte pasiekti išorinės klasės narius:

4 pavyzdys: Prieiga prie išorinės klasės narių „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()); ) )

Kai bandysime paleisti programą, gausime klaidą:

 klaida: nestatinis kintamasis, to negalima nurodyti iš statinio konteksto

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.
  • Nestatinės įterptosios klasės (vidinės klasės) turi prieigą prie kitų išorinės / uždarosios klasės narių, net jei jos yra paskelbtos privačiomis.

Įdomios straipsniai...