Java-sisäkkäinen ja sisempi luokka (esimerkkejä)

Tässä opetusohjelmassa opit Java: n sisäkkäisistä luokista ja niiden tyypeistä esimerkkien avulla.

Java-ohjelmassa voit määrittää luokan toiseen luokkaan. Tällainen luokka tunnetaan nimellä nested class. Esimerkiksi,

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

Java-järjestelmässä voit luoda kahdentyyppisiä sisäkkäisiä luokkia.

  • Ei-staattinen sisäkkäinen luokka (sisempi luokka)
  • Staattinen sisäkkäinen luokka

Suositeltava lukeminen :

  • Java Access Modifiers
  • Java-staattinen avainsana

Tarkastellaan ensin ei-staattisia sisäkkäisiä luokkia.

Ei-staattinen sisäkkäinen luokka (sisempi luokka)

Ei-staattinen sisäkkäinen luokka on luokka toisen luokan sisällä. Sillä on pääsy sulkevan luokan (ulomman luokan) jäseniin. Se tunnetaan yleisesti nimellä inner class.

Koska se inner classon olemassa ulommassa luokassa, sinun on ensin saatava aikaan ulompi luokka sisäisen luokan luomiseksi.

Tässä on esimerkki siitä, kuinka voit ilmoittaa sisäiset luokat Java-muodossa.

Esimerkki 1: Sisäluokka

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

Tuotos :

 Suorittimen välimuisti = 4,3 RAM-kellon nopeus = 5,5

Yllä olevassa ohjelmassa on kaksi sisäkkäistä luokkaa: Suoritin ja RAM ulomman luokan sisällä: CPU. Voimme julistaa sisäisen luokan suojelluksi. Siksi olemme julistaneet RAM-luokan suojatuksi.

Pääluokan sisällä,

  • loimme ensin ilmentymän ulomman luokan prosessorista nimeltä CPU.
  • Käyttämällä ulomman luokan esiintymää loimme sitten sisäisten luokkien objektit:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Huomautus : Piste ( .) -operaattorin avulla luodaan sisäluokan esiintymä käyttämällä ulkoista luokkaa.

Sisäisen luokan ulkoisen luokan jäsenten käyttö

Voimme käyttää ulomman luokan jäseniä tällä avainsanalla. Jos haluat oppia tästä avainsanasta, siirry Java-avainsanaan.

Esimerkki 2: Jäsenien käyttö

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

Tuotos :

 Moottorityyppi 8WD = suurempi moottorityyppi 4WD = pienempi

Yllä olevassa ohjelmassa meillä on moottorin sisäinen luokka ulkoisen luokan auton sisällä. Huomaa viiva,

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

Käytämme thisavainsanaa päästäkseen ulomman luokan carType-muuttujaan. Olet ehkä huomannut, että sen sijaan, että this.carTypeolisimme käyttäneet, olemme käyttäneet Car.this.carType.

Se johtuu siitä, että jos emme olisi maininneet ulomman luokan auton nimeä, thisavainsana edustaa jäsentä sisemmässä luokassa.

Samoin käytämme myös ulomman luokan menetelmää sisäisestä luokasta.

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

On tärkeää huomata, että vaikka getCarName()on privatemenetelmä, voimme käyttää sitä sisemmän luokassa.

Staattinen sisäkkäinen luokka

Java-ohjelmassa voimme määritellä staticluokan myös toisen luokan sisällä. Tällainen luokka tunnetaan nimellä static nested class. Staattisia sisäkkäisiä luokkia ei kutsuta staattisiksi sisäluokiksi.

Toisin kuin sisempi luokka, staattinen sisäkkäinen luokka ei voi käyttää ulomman luokan jäsenmuuttujia. Tämä johtuu siitä, että staattinen sisäkkäinen luokka ei vaadi sinua luomaan ulkoluokan esiintymää.

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

Tässä luomme staattisen sisäkkäisen luokan objektin yksinkertaisesti käyttämällä ulomman luokan luokan nimeä. Siksi ulompaan luokkaan ei voida viitata käyttämällä OuterClass.this.

Esimerkki 3: Staattinen sisäluokka

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

Tuotos :

 Portteja yhteensä = 3

Yllä olevassa ohjelmassa olemme luoneet staattisen luokan nimeltä USB emolevyn sisälle. Huomaa rivi,

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

Tässä luomme USB-objektin käyttämällä ulomman luokan nimeä.

Katsotaanpa nyt, mitä tapahtuisi, jos yrität tavoittaa ulomman luokan jäseniä:

Esimerkki 4: Pääsy ulkoisen luokan jäseniin staattisen sisäisen luokan sisällä

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

Kun yritämme suorittaa ohjelmaa, saamme virheen:

 virhe: ei-staattinen muuttuja, tähän ei voida viitata staattisessa kontekstissa

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.
  • Ei-staattisilla sisäkkäisillä luokilla (sisäisillä luokilla) on pääsy muihin ulkoisen / sulkevan luokan jäseniin, vaikka heidät julistettaisiin yksityisiksi.

Mielenkiintoisia artikkeleita...