جاوا

جلسه ۹: پارامترها و مقدارهای بازگشتی متدها در جاوا


class ReturnExample {
  public static double square(double x) {
    return x * x;
  }
  
  public static boolean isEven(int x) {
    return x % 2 == 0;
  }
  
  public static void main(String[] args) {
    System.out.println(isEven(6));
    System.out.println(square(6));
  }
}
در اعلامیه متد ، آخرین کلمه قبل از نام متد، نوع مقدار بازگشتی را نشان می دهد. بنابراین می توانیم ببینیم که متد square مقادیری از نوع double برمی گرداند و isEven نیز مقادیر بولی برمی گرداند. هر متدی باید نوع بازگشتی خود را اعلام کند ، حتی اگر متدی مقدار بازگشتی نداشته باشد. به عنوان مثال ، تابعی برای کشیدن لبخند ممکن است اصلاً چیزی را برنگرداند ، بنابراین باید نوع بازگشتی void داشته باشد.

متد main مقدار بازگشتی void دارد

متد main با کلیدواژه های public static void اعلام می شود. void نشان می دهد که متد main مقداری را بر نمی گرداند. در C یا ++C ، متد main به طور سنتی یک عدد صحیح را برمی گرداند ، که به سیستم عامل نشان می دهد که آیا برنامه با موفقیت اجرا شده است یا خیر. خروج از برنامه با متد ()System.exit جاوا می تواند زودتر از موعد از برنامه خارج شود و موفقیت یا عدم موفقیت برنامه را با استفاده از متد ()System.exit برای سیستم عامل مشخص کند. حتی اگر به مقدار بازگشتی آن اهمیت ندهید ، System.exit به دلایل دیگری همچون رفع اشکال (دیباگ کردن) یا خاتمه دادن زودهنگام یک برنامه مفید است.
class HardStop {
  public static void main(String[] args) {
    System.out.println("Do or do not.");
    
    // force quit the program, making the code
    //  ۰ available to the operating system.
    //  (۰ traditionally indicates success.)
    System.exit(0);
    
    System.out.println("There is no try.");
  }

}
class Overload {
  
  public static void printMyFavoriteNumber(int x) {
    System.out.println("My favorite number is the integer " + x);
  }
  
  public static void printMyFavoriteNumber(double x) {
    System.out.println("My favorite number is the double " + x);
  }
  
  public static void main(String[] args) {
    printMyFavoriteNumber(42);
    printMyFavoriteNumber(3.1415);
  }
  
}
نام یک متد، همراه با نوع پارامترهای آن با ترتیب هایشان ، امضای متد نامیده می شود. نام پارامترها بخشی از امضای متد نیستند ، بنابراین شما نمی توانید دو متد با یک نام تعریف کنید که از پارامترهایی با نوع های مشابه استفاده کنند ، حتی اگر پارامترها نام های مختلفی داشته باشند. چرا؟ وقتی متد فراخوانی می شود ، جاوا نوع و ترتیب آرگومان های ارائه شده برای فراخوانی را می داند و می تواند با استفاده از آنها تعیین کند که کدام یک از متد های overload شده مورد نظر بوده است. اما جاوا نمی تواند نام پارامترهای مورد نظر را از مقادیر یا نوع آرگومان های ارائه شده برای فراخوانی تشخیص دهد. به عبارت دیگر در زمان فراخوانی متدها ما نام آرگمان ها را مشخص نمی کنیم. به دلایل مشابه ، از نوع بازگشتی متد که در ادامه خواهیم دید ، نمی توان برای overload کردن متد استفاده کرد.

مقادیر بازگشتی متدها

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

class ReturnExample {
  public static double square(double x) {
    return x * x;
  }
  
  public static boolean isEven(int x) {
    return x % 2 == 0;
  }
  
  public static void main(String[] args) {
    System.out.println(isEven(6));
    System.out.println(square(6));
  }
}
در اعلامیه متد ، آخرین کلمه قبل از نام متد، نوع مقدار بازگشتی را نشان می دهد. بنابراین می توانیم ببینیم که متد square مقادیری از نوع double برمی گرداند و isEven نیز مقادیر بولی برمی گرداند. هر متدی باید نوع بازگشتی خود را اعلام کند ، حتی اگر متدی مقدار بازگشتی نداشته باشد. به عنوان مثال ، تابعی برای کشیدن لبخند ممکن است اصلاً چیزی را برنگرداند ، بنابراین باید نوع بازگشتی void داشته باشد.

متد main مقدار بازگشتی void دارد

