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 class
on 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 this
avainsanaa päästäkseen ulomman luokan carType-muuttujaan. Olet ehkä huomannut, että sen sijaan, että this.carType
olisimme käyttäneet, olemme käyttäneet Car.this.carType
.
Se johtuu siitä, että jos emme olisi maininneet ulomman luokan auton nimeä, this
avainsana 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 private
menetelmä, voimme käyttää sitä sisemmän luokassa.
Staattinen sisäkkäinen luokka
Java-ohjelmassa voimme määritellä static
luokan 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.