کلاس های Nested و Inner در جاوا

در این مقاله از مرکز درس می خواهیم یکی از مهم ترین مواردی که برای یادگیری و کار با زبان برنامه نویسی جاوا لازم است بلد باشید یعنی کلاس های تو در تو و داخلی جاوا صحبت کنیم. این آموزش به کمک مثال یاد می گیرید که با کلاس های Inner و Nested در جاوا کار کنید.

در جاوا می توانید یک کلاس را در یک کلاس دیگر تعریف کنید. این کلاس به عنوان کلاس Nested شناخته می شود.

class OuterClass {

// …

class NestedClass {

// …

}

}

دو نوع کلاس Nested یا تو در تو می توانید در جاوا ایجاد کنید.

  • کلاس تو در تو غیر استاتیک (کلاس Inner )
  • کلاس تو در تو استاتیک

بیایید ابتدا به کلاس های تو در تو غیر استاتیک نگاه کنیم.

کلاس تو در تو غیر استاتیک

کلاس تو در تو غیر استاتیک یک کلاس در کلاس دیگری است که در آن به اعضای کلاس محصور (کلاس بیرونی) دسترسی دارد. معمولا به عنوان کلاس درونی شناخته می شود.

کلاس داخلی در داخل کلاس بیرونی وجود دارد (برای اینکه یک کلاس درونی را تعریف کنید ، ابتدا باید کلاس بیرونی را تعریف کنید).

به عنوان مثال می توانید کلاس های داخلی را در جاوا تعریف کنید.

مثال ۱ : کلاس داخلی

  1. class CPU {
  2. double price;
  3. class Processor{
  4. double cores;
  5. String manufacturer;
  6. double getCache(){
  7. return 4.3;
  8. }
  9. }
  10. protected class RAM{
  11. double memory;
  12. String manufacturer;
  13. double getClockSpeed(){
  14. return 5.5;
  15. }
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. CPU cpu = new CPU();
  21. CPU.Processor processor = cpu.new Processor();
  22. CPU.RAM ram = cpu.new RAM();
  23. System.out.println(“Processor Cache = ” + processor.getCache());
  24. System.out.println(“Ram Clock speed = ” + ram.getClockSpeed());
  25. }
  26. }

خروجی

Processor Cache = 4.3

Ram Clock speed = 5.5

در برنامه بالا، کلاس CPU دو کلاس داخلی Processor و RAM دارد. از آنجا که کلاس RAM کلاس داخلی است می توانید آن را protected قرار دهید.

بیشتر بخوانید :   همه چی درباره امانت داری حسابداران

در کلاس Main ، ابتدا نمونه CPU ایجاد می شود. و به منظور ایجاد نمونه Processor ، عملگر. (نقطه) استفاده می شود.

دسترسی به اعضای کلاس بیرونی در کلاس داخلی

همانطور که بحث کردیم ، کلاس های درونی می توانند به اعضای کلاس بیرونی دسترسی پیدا کنند که با استفاده از کلید واژه this امکان پذیر است.

مثال ۲ : دسترسی به اعضا

  1. public class Car {
  2. String carName;
  3. String carType;
  4. public Car(String name, String type) {
  5. this.carName = name;
  6. this.carType = type;
  7. }
  8. private String getCarName() {
  9. return this.carName;
  10. }
  11. class Engine {
  12. String engineType;
  13. void setEngine() {
  14. // Accessing carType property of Car
  15. if(Car.this.carType.equals(“4WD”)){
  16. // Invoking method getCarName() of Car
  17. if(Car.this.getCarName().equals(“Crysler”)) {
  18. this.engineType = “Bigger”;
  19. } else {
  20. this.engineType = “Smaller”;
  21. }
  22. }else{
  23. this.engineType = “Bigger”;
  24. }
  25. }
  26. String getEngineType(){
  27. return this.engineType;
  28. }
  29. }
  30. }
  31. public class CarMain {
  32. public static void main(String[] args) {
  33. Car car1 = new Car(“Mazda”, “8WD”);
  34. Car.Engine engine = car1.new Engine();
  35. engine.setEngine();
  36. System.out.println(“Engine Type for 8WD= ” + engine.getEngineType());
  37. Car car2 = new Car(“Crysler”, “4WD”);
  38. Car.Engine c2engine = car2.new Engine();
  39. c2engine.setEngine();
  40. System.out.println(“Engine Type for 4WD = ” + c2engine.getEngineType());
  41. }
  42. }

خروجی

Engine Type for 8WD= Bigger

Engine Type for 4WD = Smaller

در برنامه بالا ، در کلاس داخلی Engine ، از کلید واژه this برای دسترسی به متغیر carType کلاس خارجی Car استفاده کرده ایم:

Car.this.carType.equals(“4WD)

این کار امکان پذیر است حتی اگر carType عضو خصوصی از کلاس Car باشد.

همچنین می توانید ببینید از Car.this برای دسترسی به اعضای Car استفاده کرده ایم. اگر از this به جای Car.this استفاده کنید ، فقط به اعضای کلاس Engine دسترسی دارید.

به همین ترتیب ، از کلید واژه this برای دسترسی به ()getCarName از کلاس Car استفاده کرده ایم:

Car.this.getCarName().equals(“Crysler”)

در اینجا ، متد ()getCarName یک متد خصوصی از کلاس Car است.

بیشتر بخوانید :   رفع ناسازگاری بین فرزندان

کلاس داخلی استاتیک

در جاوا می توانید یک کلاس تو در تو تعریف کنید که استاتیک باشد. چنین کلاسی به کلاس تو در تو استاتیک معروف است.

برخلاف کلاس درونی ، کلاس تو در تو استاتیک نمی تواند به متغیرهای عضو کلاس بیرونی دسترسی پیدا کند زیرا کلاس تو در تو استاتیک نیاز به ایجاد نمونه ای از کلاس بیرونی ندارد. از این رو ، هیچ مرجعی از کلاس بیرونی با OuterClass.this وجود ندارد.

بنابراین ، می توانید نمونه ای از کلاس تو در تو استاتیک را مانند زیر ایجاد کنید:

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

مثال ۳ : کلاس داخلی استاتیک

  1. Public class MotherBoard {
  2. String model;
  3. public MotherBoard(String model) {
  4. this.model = model;
  5. }
  6. static class USB{
  7. int usb2 = 2;
  8. int usb3 = 1;
  9. int getTotalPorts(){
  10. return usb2 + usb3;
  11. }
  12. }
  13. }
  14. public class Main {
  15. public static void main(String[] args) {
  16. MotherBoard.USB usb = new MotherBoard.USB();
  17. System.out.println(“Total Ports = ” + usb.getTotalPorts());
  18. }
  19. }

خروجی

Total Ports = 3

در برنامه بالا ، با استفاده از کلمه کلیدی static ، کلاس داخلی استاتیک USB را تعریف کردیم.

همچنین می توانید ببینید ، در کلاس Main ، مستقیما نمونه ای از USB را از MotherBoard با عملگر . (نقطه) بدون ایجاد نمونه ای از Motherboard تعریف کردیم.

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

بیایید ببینیم که اگر سعی کنیم به اعضای کلاس بیرونی دسترسی پیدا کنیم چه اتفاقی خواهد افتاد:

مثال ۴ : دسترسی به اعضای کلاس بیرونی در کلاس داخلی استاتیک

  1. String model;
  2. public MotherBoard(String model) {
  3. this.model = model;
  4. }
  5. static class USB{
  6. int usb2 = 2;
  7. int usb3 = 1;
  8. int getTotalPorts(){
  9. if(MotherBoard.this.model.equals(“MSI”)) {
  10. return 4;
  11. }
  12. else {
  13. return usb2 + usb3;
  14. }
  15. }
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. MotherBoard.USB usb = new MotherBoard.USB();
  21. System.out.println(“Total Ports = ” + usb.getTotalPorts());
  22. }
  23. }

خروجی

error: non-static variable this cannot be referenced from a static context

نکات کلیدی جهت یادآوری

  • جاوا با کلاس داخلی به عنوان یک عضو معمولی کلاس رفتار می کند. آن ها دقیقا مانند متد ها و متغیرهایی هستند که درون یک کلاس تعریف شده اند.
  • از آنجا که کلاس داخلی عضو کلاس بیرونی است ، می توانید هرگونه تنظیم کننده سطح دسترسی مانند praivate و protected را به کلاس داخلی اعمال کنید، که در کلاس های عادی امکان پذیر نیست.
  • از آنجا که کلاس تو در تو عضوی از کلاس محصور خارجی است ، می توانید از عملگر . (نقطه) برای دسترسی به کلاس تو در تو و پارامتر هایش استفاده کنید.
  • استفاده از کلاس تو در تو باعث می شود کد خوانا تر باشد و کپسوله سازی بهتری فراهم کند.
  • کلاس های تو در تو غیر استاتیک (کلاس های داخلی) به سایر اعضای کلاس بیرونی / محصور دسترسی دارند حتی اگر private باشند.
بیشتر بخوانید :   برترین زبان‌های برنامه نویسی
ساسان سروشه

نوشته‌های مرتبط

دیدگاه‌ها

*
*