متد main با کلیدواژه های public static void اعلام می شود. void نشان می دهد که متد main مقداری را بر نمی گرداند. در C یا ++C ، متد main به طور سنتی یک عدد صحیح را برمی گرداند ، که به سیستم عامل نشان می دهد که آیا برنامه با موفقیت اجرا شده است یا خیر. خروج از برنامه با متد ()System.exit جاوا می تواند زودتر از موعد از برنامه خارج شود و موفقیت یا عدم موفقیت برنامه را با استفاده از متد ()System.exit برای سیستم عامل مشخص کند. حتی اگر به مقدار بازگشتی آن اهمیت ندهید ، System.exit به دلایل دیگری همچون رفع اشکال (دیباگ کردن) یا خاتمه دادن زودهنگام یک برنامه مفید است.
class HardStop {
  public static void main(String[] args) {
    System.out.println("Do or do not.");
    
    // force quit the program, making the code
    //  ۰ available to the operating system.
    //  (۰ traditionally indicates success.)
    System.exit(0);
    
    System.out.println("There is no try.");
  }

}
class CastParameter {
  public static void main(String[] args) {
    // This works, since the int 42 can be cast
    //  implicitly into a double:
    double x = Math.sqrt(42);
    
    System.out.println(x);
  }

}

امضای متدها و overload کردن آن ها

بعضی اوقات ، به متدی نیاز دارید که برای انواع مختلف پارامترها کار کند. احتمالاً حتی دوست دارید این متد برای انواع مختلف پارامترها کمی متفاوت عمل کند. در جاوا ، می توانید دو یا بیشتر متد مختلف با نام یکسان در یک کلاس تعریف کنید، به شرط آنکه این متدها انواع مختلفی از پارامترها داشته باشند. در اینجا یک مثال آورده شده است:
class Overload {
  
  public static void printMyFavoriteNumber(int x) {
    System.out.println("My favorite number is the integer " + x);
  }
  
  public static void printMyFavoriteNumber(double x) {
    System.out.println("My favorite number is the double " + x);
  }
  
  public static void main(String[] args) {
    printMyFavoriteNumber(42);
    printMyFavoriteNumber(3.1415);
  }
  
}
نام یک متد، همراه با نوع پارامترهای آن با ترتیب هایشان ، امضای متد نامیده می شود. نام پارامترها بخشی از امضای متد نیستند ، بنابراین شما نمی توانید دو متد با یک نام تعریف کنید که از پارامترهایی با نوع های مشابه استفاده کنند ، حتی اگر پارامترها نام های مختلفی داشته باشند. چرا؟ وقتی متد فراخوانی می شود ، جاوا نوع و ترتیب آرگومان های ارائه شده برای فراخوانی را می داند و می تواند با استفاده از آنها تعیین کند که کدام یک از متد های overload شده مورد نظر بوده است. اما جاوا نمی تواند نام پارامترهای مورد نظر را از مقادیر یا نوع آرگومان های ارائه شده برای فراخوانی تشخیص دهد. به عبارت دیگر در زمان فراخوانی متدها ما نام آرگمان ها را مشخص نمی کنیم. به دلایل مشابه ، از نوع بازگشتی متد که در ادامه خواهیم دید ، نمی توان برای overload کردن متد استفاده کرد.

مقادیر بازگشتی متدها

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

class ReturnExample {
  public static double square(double x) {
    return x * x;
  }
  
  public static boolean isEven(int x) {
    return x % 2 == 0;
  }
  
  public static void main(String[] args) {
    System.out.println(isEven(6));
    System.out.println(square(6));
  }
}
در اعلامیه متد ، آخرین کلمه قبل از نام متد، نوع مقدار بازگشتی را نشان می دهد. بنابراین می توانیم ببینیم که متد square مقادیری از نوع double برمی گرداند و isEven نیز مقادیر بولی برمی گرداند. هر متدی باید نوع بازگشتی خود را اعلام کند ، حتی اگر متدی مقدار بازگشتی نداشته باشد. به عنوان مثال ، تابعی برای کشیدن لبخند ممکن است اصلاً چیزی را برنگرداند ، بنابراین باید نوع بازگشتی void داشته باشد.

متد main مقدار بازگشتی void دارد

