آموزش جاوا- قسمت 6 (توابع)

آموزش جاوا- قسمت 6 (توابع)

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

 

در جاوا تمام توابع باید حتما داخل یک کلاس تعریف شوند. به نمونه تابعی که در زیر تعریف شده است توجه کنید:

public class Main {
    public static void access() {
        // Do something here
    }
}

در مثال بالا تابعی به نام access داخل کلاس Main تعریف شده است. توجه شما را به نکاتی درباره این تابع جلب می‌کنم:

  • کلمه کلیدی static به این معنی است که این تابع متعلق به کلاس Main بوده و یک instance خاص از Main نیست. این خود به این معنی است که می‌توان این تابع را داخل کلاس دیگری با استفاده از ()Main.access صدا زد.
  • کلمه کلیدی void به این معنی است که این تابع هیچ مقداری برنمیگرداند. در جاوا ممکن است توابع مقادیری را برگردانند که در این صورت باید داخل تعریف تابع به همراه کلمه کلیدی return آورده شود. در این صورت اگر بخواهید که بدون برگرداندن مقدار خاصی تابع اجرا شود، میتوانید در انتهای تعریف تابع از کلمه کلیدی return به تنهایی استفاده کنید.
  • این تابع هیچ آرگومانی نمیگیرد، هرچند توابع جاوا می‌‌توانند آرگومان‌هایی را به عنوان ورودی بگیرند.

آرگومان‌ها

آرگومان‌ها در توابع جاوا بر اساس مقدارشان پاس داده می‌شوند. به این معنی که هنگام اجرای توابع، مقدار آرگومان‌ها کپی می‌شود. به مثال زیر توجه کنید:

public void update(int num1, int num2) {
    ...
}

حال به کد زیر که تابع bar در آن صدا زده شده است توجه کنید:

int a = 3;
int b = 5;
update(a, b);

کاملا قابل تصور است که این دو خط در ابتدای فراخوانی تابع update، انجام شوند:

int num1 = a;
int num2 = b;

به این معنی که مقدار a در متغیر num1 کپی شده و مقدار b در متغیر num2 کپی می‌شود. در نتیجه تغییر num1 و num2 هیچ تاثیری روی a و b نخواهد داشت.

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

public void getNode(Node n1, Node n2) {
    ...
}

نحوه استفاده از تابع getNode به این صورت است:

Node node1 = new Node("node1");
Node node2 = new Node("node2");
getNode(node1, node2);

مجددا میتوان تصور کرد که در ابتدای فراخوانی تابع getNode این دو خط به این صورت انجام شوند:

Node n1 = node1;
Node n2 = node2;

با توجه به تفاوتی که در مقداردهی objectها و primitiveها وجود دارد و در قسمت دوم آموزش نیز به آن اشاره شده است، در اینجا n1 و node1 دو reference متفاوت به یک object یکسان (Node) هستند. درواقع عبارت n1 == node1 به این صورت true است. به این معنی که اجرای توابع روی n1 منجر به تغییر در node1 می‌شود. با مثال زیر متوجه نکته جالبی خواهید شد… اگر مقدار n1 را با پاس دادن یک مقدار بر اساس reference تغییر دهید، از این پس دیگر تغییر در n1  روی node1 هیچ تاثیری نخواهد داشت.

n1.setName("firstNode"); // node1 name is now firstNode as well
n1 = new Node("lastNode"); // n1 is a new node, different than node1 with the name of lastNode
// n1 == node1   is not true anymore

توابع غیر static

در جاوا توابع غیر static کاربرد بیشتری نسبت به توابع static دارند. این توابع روی کل کلاس قابل اجرا نیستند بلکه فقط روی objectها اجرا می‌شوند. توابع غیر static می‌توانند به فیلدهای  یک object دسترسی داشته و آن را تغییر دهند. به مثال زیر توجه کنید:

public class Node {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

صدا زدن توابع نیاز به یک Object از نوع Node دارد:

Student n = new Node();
n.setName("myNode");
String name = n.getName();

Node.setName("thisNode"); // Will not work!
Node.getName(); // Will not work!

جمع بندی بحث امروز:

  • در جاوا هر تابعی باید داخل یک کلاس تعریف شود.
  • توابع static به یک کلاس تعلق دارند، درحالی که توابع غیر static به objectها تعلق دارند.
  • همه پارامترها با مقدارشان به توابع پاس داده می‌شوند، محتوای primitiveها کپی شده و objectها با referenceشان پاس داده می‌شوند.

تمرین:

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

public class swappingExample {

   public static void main(String[] args) {
      int a = 30;
      int b = 45;
      System.out.println("Before swapping, a = " + a + " and b = " + b);

      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " + a + " and b is " + b);
   }

   public static void swapFunction(int a, int b) {
      System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
      
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

برای انجام تمرین‌ این مبحث می‌توانید از یک IDE آنلاین مثل tutorialspoint استفاده کنید.

 
تبریک!!! شما اولین قدم بزرگ در نوشتن برنامه‌های مبتنی بر جاوای شبکه‌ای خود را برداشتید.  از این پس خواهید توانست با آجرهایی که نحوه ساخت خود آن‌ها را در 5 جلسه قبلی آموخته بودید، یک دیوار محکم برای شبکه‌های SDN خود بسازید…

در پست بعدی درمورد objectها مفصل تر صحبت خواهیم کرد. پس همچنان همراه ما باشید…

 

پاسخ تمرین توابع جاوا:

خروجی نهایی به این شکل خواهد بود:

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30

**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

 

تاریخچه آموزش جاوا به ترتیب:

قسمت اول آموزش جاوا (مقدمه)

قسمت دوم آموزش جاوا (Types and Variables)

قسمت سوم آموزش جاوا (دستورات شرطی)

قسمت چهارم آموزش جاوا (آرایه‌ها)

قسمت پنجم آموزش جاوا (حلقه‌ها)

قسمت ششم آموزش جاوا (توابع)

قسمت هفتم آموزش جاوا (اشیا)

قسمت هشتم آموزش جاوا (ارث‌بری)

قسمت نهم آموزش جاوا (try and catch)

قسمت دهم آموزش جاوا (کلاس‌های abstract)

قسمت یازدهم آموزش جاوا (Interfaces)

قسمت دوازدهم آموزش جاوا (مفهوم Generic)

قسمت سیزدهم آموزش جاوا (Networking)

قسمت چهاردهم آموزش جاوا (مفهوم نخ و رشته)

پاسخ دهید

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