استارت‌آپ و کارآفرینی

آموزش قدم به قدم جاوا – قسمت شانزدهم

میدان دید متغیرها (Variables Scope)

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

به کد زیر دقت کنید:

public static void main(String[] args) {
	for (int i = 0; i < 10; i++) {
		System.out.println(i);
	}
	System.out.println(i); // Error!
}

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

در جاوا چهار دسته متغیر داریم که با آن‌ها آشنا هستید:

متغیرهای نمونه (فیلدهای غیر استاتیک)

اشیاء مشخصات و حالات خود را در این نوع متغیرها نگهداری می‌کنند و مقدار این متغیرها برای هر شی منحصر به فرد است.

متغیرهای کلاس (فیلدهای استاتیک)

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

متغیرهای محلی (Local)

متغیرهایی که درون بلاک‌ها (متد، سازنده، حلقه‌ها و…) تعریف می شوند. هر بلاک با دو آکولاد باز و بسته {} مشخص می‌شود.

پارامترها

متغیرهایی که به عنوان ورودی یک متد تعریف می شوند پارامتر نام دارند.

قوانین میدان دید متغیرها

۱ – متغیرهای نمونه و متغیرهای کلاس در تمام قسمت‌های کلاس قابل دسترسی هستند.

۲ – متغیرهایی که درون یک بلاک (بین { و }) تعریف می‌شوند (متغیرهای محلی) فقط در همان بلاک قابل دسترسی هستند.

مثال:

public static void main(String[] args) {
	int x = 10;
	if (x > 5) {
		int y = 0;
	}
	System.out.println(y); // Error!
}

۳ – وقتی بلاک‌های تو در تو داشته باشیم متغیرهای بلاک های بیرونی برای بلاک‌های درونی قابل دسترسی هستند اما برعکس آن درست نیست.

مثال:

public static void main(String[] args) {
 for (int x = 0; x < 5; x++) {
     for (int y = 0; y < 3; y++) {
         System.out.println(x);
         System.out.println(y);
     }
 }
}

در این کد بلاک درونی (حلقه دوم) می‌تواند به متغیر شمارنده بلاک بیرونی خود (حلقه اول) که x است دسترسی داشته باشد اما در حلقه اول نمی‌توان به متغیر y یا هر متغیر دیگری که درون حلقه دوم تعریف شده دسترسی داشت.

۴ – متغیرهایی که به عنوان پارامترهای یک متد تعریف شده‌اند تنها در همان متد قابل دسترسی هستند.

۵ – اگر یک متغیر محلی داشته باشیم که نام آن با نام یکی از فیلدهای کلاس یکی باشد، متغیر محلی فیلد را مخفی (shadow) می کند و برای دسترسی به متغیر کلاس درون آن بلاک باید از this استفاده کنیم.

مثال:

public class Car {
	private int speed = 10;
	
	public void speedUp() {
		int speed = 50;
		System.out.println(speed); // Prints 50
		System.out.println(this.speed); // Prints 10
	}
}

 

3 نظرات
  1. iman313 می گوید

    سلام من تا فصل ۸ کتاب دایتل یعنی اتمام شی گرایی رو خوندم همچنین اموزش های شمارو تا قسمت ۱۶ دنبال کردم و یادگرفتم .
    حالا میتونم از خودم توقع داشته باشم برنامه های خوبی رو توی محیط console بنویسم ؟
    مشکلم اینه که چیزایی رو بلدم اما نمیتونم ازشون یه برنامه بنویسم و چیزی که توی ذهنم هست رو خلق کنم
    # این به خاطر کمی اطلاعاتم هست یا اینکه مشکل از کند ذهنی منه؟

    1. مصطفی نصیری می گوید

      سلام. ببینید کلا برنامه هایی که در محیط کنسول میشه نوشت خب خیلی محدودند. شما اگر یه برنامه خاص مد نظرته بهترین کار اینه که برنامه رو به اجزای کوچک تر تقسیم کنی و روی کاغذ بنویسی و بعد اون اجزا رو پیاده سازی کنی. البته همه اینا به شرطی جواب میده که شما دانش پیاده سازی قابلیت های برنامه مورد نظرتو داشته باشی وگرنه خب طبیعیه که اول باید اونا رو یاد بگیری بعد سراغ برنامه ساختن بری.

      1. iman 313 می گوید

        مرسی ممنون از راهنماییتون ایکاش وقتی کامنت من رو جواب دادین یه ایمیل به من زده میشد تا من متوجه شم . ابان جواب دادین اما من الان متوجه شدم !
        یا حق

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.