متد main با کلیدواژه های public static void اعلام می شود. void نشان می دهد که متد main مقداری را بر نمی گرداند. در C یا ++C ، متد main به طور سنتی یک عدد صحیح را برمی گرداند ، که به سیستم عامل نشان می دهد که آیا برنامه با موفقیت اجرا شده است یا خیر. خروج از برنامه با متد ()System.exit جاوا می تواند زودتر از موعد از برنامه خارج شود و موفقیت یا عدم موفقیت برنامه را با استفاده از متد ()System.exit برای سیستم عامل مشخص کند. حتی اگر به مقدار بازگشتی آن اهمیت ندهید ، System.exit به دلایل دیگری همچون رفع اشکال (دیباگ کردن) یا خاتمه دادن زودهنگام یک برنامه مفید است.
class HardStop {
  public static void main(String[] args) {
    System.out.println("Do or do not.");
    
    // force quit the program, making the code
    //  ۰ available to the operating system.
    //  (۰ traditionally indicates success.)
    System.exit(0);
    
    System.out.println("There is no try.");
  }

}
class MethodParameters {

  public static void printMyNumber(int x) {
    System.out.println("My favorite number is " + x + ".");
  }
  
  public static void main(String[] args) {
    printMyNumber(42);
 
  }   
}
پارامترها ، متغیرهای محلی متد هستند. در تعریف متد printMyNumber(int x) ، کد int x یک متغیر جدید int به نام x اعلان می کند. وقتی متد به صورت printMyNumber(42) فراخوانی می شود ، مقدار ۴۲ در متغیر x کپی می شود و سپس کد printMyNumber اجرا می شود. اما اگر متد printMyNumber را با متغیر double فراخوانی کنید چه اتفاقی می افتد؟ کامپایلر متوجه می شود که شما در حال ارسال مقداری از نوع double هستید و دقت متغیر int است. کامپایلر به شما پیام خطا می دهد و عملیات کامپایل را متوقف می کند. اگر می خواهید بخش اعشاری double را حذف کنید و آن را تحویل دهید ، به راحتی می توانید با cast کردن به کمک عملگر (int) این کار را انجام دهید. توجه کنید که در این حالت عدد را گرد نکرده اید و عددی مثل ۷۷.۹۹ تبدیل به عدد ۷۷ می شود. از طرف دیگر ، اگر متدی دارید که پارامتری از نوع double دارد ، می توانید آن را با آرگمان int فراخوانی کنید. جاوا متوجه می شود و تبدیل را به صورت خودکار برای شما انجام می دهد چون این تبدیل برخلاف مورد قبلی باعث کاهش دقت نمی شود: در اینجا عملیات cast به صورت ضمنی انجام می شود. مثلاً:
class CastParameter {
  public static void main(String[] args) {
    // This works, since the int 42 can be cast
    //  implicitly into a double:
    double x = Math.sqrt(42);
    
    System.out.println(x);
  }

}

امضای متدها و overload کردن آن ها

بعضی اوقات ، به متدی نیاز دارید که برای انواع مختلف پارامترها کار کند. احتمالاً حتی دوست دارید این متد برای انواع مختلف پارامترها کمی متفاوت عمل کند. در جاوا ، می توانید دو یا بیشتر متد مختلف با نام یکسان در یک کلاس تعریف کنید، به شرط آنکه این متدها انواع مختلفی از پارامترها داشته باشند. در اینجا یک مثال آورده شده است:
class Overload {
  
  public static void printMyFavoriteNumber(int x) {
    System.out.println("My favorite number is the integer " + x);
  }
  
  public static void printMyFavoriteNumber(double x) {
    System.out.println("My favorite number is the double " + x);
  }
  
  public static void main(String[] args) {
    printMyFavoriteNumber(42);
    printMyFavoriteNumber(3.1415);
  }
  
}
نام یک متد، همراه با نوع پارامترهای آن با ترتیب هایشان ، امضای متد نامیده می شود. نام پارامترها بخشی از امضای متد نیستند ، بنابراین شما نمی توانید دو متد با یک نام تعریف کنید که از پارامترهایی با نوع های مشابه استفاده کنند ، حتی اگر پارامترها نام های مختلفی داشته باشند. چرا؟ وقتی متد فراخوانی می شود ، جاوا نوع و ترتیب آرگومان های ارائه شده برای فراخوانی را می داند و می تواند با استفاده از آنها تعیین کند که کدام یک از متد های overload شده مورد نظر بوده است. اما جاوا نمی تواند نام پارامترهای مورد نظر را از مقادیر یا نوع آرگومان های ارائه شده برای فراخوانی تشخیص دهد. به عبارت دیگر در زمان فراخوانی متدها ما نام آرگمان ها را مشخص نمی کنیم. به دلایل مشابه ، از نوع بازگشتی متد که در ادامه خواهیم دید ، نمی توان برای overload کردن متد استفاده کرد.

مقادیر بازگشتی متدها

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

class ReturnExample {
  public static double square(double x) {
    return x * x;
  }
  
  public static boolean isEven(int x) {
    return x % 2 == 0;
  }
  
  public static void main(String[] args) {
    System.out.println(isEven(6));
    System.out.println(square(6));
  }
}
در اعلامیه متد ، آخرین کلمه قبل از نام متد، نوع مقدار بازگشتی را نشان می دهد. بنابراین می توانیم ببینیم که متد square مقادیری از نوع double برمی گرداند و isEven نیز مقادیر بولی برمی گرداند. هر متدی باید نوع بازگشتی خود را اعلام کند ، حتی اگر متدی مقدار بازگشتی نداشته باشد. به عنوان مثال ، تابعی برای کشیدن لبخند ممکن است اصلاً چیزی را برنگرداند ، بنابراین باید نوع بازگشتی void داشته باشد.

متد main مقدار بازگشتی void دارد

متد main با کلیدواژه های public static void اعلام می شود. void نشان می دهد که متد main مقداری را بر نمی گرداند. در C یا ++C ، متد main به طور سنتی یک عدد صحیح را برمی گرداند ، که به سیستم عامل نشان می دهد که آیا برنامه با موفقیت اجرا شده است یا خیر. خروج از برنامه با متد ()System.exit جاوا می تواند زودتر از موعد از برنامه خارج شود و موفقیت یا عدم موفقیت برنامه را با استفاده از متد ()System.exit برای سیستم عامل مشخص کند. حتی اگر به مقدار بازگشتی آن اهمیت ندهید ، System.exit به دلایل دیگری همچون رفع اشکال (دیباگ کردن) یا خاتمه دادن زودهنگام یک برنامه مفید است.
class HardStop {
  public static void main(String[] args) {
    System.out.println("Do or do not.");
    
    // force quit the program, making the code
    //  ۰ available to the operating system.
    //  (۰ traditionally indicates success.)
    System.exit(0);
    
    System.out.println("There is no try.");
  }

}
در این جلسه می آموزید که چگونه متدها و نوع پارامترهای ورودی آنها و نوع مقدار بازگشتی آنها را در جاوا اعلان کنید. مانند توابع C ، Python و Javascript ، یک متد در جاوا ممکن است پارامترهایی را بگیرد و یک مقدار واحد را برگرداند. هرچند مقدار بازگشتی باید یک مقدار واحد باشد و نمی توان چند مقدار را در یک فراخوانی متد برگرداند، این مقدار واحد ممکن است اشاره گری به یک لیست ، یک شی (object) یا آرایه ای باشد که حاوی مقادیر دیگری است. همانطور که تمام مقادیر در جاوا باید دارای نوع ثابتی باشند ، اعلامیه های متد نیز باید نوع پارامترهای ورودی و مقدار بازگشتی را مشخص کند.

پارامترهای متد

در زیر مثالی می بینید از نحو (syntax) برای اعلان متدی در جاوا که پارامترهایی را می گیرد:
class MethodParameters {

  public static void printMyNumber(int x) {
    System.out.println("My favorite number is " + x + ".");
  }
  
  public static void main(String[] args) {
    printMyNumber(42);
 
  }   
}
پارامترها ، متغیرهای محلی متد هستند. در تعریف متد printMyNumber(int x) ، کد int x یک متغیر جدید int به نام x اعلان می کند. وقتی متد به صورت printMyNumber(42) فراخوانی می شود ، مقدار ۴۲ در متغیر x کپی می شود و سپس کد printMyNumber اجرا می شود. اما اگر متد printMyNumber را با متغیر double فراخوانی کنید چه اتفاقی می افتد؟ کامپایلر متوجه می شود که شما در حال ارسال مقداری از نوع double هستید و دقت متغیر int است. کامپایلر به شما پیام خطا می دهد و عملیات کامپایل را متوقف می کند. اگر می خواهید بخش اعشاری double را حذف کنید و آن را تحویل دهید ، به راحتی می توانید با cast کردن به کمک عملگر (int) این کار را انجام دهید. توجه کنید که در این حالت عدد را گرد نکرده اید و عددی مثل ۷۷.۹۹ تبدیل به عدد ۷۷ می شود. از طرف دیگر ، اگر متدی دارید که پارامتری از نوع double دارد ، می توانید آن را با آرگمان int فراخوانی کنید. جاوا متوجه می شود و تبدیل را به صورت خودکار برای شما انجام می دهد چون این تبدیل برخلاف مورد قبلی باعث کاهش دقت نمی شود: در اینجا عملیات cast به صورت ضمنی انجام می شود. مثلاً:
class CastParameter {
  public static void main(String[] args) {
    // This works, since the int 42 can be cast
    //  implicitly into a double:
    double x = Math.sqrt(42);
    
    System.out.println(x);
  }

}

امضای متدها و overload کردن آن ها

بعضی اوقات ، به متدی نیاز دارید که برای انواع مختلف پارامترها کار کند. احتمالاً حتی دوست دارید این متد برای انواع مختلف پارامترها کمی متفاوت عمل کند. در جاوا ، می توانید دو یا بیشتر متد مختلف با نام یکسان در یک کلاس تعریف کنید، به شرط آنکه این متدها انواع مختلفی از پارامترها داشته باشند. در اینجا یک مثال آورده شده است:
class Overload {
  
  public static void printMyFavoriteNumber(int x) {
    System.out.println("My favorite number is the integer " + x);
  }
  
  public static void printMyFavoriteNumber(double x) {
    System.out.println("My favorite number is the double " + x);
  }
  
  public static void main(String[] args) {
    printMyFavoriteNumber(42);
    printMyFavoriteNumber(3.1415);
  }
  
}
نام یک متد، همراه با نوع پارامترهای آن با ترتیب هایشان ، امضای متد نامیده می شود. نام پارامترها بخشی از امضای متد نیستند ، بنابراین شما نمی توانید دو متد با یک نام تعریف کنید که از پارامترهایی با نوع های مشابه استفاده کنند ، حتی اگر پارامترها نام های مختلفی داشته باشند. چرا؟ وقتی متد فراخوانی می شود ، جاوا نوع و ترتیب آرگومان های ارائه شده برای فراخوانی را می داند و می تواند با استفاده از آنها تعیین کند که کدام یک از متد های overload شده مورد نظر بوده است. اما جاوا نمی تواند نام پارامترهای مورد نظر را از مقادیر یا نوع آرگومان های ارائه شده برای فراخوانی تشخیص دهد. به عبارت دیگر در زمان فراخوانی متدها ما نام آرگمان ها را مشخص نمی کنیم. به دلایل مشابه ، از نوع بازگشتی متد که در ادامه خواهیم دید ، نمی توان برای overload کردن متد استفاده کرد.

مقادیر بازگشتی متدها

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

class ReturnExample {
  public static double square(double x) {
    return x * x;
  }
  
  public static boolean isEven(int x) {
    return x % 2 == 0;
  }
  
  public static void main(String[] args) {
    System.out.println(isEven(6));
    System.out.println(square(6));
  }
}
در اعلامیه متد ، آخرین کلمه قبل از نام متد، نوع مقدار بازگشتی را نشان می دهد. بنابراین می توانیم ببینیم که متد square مقادیری از نوع double برمی گرداند و isEven نیز مقادیر بولی برمی گرداند. هر متدی باید نوع بازگشتی خود را اعلام کند ، حتی اگر متدی مقدار بازگشتی نداشته باشد. به عنوان مثال ، تابعی برای کشیدن لبخند ممکن است اصلاً چیزی را برنگرداند ، بنابراین باید نوع بازگشتی void داشته باشد.

متد main مقدار بازگشتی void دارد

متد main با کلیدواژه های public static void اعلام می شود. void نشان می دهد که متد main مقداری را بر نمی گرداند. در C یا ++C ، متد main به طور سنتی یک عدد صحیح را برمی گرداند ، که به سیستم عامل نشان می دهد که آیا برنامه با موفقیت اجرا شده است یا خیر. خروج از برنامه با متد ()System.exit جاوا می تواند زودتر از موعد از برنامه خارج شود و موفقیت یا عدم موفقیت برنامه را با استفاده از متد ()System.exit برای سیستم عامل مشخص کند. حتی اگر به مقدار بازگشتی آن اهمیت ندهید ، System.exit به دلایل دیگری همچون رفع اشکال (دیباگ کردن) یا خاتمه دادن زودهنگام یک برنامه مفید است.
class HardStop {
  public static void main(String[] args) {
    System.out.println("Do or do not.");
    
    // force quit the program, making the code
    //  ۰ available to the operating system.
    //  (۰ traditionally indicates success.)
    System.exit(0);
    
    System.out.println("There is no try.");
  }

}

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا