اینترفیس در جاوا چیست؟ — مفهوم، کاربرد و پیاده سازی Java Interface

۲۶۰۵ بازدید
آخرین به‌روزرسانی: ۲۱ تیر ۱۴۰۲
زمان مطالعه: ۱۷ دقیقه
اینترفیس در جاوا چیست؟ — مفهوم، کاربرد و پیاده سازی Java Interface

اینترفیس در جاوا (Java) چیست؟ «اینترفیس» در جاوا (Java Interface) سطح پیشرفته‌ای از رسیدن به انتزاع یا تجرید (Abstraction) در زبان برنامه نویسی جاوا به حساب می‌آید. به اینترفیس «رابط» یا «واسط» نیز گفته می‌شود. همچنین، استفاده از اینترفیس در جاوا به کاهش پیچیدگی کدها، سادگی و خوانایی (Readability) برنامه‌ها کمک می‌کند. در این مقاله به تفاوت اینترفیس با برخی مفاهیم مشابه آن مانند کلاس و انتزاع نیز پرداخته شده است. در این نوشتار علاوه بر پرداختن به چیستی اینترفیس در جاوا سعی شده است تا انواع اینترفیس در جاوا و سایر مفاهیم مرتبط نیز شرح داده شوند.

فهرست مطالب این نوشته

اینترفیس در جاوا چیست؟

اینترفیس در زبان برنامه نویسی جاوا یک نوع داده انتزاعی به حساب می‌آید. اینترفیس در جاوا برای تعیین رفتاری استفاده می‌شود که کلاس‌ها باید آن را پیاده‌سازی کنند. اینترفیس‌ها مشابه پروتکل‌ها (قواعد) هستند. اینترفیس‌ها در جاوا با استفاده از کلمه کلیدی «interface» اعلان می‌شوند. اعلان اینترفیس‌ها تنها شامل امضای متد (Method Signature) و اعلان‌های ثابت می‌شوند. اعلان ثابت (Constant) یعنی اعلان متغیرهایی که به صورت ایستا (استاتیک) و نهایی (Final) اعلان می‌شوند. اینترفیس ساز و کاری برای رسیدن به انتزاع محسوب می‌شود.

انتزاع در جاوا، قابلیت‌های عملکردی یک متد خاص را به وسیله مخفی کردن منطق پیاده‌سازی نوشته شده در داخل متد فراهم می‌کنند. کلاس، یک اینترفیس را برای به ارث بردن متدهای انتزاعی پیاده‌سازی می‌کند. علاوه بر متدهای انتزاعی، یک اینترفیس می‌تواند شامل ثابت‌ها، متدهای ایستا، اینترفیس‌های تو در تو و متدهای پیش‌فرض هم باشد.

اینترفیس در جاوا معمولاً رابطه «IS-A» (هست یک) را نمایش می‌دهد. یکی از دلایل مهم استفاده از اینترفیس در جاوا ، یافتن روشی برای انجام وراثت چندگانه (Multiple Inheritance) است، چون این نوع از وراثت در جاوا پشتیبانی نمی‌شود.

زبان برنامه نویسی جاوا

یک اینترفیس در جاوا قادر به دستیابی به صد در صد انتزاع است زیرا فقط شامل متدهایی خولهد بود که پیاده‌سازی ندارند یعنی همان متدهایی که دارای بدنه نیستند. به عبارت دیگر می‌توان گفت اینترفیس فقط می‌تواند حاوی امضای متد و فیلدها باشد. البته، متدهای پیش‌فرض و استاتیک نسخه هشتم جاوا (Java 8) می‌توانند در اینترفیس پیاده‌سازی شوند. اینترفیس‌ها نقشه ساخت کلاس‌ها به حساب می‌آیند. آن‌ها هرگز برای نمایش اشیا ساخته نشده‌اند. اینترفیس‌ها قراردادی بین یک برنامه نویس و زبان برنامه نویسی جاوا به حساب می‌آیند.

شباهت‌های کلاس و اینترفیس در جاوا

اینترفیس در جاوا شباهت‌های بسیاری با یک کلاس معمولی در جاوا دارد. اینترفیس در جاوا شامل متدهای انتزاعی است و این متدها برای پیاده‌سازی طراحی شده‌اند. این فرآیند تقریباً با وراثت یا ارث بری (Inheritance) برابری دارد که این موضوع در مورد کلاس‌ها کاملاً طبیعی است.

در ادامه شباهت‌های اصلی بین این اینترفیس و کلاس ارائه شده است:

  • دقیقاً مانند کلاس‌ها، اینترفیس می‌تواند به تعداد مورد نیاز متد داشته باشد.
  • فرمت فایل اینترفیس در جاوا با پسوند «java.» ذخیره می‌شود که دقیقا مشابه کلاس در جاوا است.
  • بایت‌کد (Bytecode) اینترفیس در جاوا در یک فایل «class.» ظاهر می‌شود.
  • اینترفیس جاوا به شکل بسته (Package) نشان داده می‌شود و بایت‌کد به مربوطه آن در پوشه‌ای قرار می‌گیرد که با نام بسته مطابقت دارد.
شباهت‌ها و تفاوت‌های اینترفیس در جاوا

در بخش بعدی این مقاله، تفاوت‌های کلاس و اینترفیس در جاوا بررسی شده‌اند.

تفاوت‌های بین کلاس در جاوا و اینترفیس در جاوا

با این که اینترفیس و کلاس بسیار شبیه به هم هستند، اما تفاوت‌هایی نیز بین آن‌ها وجود دارند که در این بخش به بررسی این تفاوت‌ها پرداخته شده است:

  • اینترفیس در جاوا از وراثت چندگانه پشتیبانی می‌کند، اما کلاس پشتیبانی وراثت چندگانه ندارد.
  • اینترفیس جاوا دارای اعضای داده (Data Member) نیست، اما کلاس در جاوا اعضای داده دارد.
  • فقط اعضای غیرکامل یا «Signature Member» در اینترفیس وجود دارند، اما در کلاس هم اعضای غیر کامل و هم اعضای کامل یعنی انتزاعی موجود هستند.
  • اینترفیس جاوا دارای «Access Modifier» نیست، Access Modifierها سطح دسترسی به کلاس‌ها، سازنده‌ها (Constructor)، متدها، متغیرها (Variable) و سایر موارد را مشخص می‌کنند. اما کلاس در جاوا دارای Access Modifier است.
  • واسط در جاوا دارای اعضای ایستا نیست، اما تقریباً همه اعضای کلاس‌ها ایستا و ثابت هستند.

ارتباط بین کلاس‌ها و اینترفیس‌ها در جاوا در تصویر زیر نشان داده شده است. می‌توان گفت که یک کلاس، کلاس دیگر و یک اینترفیس، اینترفیس دیگر را بسط (گسترش) می‌دهد. اما یک کلاس اینترفیس را بسط نمی‌دهد، بلکه آن را پیاده‌سازی می‌کند.

رابطه بین کلاس و interface

در بخش بعدی مقاله «اینترفیس در جاوا چیست» روش اعلان اینترفیس‌ها شرح داده شده است.

اینترفیس در جاوا چگونه اعلان می‌شود؟

اینترفیس در جاوا با استفاده از کلمه کلیدی «interface» اعلان می‌شود. این روش انتزاع کامل را به وجود می‌آورد، یعنی همه متدها در داخل یک اینترفیس با بدنه خالی اعلان می‌شوند. همه فیلدها به طور پیش‌فرض عمومی، ایستا و نهایی هستند. کلاسی که اینترفیس در جاوا را پیاده‌سازی می‌کند، باید همه متدهای اعلان شده در اینترفیس را پیاده‌سازی کند.

قاعده نحوی یا همان سینتکس اینترفیس در جاوا به صورت زیر است:

1interface <interface_name>{  
2      
3    // declare constant fields  
4    // declare methods that abstract   
5    // by default.  
6}  

بخش بعدی این مقاله به بررسی دلیل وجود اینترفیس در جاوا اختصاص دارد.

چرا از اینترفیس در جاوا استفاده می‌شود؟

جاوا از وراثت چندگانه پشتیبانی نمی‌کند به همین دلیل به کلاس‌ها این امکان را نمی‌دهد که بیش از یک کلاس را در یک نمونه (Instance) بسط دهند. نمونه‌ها عناصر مستقل برنامه با ویژگی‌ها و داده‌های مرتبط به هم هستند. کلاس‌های فرزندان (Child Class) نمی‌توانند ویژگی‌های کلاس والد چندگانه (Multiple Parent Class) را در یک نمونه به ارث ببرند، زیرا باعث به وجود آمدن «مسئله الماسی» (Diamond Problem) در برنامه جاوا می‌شوند.

برای برطرف کردن این مسئله، اینترفیس در جاوا ارائه شده است.

مثالی برای درک بهتر مسئله الماس و استفاده از اینترفیس در جاوا برای رفع آن

برای مثال در تصویر زیر کلاس C نمی‌تواند از کلاس‌های B و A چیزی را به ارث ببرد و باعث بروز خطا خواهد شد.

کلاس‌ها در زبان برنامه نویسی جاوا

کدهای مثال فوق به صورت زیر ارائه شده است. ابتدا در بخش اول کدهای کلاس A مشاهده می‌شوند:

1package multiple;
2class A{
3     void msg(){System.out.println("Hello");}
4}

کدهای کلاس B به صورت زیر است:

1package multiple;
2class B{
3     void msg(){System.out.println("Welcome");}
4}

کدهای کلاس C به صورت زیر نمایش داده می‌شوند:

1package multiple;
2class C extends A,B{ // This will not be accepted by Java, It will throw an error and code will not be executed.
3public static void main(String args[]){
4        C obj=new C();
5        obj.msg();
6        }
7}

خروجی و خطای نشان داده شده برای مثال فوق به صورت زیر است:

Error. This particular approach throws an exception. Java do not support Multiple inheritances. This error is known as Diamond Problem

اینترفیس در جاوا چگونه از بروز مشکل الماسی جلوگیری می‌کند؟

جهت حل مشکل فوق، برای مثال فرض می‌شود که دو هواپیما وجود دارند که یکی از آن‌ها دارای مسافر است و دیگری فقط بار حمل می‌کند. حال باید از خواص هر دو هواپیمای مسافربری و باری به عنوان والدها ارث بری شود.

زبان جاوا از این مسئله پشتیبانی نمی‌کند زیرا در ابهام (Ambiguity) بین دو هواپیما قرار می‌گیرد.

مثال هواپیما در برنامه نویسی

اما اگر بتوان این حالت را در جاوا ایجاد کرد که در حال به ارث بردن از یک هواپیما است و پیاده‌سازی متدهای موجود در هواپیما دوم انجام می‌شوند، امکان این نوع ارث بری فراهم خواهد شد. مانند یک هواپیمای تجاری که هم دارای مسافر و هم دارای بار است. اینترفیس در جاوا مانند ساخت یک هواپیمای بزرگ به حساب می‌آید که می‌تواند هر دو وظیفه را بدون تداخل با مؤلفه‌های یکدیگر انجام دهد، در عوض فقط متدها را از کلاس اینترفیس قرض می‌گیرد.

پیاده‌سازی برنامه برای هواپیما باری در مثال

برای حل خطای Diamond Problem از کدهای اینترفیس در جاوا با ساختار نوشتاری زیر استفاده می‌شود. ابتدا کدهای اینترفیس در این مثال نمایش داده شده‌اند:

1package MIS;
2public interface solution {
3public void Hello();
4public void Welcome();
5}

کدهای کلاس در جاوا به صورت زیر است:

1package MIS;
2public class classA implements solution {
3       public void Hello() {
4            java.lang.System.out.println("Hello world");
5       }
6       public void Welcome() {
7            java.lang.System.out.println("Welcome to Faradars");
8}
9public static void main(String[] args) {
10       classA Faradars = new classA();
11       Faradars.Hello();
12       Faradars.Welcome();
13       }
14}

خروجی کدهای فوق، در ادامه نشان داده شده است:

Hello World
Welcome to Faradars

بنابراین، برای اعلان اینترفیس در جاوا از روش زیر استفاده می‌شود:

1interface interface_name {
2// declare constant fields;
3// declare methods();
4//  default methods;
5}

در ادامه این بخش، برای درک بهتر مسئله اینترفیس در جاوا ، برنامه یک ماشین حساب ساده بر پایه اینترفیس در جاوا طراحی شده است.

ساخت ماشین حساب بر پایه اینترفیس در جاوا

کدهای اینترفیس مثال ماشین حساب به صورت زیر هستند:

1package basicoperations;
2public interface maths {
3public void add();
4public void sub();
5public void mul();
6public void div();

ماشین حساب

کدهای کلاس این مثال به صورت زیر نوشته می‌شوند:

1package basicoperations;
2import java.util.Scanner;
3public class student1 implements maths {
4        @Override
5         public void add() {
6         Scanner kb = new Scanner(System.in);
7         System.out.println("Enter any two integer values to perform addition");
8         int a=kb.nextInt();
9         int b=kb.nextInt();
10         int s=a+b;
11         System.out.println("Sum of "+a+" and "+b+" is "+s);
12   }
13        @Override
14         public void sub() {
15         Scanner kb = new Scanner(System.in);
16         System.out.println("Enter any two integer values to perform substraction");
17         int a=kb.nextInt();
18         int b=kb.nextInt();
19         int s=a-b;
20         System.out.println("Difference of "+a+" and "+b+" is "+s);
21  }
22        @Override
23         public void mul() {
24         Scanner kb = new Scanner(System.in);
25         System.out.println("Enter any two integer values multiplication");
26         int a=kb.nextInt();
27         int b=kb.nextInt();
28         int s=a*b;
29         System.out.println("Product of "+a+" and "+b+" is "+s);
30  }
31        @Override
32         public void div() {
33         Scanner kb = new Scanner(System.in);
34         System.out.println("Enter any two integer values division");
35         int a=kb.nextInt();
36         int b=kb.nextInt();
37         int s=a/b;
38         System.out.println("Quotient of "+a+" and "+b+" is "+s);
39  }
40public static void main(String[] args) {
41   student1 Faradars1 = new student1();
42   Faradars1.add();
43   Faradars1.sub();
44   Faradars1.mul();
45   Faradars1.div();
46   }
47}

خروجی که برای این کلاس نمایش داده می‌شود به صورت زیر است:

خروجی مثال ماشین حساب در جاوا

در بخش بعدی این مقاله به بررسی تفاوت بین انتزاع و اینترفیس پرداخته شده است.

تفاوت انتزاع و اینترفیس در جاوا چیست؟

اینترفیس در جاوا دقیقاً مانند انتزاع در شی گرایی جزئیات پیاده‌سازی را مخفی می‌کند و فقط عملکرد را به کاربر نشان می‌دهد. اما تفاوت‌هایی بین انتزاع و اینترفیس در جاوا وجود دارند که در ادامه فهرست شده‌اند.

  • اولین تفاوت این است که تمام متدهای توصیف شده در داخل اینترفیس شامل هیچ پیاده‌سازی نیستند، در حالی که متدهای داخل انتزاع می‌توانند همراه با پیاده‌سازی و بدون آن باشند.
  • تفاوت کلیدی دیگر این است که همه متدهای تعریف شده در اینترفیس باید توسط کلاسی اجرا شوند که آن را پیاده‌سازی می‌کند. در حالی که در مورد کلاس انتزاع که کلاس انتزاعی را بسط می‌دهد تنها می‌تواند متدهای مورد نیاز را رونویسی (Override) کنند.
تفاوت اینترفیس و انتزاع

برای درک بهتر اینترفیس و انتزاع در جاوا بهتر است چند مثال ساده ارائه شود. مثلاً زمانی که یک کاربر قصد ارسال پیامکی را دارد، به راحتی شماره گیرنده را وارد می‌کند، پیام را در بخش نوشتن پیام می‌نویسد و در نهایت پیامک را ارسال می‌کند. کاربر فرستنده نمی‌داند چه فرآیندی برای ارسال این پیام به گیرنده انجام می‌شود. بنابراین، جزئیات پیاده‌سازی برای کاربر مخفی شده‌اند و فقط نتیجه عملکرد قابل مشاهده است. این کار در جاوا از طریق انتزاع یا اینترفیس انجام می‌شود.

به عنوان مثالی دیگر فرض می‌شود که اینترفیسی به نام Fly وجود دارد و این اینترفیس دارای متدهای ()goDown و ()goForward است. این روش‌ها حاوی هیچ منطقی نیستند، یعنی بدون هیچ‌گونه پیاده‌سازی هستند. اما هر کلاسی که اینترفیس Fly را پیاده‌سازی می‌کند، باید این دو متد را نیز پیاده‌سازی کند. می‌توان کلاس‌هایی برای پرندگانی که پرواز می‌کنند مانند گنجشک داشت که اینترفیس Fly را پیاده‌سازی می‌کنند. بنابراین، اگر قصد نگهداری فهرست نمونه‌هایی وجود داشته باشد که توانایی پرواز دارند، فقط فهرستی ایجاد می‌‌شود که حاوی مواردی از نوع Fly است. با درک مفاهیم اینترفیس در جاوا و همچنین انتزاع در جاوا، در بخش بعدی این مقاله به بررسی اینترفیس‌های تو در تو در جاوا پرداخته می‌شود.

اینترفیس تو در تو در جاوا چیست؟

اینترفیس تو در تو (Nested Interface) در جاوا ، فرآیندی برای اعلان اینترفیس‌ها در داخل یک اینترفیس موجود یا اعلان اینترفیس در داخل کلاسی موجود است. اینترفیس تو در تو در جاوا به عنوان اینترفیس داخلی (Inner Interface) نیز شناخته می‌شود. دسترسی به اینترفیس تو در تو به طور مستقیم امکان‌پذیر نیست. از این رو، روش اینترفیس تو در تو برای حل کردن (Resolve) فضای نام به وسیله گروه‌بندی آن‌ها با کلاس‌ها و اینترفیس‌های مرتبط‌شان انجام می‌گیرد.

در این روش، می‌توان اینترفیس تو در تو در جاوا را برای کلاس بیرونی (Outer Class) یا اینترفیس بیرونی (Outer Interface) به وسیله قرار دادن یک نقطه و سپس نام آن اینترفیس تعریف کرد. در ادامه، مثالی‌هایی برای درک بهتر روش اینترفیس تو در تو ارائه شده است.

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

ابتدا مثالی برای قرار دادن یک اینترفیس در جاوا در اینترفیس دیگر مشاهده می‌شود که کدهای واسط آن‌ها به صورت زیر هستند:

1package Nest;
2public interface OuterInterface {
3     void display();
4     interface InnerInterface{
5           void InnerMethod();
6       }
7}

کدهای کلاس این مثال به صورت زیر نوشته می‌شوند:

1package Nest;
2class NestedInterfaceDemo
3implements OuterInterface.InnerInterface{
4public void InnerMethod(){
5   int n = 10, t1 = 0, t2 = 1;
6   System.out.print("First " + n + " terms: ");
7         for (int i = 1; i <= n; ++i)
8        {
9             System.out.print(t1 + " + ");
10             int sum = t1 + t2;
11             t1 = t2;
12             t2 = sum;
13        }
14        System.out.println("nPrinting from Nested InnerInterface method...!n");
15    }
16public static void main(String args[]){
17       OuterInterface.InnerInterface obj=new NestedInterfaceDemo();
18       obj.InnerMethod();
19    }
20}

خروجی مثال فوق، به صورت زیر است:

First 10 terms: 0 + 1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 +
Printing from Nested InnerInterface method...!

در مثال بعدی ارائه شده، یک اینترفیس در داخل یک کلاس قرار گرفته است که کدهای اینترفیس آن به صورت زیر نمایش داده می‌شوند:

1package Nest2;
2public class FaradarsClass {
3       interface FaradarsInterface{
4              void NestedMethod();
5        }
6}

کدهای کلاس مثال مذکور به صورت زیر است:

1package Nest2;
2class NestedInterfaceDemo2 implements FaradarsClass.FaradarsInterface{
3public void NestedMethod(){
4            String input = "Faradars";
5            byte [] strAsByteArray = input.getBytes();
6            byte [] result = new byte [strAsByteArray.length];
7            for (int i = 0; i<strAsByteArray.length; i++)
8                    result[i] = strAsByteArray[strAsByteArray.length-i-1];
9                    System.out.println(new String(result));
10            }
11public static void main(String args[]){
12          FaradarsClass.FaradarsInterface obj = new NestedInterfaceDemo2();
13          obj.NestedMethod();
14     }
15}

خروجی زیر برای مثال فوق نمایش داده می‌شود:

sradaraF

در این بخش از این مقاله به بررسی اینترفیس تو در تو در جاوا پرداخته شد.

بسط اینترفیس در جاوا چگونه است؟

در زبان برنامه نویسی جاوا یک اینترفیس می‌تواند اینترفیس دیگر را بسط (Extend) دهد. باید به این نکته توجه داشت که اینترفیس نمی‌تواند اینترفیس دیگری را پیاده‌سازی کند و فقط کلاس می‌تواند این کار را انجام دهد. در مثال‌های زیر نشان داده شده است که چطور یک اینترفیس، دیگری را بسط می‌دهد.

در این مثال از دو اینترفیس با نام‌های RollNoDetails و PersonDetails استفاده شده است که اینترفیس دوم، اولی را بسط می‌دهد. ابتدا با استفاده از متد ()rollNo، اینترفیس RollNoDetails به صورت زیر ایجاد می‌شود:

1public interface RollNoDetails {
2    void rollNo();
3}

حال یک اینترفس دیگر یعنی PersonDetails ایجاد می‌شود تا اینترفیس RollNoDetails را بسط دهد و متد ()name در آن اعلان می‌شود. از آن‌جایی که از کلمه کلیدی «extends» در این روش استفاده شده است، بنابراین متدهای اینترفیس PersonDetails در RollNoDetails به ارث برده می‌شوند. حال اینترفیس PersonDetails دارای دو متد ()name و ()rollNo است. هر دو این متدها زمانی پیاده‌سازی می‌شوند که هر کلاسی از اینترفیس PersonDetails پیاده‌سازی شود.

1public interface PersonDetails extends RollNoDetails {
2    
3    void name();
4}

حال کلاسی با نام Details برای پیاده‌سازی اینترفیس PersonDetails ایجاد می‌شود. در این بخش بدنه هر دو متد ()name و ()rollNo ارائه شده است. زیرا متدهای اینترفیس RollNoDetails  از اینترفیس PersonDetails ارث بری می‌کنند. همچنین Details کلاس اصلی است. بنابراین در این بخش اشیا کلاس Details ایجاد می‌شوند و هر دو متد در آن پیاده‌سازی شده است.

1public class Details implements PersonDetails{
2    
3    public void name(){
4        System.out.println("AbhiAndroid");
5    }
6    
7    public void rollNo(){
8        System.out.println("98639012");
9    }
10
11    public static void main(String[] args) {
12        
13        Details details = new Details();
14        System.out.print("Name: ");
15        details.name();
16        System.out.print("Roll No: ");
17        details.rollNo();
18    }
19}

خروجی برنامه فوق به صورت زیر است:

Name: AbhiAndroid
Roll No: 98639012

بخش بعدی مقاله به اینترفیس «Marker» یا «Tag» در زبان برنامه نویسی جاوا اختصاص داده می‌شود.

اینترفیس Marker یا Tag در جاوا چیست؟

اینترفیس Marker یا Tag در جاوا به اینترفیسی گفته می‌شود که هیچ فیلد یا متدی ندارد. به زبان ساده‌تر به اینترفیس‌های خالی، Marker یا Tag گفته می‌شود. برای مثال برخی از اینترفیس‌های Marker شامل اینترفیس Serializable ،Clonnable ،Remote و سایر موارد هستند.

این نوع از اینترفیس‌ها به صورت زیر اعلان می‌شوند:

1public interface serializable
2{
3}

در بخش بعدی به بررسی دلیل استفاده از اینترفیس marker پرداحته شده است.

چرا از اینترفیس Marker استفاده می‌شود؟

اینترفیس Marker به عنوان یک برچسب برای اعلام پیام به کامپایلر جاوا استفاده می‌شود تا بتواند رفتار خاصی را به کلاس پیاده‌سازی کننده اینترفیس در جاوا اضافه کند. هیچ عضوی در اینترفیس Marker جاوا وجود دارد. برای مثال در رابطه با اینترفیس Marker خاص «java.io.Serializable» باید به این موضوع توجه کرد که هیچ عضوی برای تعریف آن وجود ندارد. هر زمانی که لازم باشد کلاسی سریالی (serialize) شود، کامپایلر جاوا باید در حالتی باشد که امکان سریال‌سازی کلاس به وجود بیاید.

در این حالت، از اینترفیس‌های Marker استفاده می‌شود. کلاس‌های جاوایی که می‌خواهند سریال‌سازی شوند باید اینترفیس Marker جاوا java.io.Serializable را پیاده‌سازی کنند. به این ترتیب با این روش کامپایلر جاوا در حالتی قرار می‌گیرد که امکان سریال‌سازی کلاس وجود دارد. در بخش بعدی این مقاله به بررسی متدهای پیش‌فرض در اینترفیس‌های جاوا پرداخته می‌شود.

متد پیش‌فرص در اینترفیس جاوا

پس از انتشار نسخه هشتم جاوا، می‌توان متدهایی را همراه با پیاده‌سازی در یک اینترفیس اضافه کرد. به این نوع از متدها، متدهای پیش‌فرض (Default) گفته می‌شود.

برای اعلان متدهای پیش‌فرض در داخل اینترفیس‌ها از کلمه کلیدی «default» مانند کدهای زیر استفاده می‌شود:

1public default void getSides() {
2   // body of getSides()
3}

در بخش بعدی به دلیل استفاده از متدهای پیش‌فرض پرداخته شده است.

چرا از متدهای پیش‌فرض استفاده می‌شود؟

فرض می‌شود که نیاز است تا متد جدیدی به اینترفیس جاوا اضافه شود. می‌توان متد را به اینترفیس بدون پیاده‌سازی و به راحتی اضافه کرد. همه کلاس‌هایی که آن اینترفیس را پیاده‌سازی می‌کنند، باید یک پیاده‌سازی برای متد ارائه کنند. اگر تعداد زیادی از کلاس‌ها پیاده‌سازی این اینترفیس را انجام دهند، باید همه این کلاس‌ها بررسی و تغییراتی در آن‌ها ایجاد شوند..

برای برطرف کردن این مشکل، جاوا در نسخه هشتم خود متدهای پیش‌فرض را ارائه داد، همچنین ارث بری این متدها مانند متدهای عادی است. در ادامه مثالی با استفاده از متدهای جاوا مشاهده می‌شود:

1interface Polygon {
2  void getArea();
3
4  // default method 
5  default void getSides() {
6    System.out.println("I can get sides of a polygon.");
7  }
8}
9
10// implements the interface
11class Rectangle implements Polygon {
12  public void getArea() {
13    int length = 6;
14    int breadth = 5;
15    int area = length * breadth;
16    System.out.println("The area of the rectangle is " + area);
17  }
18
19  // overrides the getSides()
20  public void getSides() {
21    System.out.println("I have 4 sides.");
22  }
23}
24
25// implements the interface
26class Square implements Polygon {
27  public void getArea() {
28    int length = 5;
29    int area = length * length;
30    System.out.println("The area of the square is " + area);
31  }
32}
33
34class Main {
35  public static void main(String[] args) {
36
37    // create an object of Rectangle
38    Rectangle r1 = new Rectangle();
39    r1.getArea();
40    r1.getSides();
41
42    // create an object of Square
43    Square s1 = new Square();
44    s1.getArea();
45    s1.getSides();
46  }
47}

خروجی برنامه فوق یه صورت زیر است:

The area of the rectangle is 30
I have 4 sides.
The area of the square is 25
I can get sides of a polygon.

در مثال فوق، یک اینترفیس به نام Polygon ایجاد می‌شود. این اینترفیس دارای متد پیش‌فرض ()getSides و متد انتزاعی ()getArea است. سپس دو کلاس با نام Rectangle و Square برای پیاده‌سازی اینترفیس Polygon ایجاد می‌شوند. کلاس Rectangle انجام پیاده‌سازی متد ()getArea و رو نویسی متد ()getSides را فراهم می‌کند. با این حال، کلاس Square فقط پیاده‌سازی متد ()getArea را ارائه می‌دهد. سپس، در حین فراخوانی متد ()getSides با استفاده از شی Rectangle، متد رونویسی شده (Overridden Method) فراخوانی شده است. در حالی که برای شی Square، متد پیش‌فرض فراخوانی می‌شود. در بخش بعدی مقاله به بررسی متدهای استاتیک و خصوصی (Private Method) در اینترفیس جاوا پرداخته شده است.

متد ایستا و خصوصی در اینترفیس جاوا چیست؟

یکی از ویژگی‌های دیگری که نسخه هشتم جاوا به این زبان برنامه نویسی اضافه کرده است، متد ایستا یا همان استاتیک در داخل اینترفیس به حساب می‌آید. مانند یک کلاس در جاوا، می‌توان به روش‌های استاتیک یک اینترفیس با استفاده از مراجع (Reference) آن‌ها دسترسی داشت.

مثال زیر برای درک بهتر این موضوع ارائه شده است:

1// create an interface
2interface Polygon {
3  staticMethod(){..}
4}
5
6// access static method
7Polygon.staticMethod();

پس از انتشار نسخه نهم جاوا، متدهای خصوصی نیز در این زبان برنامه نویسی پشتیبانی شدند. نمی‌توان اشیا یک اینترفیس را در جاوا ایجاد کرد. از این رو، متدهای خصوصی به عنوان متدهای کمکی استفاده می‌شوند که از متدهای دیگر در اینترفیس‌ها پشتیبانی می‌کنند. بخش بعدی این مقاله به مزایای Java Interface اختصاص دارد.

مزایای اینترفیس در جاوا کدامند؟

اینترفیس به دلیل برطرف کردن برخی از مشکلات برنامه نویسی با زبان جاوا مانند استفاده از وراثت چندگانه دارای مزایای بسیاری است که تعدادی از آن‌ها در این بخش شرح داده می‌شوند:

  • وراثت چندگانه در اینترفیس جاوا پشتیبانی می‌شود.
  • اینترفیس در جاوا به برنامه نویسان این امکان را می‌دهد که رویکردهای برنامه نویسی پیچیده را بشکنند و به چند رویکرد تقسیم کنند و همچنین در وابستگی‌های بین اشیا سادگی ایجاد می‌کنند.
  • اینترفیس در جاوا باعث می‌شود که اعضا و متدهای داده در یک برنامه دارای اتصال سست (Loose Coupling) باشند.

در بخش بعدی این مقاله معایب اینترفیس در جاوا ارائه شده است.

معایب اینترفیس در جاوا چیست؟

اینترفیس در جاوا در کنار مزایای بسیاری که دارد، دارای اندک معایبی نیز است که در این بخش به بررسی آن‌ها پرداخته می‌شود:

  • استفاده از اینترفیس در جاوا، سرعت اجرای برنامه را کاهش می‌دهد.
  • اینترفیس‌های جاوا در یک برنامه یا به میزان زیادی استفاده می‌شوند یا به ندرت مورد استفاده قرار می‌گیرند و میزان استفاده نرمالی ندارد.

بخش بعدی مقاله «اینترفیس در جاوا چیست» به نکات کلیدی اینترفیس اختصاص داده می‌شود.

چند نکته کلیدی اینترفیس در جاوا

از جمله نکات کلیدی پیرامون مفهوم اینترفیس در جاوا می‌توان به موارد زیر اشاره کرد:

  • هیچ یک از متدهای اعلان شده در اینترفیس جاوا بدنه‌ای ندارند که باعث ارائه انتزاع کامل شود.
  • امکان ایجاد یک شی از اینترفیس در جاوا وجود ندارد. از این رو، نمونه‌سازی اینترفیس امکان پذیر نیست.
  • اینترفیس در جاوا به متغیرهای اعلان شده‌ای نیاز دارد که در زمان اعلان مقداردهی اولیه شوند.
  • در نسخه «Java 8» متدهای پیش‌فرض و استاتیک در اینترفیس جاوا وجود دارند. در نسخه «Java ۹» متدهای خصوصی در اینترفیس جاوا موجود هستند

علاوه بر این، چند نکته کلیدی دیگر هم راجع به اینترفیس در جاوا وجود دارند که در ادامه هر کدام همراه با مثال شرح داده شده‌اند

نحوه پیاده سازی اینترفیس در جاوا توسط کلاس چگونه است؟

یک کلاس می‌تواند اینترفیس را با استفاده از کلمه کلیدی «implements» پیاده‌سازی کند. در ادامه مثالی برای نمایش دادن این موضوع ارائه شده است. کدهای زیر اینترفیس این مثال را نشان می‌دهند:

1package extInterface;
2public interface extInterface {
3        public void method1();
4        public void method2();
5}

کدهای زیر نشان دهنده کلاس این مثال هستند:

1package extInterface;
2import java.util.Scanner;
3class faradars implements extInterface{
4    public void method1(){
5         System.out.println("implementation of method1");
6         Scanner scanner = new Scanner(System.in);
7         System.out.println("Enter number to find square root in Java : ");
8         double square = scanner.nextDouble();
9         double squareRoot = Math.sqrt(square);
10         System.out.printf("Square root of number: %f is : %f %n" , square, squareRoot);
11    }
12    public void method2(){
13               System.out.println("implementation of method2");
14        }
15public static void main(String arg[]){
16               extInterface obj = new Faradars();
17               obj.method1();
18       }
19}

خروجی مثال فوق به صورت زیر است:

implementation of method1
Enter number to find square root in Java :
16
Square root of number: 16.0 is : 4.0

پیاده سازی وراثت چندگانه با استفاده از اینترفیس در جاوا

یک کلاس می‌تواند با استفاده از اینترفیس در جاوا وراثت چندگانه را در یک نمونه پیاده‌سازی کند. مثال زیر برای درک این نکته ارائه شده است.

در این مثال دو اینترفیس وجود دارد و ابتدا کدهای اینترفیس اول نشان داده شده‌اند:

1package ExtendInt;
2public interface Interface1 {
3       public void armstrong();
4}

کدهای اینترفیس دوم به صورت زیر است:

1package ExtendInt;
2public interface Interface2 {
3           public void prime();
4}
5//Class Code
6package ExtendInt;
7public class Faradars2 implements Interface1,Interface2{
8          public void armstrong(){
9                 int c=0,a,temp;
10                 int n=153;// input 
11                 temp=n;
12                 while(n>0){
13                        a=n%10;
14                        n=n/10;
15                        c=c+(a*a*a);
16                 }
17                  if(temp==c)
18                          System.out.println("armstrong number");
19                  else
20                          System.out.println("Not armstrong number");
21                          System.out.println("Extending to Interface 1");
22          }
23          public void prime(){
24          int i,m=0,flag=0;
25          int n=3;// input 
26          m=n/2;
27          if(n==0||n==1){
28                  System.out.println(n+" is not prime number");
29          }
30          else{
31                  for(i=2;i<=m;i++){
32                        if(n%i==0){
33                                System.out.println(n+" is not prime number");
34                                flag=1;
35                                break;
36                        }
37                  }
38                  if(flag==0) { 
39                  System.out.println(n+" is prime number"); 
40                  }
41          }
42          System.out.println("Extending to Interface 2");
43          }
44public static void main(String args[]){
45               Interface2 obj = new Faradars2();
46               obj.prime();
47               Interface1 obj1 = new Faradars2();
48               obj1.armstrong();
49         }
50}

خروجی برنامه فوق، در ادامه نشان داده شده است:

3 is prime number
Extending to Interface 2
armstrong number
Extending to Interface 1

نحوه نظیم Access Modifier برای اینترفیس در جاوا

«Access Modifier»ها برای یک اینترفیس در جاوا به طور پیش‌فرض روی حالت عمومی ثابت و نهایی تنظیم می‌شوند. مثال زیر درباره این موضوع ارائه شده است:

1package test;
2public interface Try {
3       //public int a=10;
4       //public static final int a=10;
5       //static int a=0;
6       //final int a=10;
7       //int a=10;
8}

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

پیاده سازی چند متد با نام یکسان در چند اینترفیس در جاوا

کلاس‌های جاوا نمی‌توانند اینترفیس را با نام یکسان برای متدها و نوع بازگشتی متفاوت پیاده‌سازی کنند. اگر دو یا چند متد با نام‌های یکسان در چندین اینترفیس وجود داشته باشند، پیاده‌سازی متد برای یک بار کافی است.

برای درک بهتر این موضوع مثال کدهای اینترفیس زیر ارائه شده‌اند:

1package same;
2public interface A {
3        public void display();
4}
5//Interface Code
6package same;
7public interface B {
8        public void display();
9}
10//Class Code
11package same;
12class same implements A,B {
13           public void display() {
14                   System.out.println("displaying data");
15           }
16     public static void main(String[] args) {
17           same print = new same();
18           print.display();
19     }
20}

خروجی برنامه فوق به صورت زیر است:

Welcome to Faradars E-Learning

به این ترتیب، در این مقاله سعی شد تا حد امکان به طور جامع به این سوال پاسخ داده شود که اینترفیس در جاوا چیست و به انواع مختلف آن در جاوا نیز پرداخته شد. اکنون در بخش پایانی این مقاله، برای آشنایی و یادگیری بیش‌تر اینترفیس در جاوا ، تعدادی از دوره‌های فرادرس به علاقه‌مندان معرفی شده‌اند که بیش‌ترین ارتباط را با اینترفیس در جاوا دارند.

جمع‌بندی

در این مقاله سعی شد تا حد امکان به طور جامع به این سوال پاسخ داده شود که اینترفیس در جاوا چیست و همچنین به یکی از مباحث مهم در این خصوص یعنی تفاوت کلاس و اینترفیس و تفاوت بین اینترفیس و انتزاع در جاوا پرداخته شد. یکی از دلایل مهم ایجاد اینترفیس در این زبان برنامه نویسی، پیاده‌سازی وراثت چندگانه و انتزاع است که سعی شد در این مقاله همراه با مثال‌هایی از پایه شرح داده شوند.

در بخش‌های میانی مقاله به بررسی اینترفیس‌هایی از جمله Marker و روش گسترش اینترفیس‌ها نیز پرداخته شد. پس از بررسی این موارد به نکات کلیدی و مهم اینترفیس در جاوا و همچنین مزایا و معایب اینترفیس نیز پرداخته شده است. امید است این مقاله مفید واقع شود.

بر اساس رای ۱۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
!edurekajava T pointAbhiAndroidProgramiz
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *