آموزش برنامه نویسی جاوا (بخش دهم: آرایه های دو بعدی و چند بعدی)

استاندارد

آرایه هایی که تاکنون بررسی میکردیم، فقط یک بعدی بودند. مثلا اگر آرایه ای که در بخش هشتم بررسی کردیم را مشاهده کنید، می بینید که به ازای هر سطر از آن جدول، یک مقدار وجود دارد. حال فرض کنید، بتوانیم در هر سطر یک آرایه یک بعدی دیگر قرار دهیم. پس اگر یک آرایه داشته باشیم که 5 سطر داشته باشد ( 5 خانه) و در هر خانه یک آرایه یک بعدی دیگر مثلا 6 سطر (6 خانه)، در واقع به تعداد 5*6=30 خانه آرایه داریم.

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

در شکل بالا، یک آرایه داریم که دارای 3 سطر و 4 ستون است. پس به تعداد 12 خانه، می توانیم مقدار بدهیم. مشاهده می کنید که مثلا خانه اول در سطر اول، با [0][0]a مشخص شده است. یا در سطر شماره 1 و ستون شماره 2 ، مکان آن خانه از آرایه با [2][1]a مشخص شده است.

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

int[] OurArray = new int[تعداد خانه ها];

حال اگر بخواهیم یک آرایه دو بعدی را تعریف نماییم، به صورت زیر عمل می کنیم:

int[][] OurArray = new int[تعداد خانه های بعد دوم][تعداد خانه های بعد اول];

در مثال بالا مشاهده می کنید که پس از تعریف نوع متغیر، از دو عدد [] استفاده نمودیم. این دو عدد مشخص می کند که آرایه ما دو بعدی است. در قسمت بعدی نام آرایه را مشخص می کنیم. سپس بعد از تساوی در سمت راست، عملگر new و دوباره نوع متغیر، و تعداد خانه های بعد اول و سپس تعداد خانه های بعد دوم را در داخل [] معرفی می کنیم.

پس در کد زیر، یک آرایه دو بعدی که در بعد اول، 5 خانه و در بعد دوم 6 خانه وجود دارد داریم.

int[][] OurArray = new int[5][6];

به زبانی دیگر 5 سطر و 6 ستون داریم. که به طور کلی 30 عدد خانه را می توان برای آرایه OurArray متصور شد.

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

ستون سوم ستون دوم ستون اول
فدایی میرزایی طاهری سطر اول (اداری)
ذبیحی کریمی موسوی سطر دوم (مالی)
قلزم رجبی اصغری سطر سوم (خدماتی)
قیصری برومند فاطمی سطر چهارم (مدیران)

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

ابتدا یک آرایه دو بعدی که در بعد اول دارای 4 خانه و در بعد دوم 3 خانه دارد ، از نوع رشته (String) معرفی می کنیم.

String[][] Edare = new String [4][3];

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

Edare[0][0]="طاهری";
Edare[0][1]="میرزایی";
Edare[0][2]="فدایی";

Edare[1][0]="موسوی";
Edare[1][1]="کریمی";
Edare[1][2]="ذبیحی";

Edare[2][0]="اصغری";
Edare[2][1]="رجبی";
Edare[2][2]="قلزم";

Edare[3][0]="فاطمی";
Edare[3][1]="برومند";
Edare[3][2]="قیصری";

مشاهده می کنید که ابتدا خانه های سطر اول، که در بعد اول از آرایه یعنی خانه شماره 0، را مقدار دهی کردیم. سپس خانه های سطر دوم و …

شیوه دیگر مقدار دهی چیزی شبیه به شیوه مقدار دهی دومی که در بخش آرایه یک بعدی تعریف نمودیم، است.  مثلا فرض کنید بخواهیم در سطر اول اعداد 1 تا 3 و در سطر دوم اعداد 4 تا 6 را معرفی کنیم.

به صورت زیر عمل می کنیم:

int [][] Array2bodi = {{1,2,3},{4,5,6}};

دقت کنید که یک کروشه کلی در قسمت سمت راست وجود دارد که در داخل آن دو کروشه دیگر که با ویرگول، از هم جدا شده اند نیز وجود دارد. هر کدام از آن کروشه ها دارای سه مقدار هستند. پس در بعد اول از آرایه بالا، 2 خانه و در بعد دوم از آرایه بالا 3 خانه وجود دارند که با اعداد 1 تا 3 و 4 تا 6 مقداری دهی شده است.

آرایه دو بعدی و حلقه For

اگر بخواهیم آرایه بالا را در خروجی چاپ کنیم به چه صورت عمل می کنیم؟

می توان با یک حلقه For تو در تو این کار را به سادگی انجام داد. از آنجاییکه آرایه بالا دو بعدی است، پس یک حلقه For تو در تو دوتایی لازم داریم.

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

int [][] Array2bodi = {{1,2,3},{4,5,6}};

	for(int i=0;i<2;i++)
		for(int j=0;j<3;j++)
			System.out.print(Array2bodi[i][j]);

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

123456

آرایه سه بعدی و بالاتر

اگر کار با آرایه دو بعدی را به خوبی یاد گرفته باشید، می توانید آرایه سه بعدی و بالاتر را نیز به آسانی یاد بگیرید.

یک آرایه سه بعدی به صورت زیر تعریف می شود:

int [][][] Array3bodi = new int [تعداد خانه های بعد سوم][تعداد خانه های بعد دوم][تعداد خانه های بعد اول];

برای محاسبه تعداد کل خانه ها کافی است که تعداد خانه های هر بعد را در هم ضرب کنید.

مثلا آرایه سه بعدی زیر را در نظر بگیرید.

int [][][] Array3bodi = new int [5][4][3];

آرایه بالا، در واقع دارای 5*4*3 خانه یعنی 60 خانه می باشد.

اگر بخواهیم یک آرایه چهار بعدی تعریف کنیم نیز می توان یک بعد اضافی تعریف نمود.

برای مثال آرایه زیر یک آرایه چهار بعدی است که در بعد اول دارای 5 خانه، در بعد دوم 4 خانه و در بعد سوم ، 3 خانه، در بعد چهارم 6  خانه دارد.

int [][][][] Array4bodi = new int [5][4][3][6];

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

آموزش برنامه نویسی جاوا (بخش نهم: کار با آرایه ها در جاوا)

استاندارد

آرایه ها و حلقه در جاوا

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

ولی اگر مقادیر، زیاد باشند باید چی کار کنیم؟ اگر اعدادی که می خواهیم به یک آرایه اختصاص دهیم زیاد باشند، استفاده از روش های قبلی کاری سخت است.

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

public class Main {
	public static void main(String[] args) {

			int[] OurArray;
			OurArray = new int[30];
			for(int i=0;i<OurArray.length;i++){
				OurArray[i]= i+1;
				System.out.print(OurArray[i]);		
			}
	}
}

اگر دقت کنید متوجه می شوید که در شرط for ، این حلقه تا مقدار OurArray.length می چرخد. یعنی OurArray.length در واقع طول یا تعداد خانه های آرایه ما را مشخص می کند.

Length یک ویژگی از آبجکت های array می باشد که می توانید برای به دست آوردن اندازه ی array از آن استفاده کنید ( تعداد موقعیت هایی که دارد). بنابراین، زمانی که مقدار در متغیر i کمتر از اندازه ی array می باشد، این loop به چرخش متداول خود ادامه خواهد داد.

 این کد باعث می شود که تمام 30 خانه ی آرایه ما با استفاده از حلقه پر شود. و شماره های 1 تا 30 به آن داده می شود.

بدیهی است که اگر می خواستیم شماره های دیگری می توانستیم به آن بدهیم. ولی اگر شماره هایی که در یک آرایه پر می شود از الگوی خاصی پیروی نکند، مجبوریم همانند بخش قبلی آن ها را دستی پر کنیم.

مرتب سازی آرایه ها در جاوا

متودهای داخلی دیگر جاوا به شما اجازه می دهند تا array های خود را مرتب سازید. برای استفاده از متود مرتب سازی array ها، ابتدا نیاز به مراجعه به یک کتابخانه ی جاوا به نام Arrays دارید. شما این کار را با عبارت import انجام می دهید.

عبارت import زیر را اضافه کنید (بالای کلاس Main):

import java.util.Arrays;

فرض کنیم کد جاوای ما به صورت زیر باشد:

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {

			int[] OurArray;
			OurArray = new int[7];
			OurArray[0]=5;
			OurArray[1]=3;
			OurArray[2]=9;
			OurArray[3]=8;
			OurArray[4]=7;
			OurArray[5]=1;
			OurArray[6]=2;

	}
}

آرایه OurArray با اعداد بالا پر شده است که اگر طبق کد زیر خروجی Print از آن بگیریم

for(int i=0;i<OurArray.length;i++){
    System.out.print(OurArray[i]);
			}

خروجی زیر را مشاهده می کنیم:

5398712

اعداد بالا خانه های پر شده ی آرایه را به ما نشان می دهند.

کد زیر که از همان کتابخانه ای که آن را Import کرده بودیم، آمده است، آرایه ما را مرتب می کند.

Arrays.sort(OurArray);

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

1235789

آموزش برنامه نویسی جاوا (بخش هشتم: آرایه ها در جاوا)

استاندارد

در ابتدا به این سوال پاسخ می دهیم که یک array چیست؟

تاکنون با متغیرهایی کار کردید که فقط یک مقدار را در خود حفظ می کنند. متغیرهای صحیح که تنظیم می کردیم، فقط یک عدد را حفظ می کنند و متغیرهای رشته نیز فقط یک رشته از متن را در خود دارند.

یک array (ردیف) ، روشی برای حفظ بیشتر از یک مقدار در یک زمان می باشد که در واقع شبیه لیستی از آیتم ها می باشد. یک array را می توان به عنوان ستون هایی در یک صفحه ی گسترده در نظر گرفت. در واقع آرایه یک سری خانه را که پشت سر هم قرار گرفته اند مشخص می کند. به آن ها فضا می دهد. این فضا بر اساس نوع متغیر آرایه شما است.

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

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

 

array value row
8 0
4 1
6 2
5 3
2 4

همان طور که در جدول بالا مشاهده می کند، آرایه برای هر ردیف، یک مقدار عددی دارد. هر ردیف با یک شماره عددی مشخص می شود که مقدار آن در ستون رو به روی آن نوشته شده است. در جدول بالا، مشاهده می کنید که ردیف ها از شماره 0 شروع شده و تا شماره 4 ادامه دارد.

حال بیایید آرایه ای که در جدول بالا مشاهده می کنید را به صورت کد جاوا بنویسیم. آرایه بالا عدد است پس ما هم یک متغیر عددی از نوع int اعلام می کنیم. ولی تنها تفاوتی که متغیر int ی که قبلا معرفی کردیم، وجود دارد اینست که یک جفت کروشه پس از int می نویسیم.

مثال:

int[] OurArray;

ولی آرایه جدولی ما در بالا، 4 سطر بیش تر ندارد. پس دستور بالا فقط به کامپایلر می گوید که ما قصد تنظیم یک array از نوع عدد صحیح (int) را داریم. این خط تعداد موقعیت هایی را که array باید حفظ کند، اعلام نمی کند. برای انجام کاری که گفته شد، باید یک array object جدید تنظیم کنیم. همانند چیزی که برای تعریف شی از یک نوع کلاس در بخش قبلی دیدیم.

برای مشخص کردن تعداد موقعیت های آرایه به ترتیب زیر عمل می کنیم:

OurArray = new int[5];

شما با نام array شروع کرده اید که با علامت تساوی دنبال می شود. پس از علامت تساوی به لغت کلیدی new و سپس مجددا نوع داده ی خود، نیاز دارید. پس از نوع داده یک جفت کروشه قرار می گیرد. بین کروشه ها نیاز به اندازه ی array دارید. اندازه در واقع تعداد موقعیت هایی است که array باید حفظ کند.

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

int[] OurArray = new int[5];

عدد 5 معرف تعداد خانه های آرایه است. یعنی ما 5 خانه داریم که از شماره 0 تا 4 هستند. دقت نمایید که شماره 5 قابل استفاده نیست.

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

از آنجایی که ما یک array مقدار صحیح تنظیم کرده ایم، مقادیر پیش فرض برای همه ی 5 موقعیت 0 خواهد بود.

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

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

OurArray[0]=8;

برای مقدار دادن به بقیه سطرها یا خانه های آرایه نیز به همین ترتیب عمل می کنیم:

OurArray[1]=4;
OurArray[2]=6;
OurArray[3]=5;
OurArray[4]=2;

روش دیگر مقدار دهی به آرایه به صورت زیر است:

int OurArray2[]={5,4,8,6};

این نوع تعریف به صورت اتوماتیک خودش تعداد خانه های آرایه را تعیین می کند. که در مثال بالا همانند اینست در واقع [3]OurArray2 است. یعنی 4 خانه که از شماره 0 تا سه هستند.

این متود در حال تنظیم یک array با استفاده از کروشه ها بعد از علامت تساوی، می باشد. در بین کروشه ها مقادیری را تایپ می کنید که array خواهد گرفت. اولین مقدار در موقعیت 0 و دومین مقدار در موقعیت 1 و غیره خواهد بود. توجه داشته باشید که هنوز پس از int نیاز به کروشه دارید، اما نیازی به لغت کلیدی new یا تکرار نوع داده و یا کروشه ها ندارید.

می توانید یک آرایه از انواع متغیرهای دیگر نیز تعریف نمایید. مثلا برای متغیر String می توان آرایه ای شبیه به زیر را تعریف نمود و سپس مقدار دهی کرد:

String month[]={"mehr","aban","azar","dey","bahman","esfand"};

با استفاده از تعریف بالا یک آرایه با تعداد 6 خانه که از شماره 0 تا 5 هستند، معرفی شده و سپس مقدار دهی می شود.

برای گرفتن خروجی از آرایه به سادگی میتوانید با مشخص کردن خانه آن آرایه، از آن خروجی بگیرید.

System.out.print(month[4]);

کد بالا خروجی “bahman” را چاپ می کند، زیرا به خانه شماره 4 آرایه اشاره می کند.

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

استاندارد

کلاس هسته اصلی جاوا است. کلاس یک ساختار منطقی است که تمامیت زبان جاوا بر آن استوار شده ، زیرا شکل (Shape) و طبیعت یک شی را روشن می کند. کلاس همچنین شکل دهنده اساس برنامه نویسی شی ئ گرا در جاوا می باشد.

هر مفهومی که مایلید در یکد برنامه جاوا پیاده سازی نمایید باید ابتدا داخل یک کلاس کپسول سازی شود. از این پس می آموزید چگونه یک کلاس را برای تولید اشیا استفاده کنید. همچنین درباره روشها (methods) و سازنده ها (constructors) و وازه کلیدی this ، مطالبی می آموزید.

کلاسهای تولید شده در بحثهای گذشته فقط برای کپسول سازی روش ()main ، استفاده می شد، که برای نشان دادن اصول دستور زبان جاوا مناسب بودند.

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

بنابراین، یک کلاس قالبی (template)، برای یک شی است. و یک شی نمونه ای از یک کلاس است. به شی، object نیز می گویند. که می توان کلمه نمونه (instance) را نیز برای آن به کار برد.

شکل عمومی یک کلاس

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

بعدا می بینیم که کد یک کلاس، رابط آن به داده های همان کلاس را توصیف می کند.

یک کلاس را با واژه کلیدی Class اعلام می کنند. کلاس ها می توانند بسیار ساده و یا خیلی پیچیده باشند.

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

type methodname2(parameter-list ){
// body of method
}
//...
type methodnameN(parameter-list ){
// body of method
}

داده یا متغیرهایی که داخل یک کلاس تعریف شده اند را متغیرهای نمونه (instance variables) می گویند. کدها نیز داخل روش ها (methods) قرار می گیرند.

روشها و متغیرهای تعریف شده داخل یک کلاس را اعضای (members) یک کلاس می نامند.

در اکثر کلاسها، متغیرهای نمونه یا روی روشهای تعریف شده برای آن کلاس عمل کرده یا توسط این روشها مورد دسترسی قرار می گیرند. بنابراین، روشها تعیین کننده چگونگی استفاده از داده های یک کلاس هستند.

متغیرهای تعریف شده داخل یک کلاس، متغیرهای نمونه خوانده شده زیرا هر نمونه از کلاس ( یعنی هر شی، یک کلاس ) شامل کپی خاص خودش از این متغیرهاست. بنابراین داده مربوط به یک شی، جدا و منحصر بفرد از داده مربوط به شی دیگری است. ما بزودی این نکته را بررسی خواهیم نمود، اما فعلا باید این نکته بسیار مهم را بیاد داشته باشید. کلیه روش ها نظیر ()main ، همان شکل عمومی را دارند که تاکنون استفاده کرده ایم. اما اکثر روش ها را به عنوان static یا public توصیف نمی کنند.

بررسی خود را با یک نمونه ساده از کلاسها شروع می کنیم. در اینجا کلاسی تحت عنوان Box وجود دارد که سه متغیر نمونه را تعریف می کند: Width , Height , Depth

class Box {
double width;
double height;
double depth;
}

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

Box mybox = new Box(); // create a Box object called mybox

پس از اجرای این دستور ، mybox نمونه ای از کلاس Box خواهد بود. بدین ترتیب، هر شی Box در برگیرنده کپی های خود از متغیرهای نمونه width, height,depth می باشد.

برای دسترسی به این متغیرها از عملگر نقطه (.) استفاده می کنید. عملگر نقطه، نام یک شی را با نام یک متغیر نمونه پیوند می دهد. بعنوان مثال ، برای منتسب کردن مقدار 100 به متغیر width در mybox، از دستور زیر استفاده نمایید:

mybox.width = 100;

این دستور به کامپایلر می گوید که کپی width که داخل شی mybox قرار گرفته است، را معادل 100 قرار بدهد.

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

حال در اینجا برنامه ای را مشاهده می کنید که از کلاس Box استفاده کرده است:

/* A program that uses the Box class.
Call this file BoxDemo.java
/*
class Box {
double width;
double height;
double depth;
}
// This class declares an object of type Box.
class BoxDemo {
public static void main(String args[] ){
Box mybox = new Box();
double vol;
// assign values to mybox's instance variables
mybox.width = 10;
mybox.height = 20;
mybox.depth = 15;
// compute volume of box
vol = mybox.width * mybox.height * mybox.depth;
System.out.println("Volume is " + vol);
}
}

فایلی را که دربرگیرنده این برنامه است باید با نام BoxDemo.java بخوانید. زیرا روش ()main در کلاس BoxDemo و نه در کلاس Box قرار گرفته است. هنگامیکه این برنامه را کامپایل می کنید، می بینید که دو فایل .class ایجاد شده است. یکی برای Box و دیگری برای BoxDemo . کامپایلر جاوا به طور خودکار، هر کلاس را در فایل .class مربوط به خودش، قرار می دهد. ضرورتی ندارد که هر دو کلاس Box و BoxDemo در یک فایل منبع قرار بگیرند. می توانید هر کلاس را در فایل خاص خودش گذاشته و آنها را به ترتیب Box.java و BoxDemo.java بنامید. برای اجرای این برنامه باید BoxDemo.class را اجرا کنید. پس از این کار، حاصل زیر به دست می آید:

Volume is 3000

 

قبلا هم گفتیم که هر شی ئ دارای کپی های خاص خودش از متغیرهای نمونه است. یعنی اگر دو شی Box داشته باشید، هرکدام  نسخه ای از width,height,lenght خواهند داشت. تغییرات در متغیرهای نمونه یک شی به تغییرات در متغیرهای نمونه شی دیگر، اثر نمی گذارد.

خلاصه:

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

class car{
int height;
int lenght;
string model;
string color;
bool dande;
}

در کلاس car که در بالا معرفی نمودیم، ما ارتفاع و طول ماشین، مدل و رنگ و دنده ای بودن یا اتوماتیک بودن ماشین را برای قالب کلاس تعریف نمودیم. دقت کنید که می توان از متغیرهای مختلف برای قالب کلاس، استفاده کرد.

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

car car1 = new car();
car car2 = new car();

برای مقدار دهی به شی car1 و شی car2 به ترتیب زیر عمل می کنیم:

car1.height=100;
car1.lenght=250;
car1.model="pride";
car1.color="white";
car1.dande=true;

car2.height=120;
car2.lenght=280;
car2.model="206";
car2.color="black";
car2.dande=false;

دقت نمایید که car1 شی ای با خصوصیات خودش، و car2 شی ای با خصوصیات دیگری نیز می باشد که این دو ارتباطی با هم ندارند به حز این که هر دو از قالب کلاس car استفاده می نمایند.

آموزش برنامه نویسی جاوا (بخش ششم: عبارات شرطی در جاوا)

استاندارد

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

در این بخش در مورد عبارات شرطی در جاوا صحبت می کنیم. شرط ها در برنامه نویسی به گونه ای هستند که اجازه ی اجرای یک قسمت از کد را می دهند.

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

عبارت شرطی IF

یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری کلی آن مانند کد زیر است.

if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}

عبارتی که در بالا چک می شود ( Boolean expression ) ، اگر درست باشد (true) کد داخل Block اجرا می شود و در غیر این صورت این کد اجرا نخواهد شد و برنامه از قسمت if می گذرد و به سراغ کدهای بعدی می رود.

عبارت شرطی if یکی از پرکاربردترین دستورات در زبانهای برنامه نویسی است و کمک بسیاری به برنامه نویسان برای نوشتن اپلیکیشن هایشان می کند.

برای درک بهتر if به مثال زیر توجه فرمایید:

public class Main {
	public static void main(String[] args) {

		int Temp= 32;
		if(Temp>30)
			System.out.print("hot");

	}
}

این کد، خروجی زیر را چاپ می کند:

hot

در کد بالا چون عبارت Temp>30 درست (true) است، پس کد داخل if اجرا می شود. دقت نمایید که از آنجاییکه کد بعد از if یک خط است می توان از بلاک استفاده ننمود.

عبارت شرطی if-else

در دستور if-else اگر عبارت boolean expression درست باشد، کد داخل if و در غیر این صورت کد داخل else اجرا می شود.

شکل نوشتاری کد دستور if-else به صورت زیر است:

if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}

در کد مثال بالا می توانیم بگوییم که اگر Temp>30 نباشد، کدهای دیگری اجرا شوند.

public class Main {
	public static void main(String[] args) {

		int Temp= 16;
		if(Temp>30)
			System.out.print("hot");
		else
			System.out.print("cold");

	}
}

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

cold

در کد بالا از آنجاییکه دستور Temp>30 عبارت false را بر میگرداند پس دستور if اجرا نمی شود و دستورات else اجرا می شوند.

نکته:

می توان از دستورات if-else به صورت چندتایی استفاده نمود. بدین صورت که در داخل هر if-else شرطی مخصوص به خودش وجود داشته باشد که اگر آن شرط درست باشد، کدهای مربوطه اجرا شوند. برای درک بهتر به مثال زیر توجه فرمایید:

public class Main {
	public static void main(String[] args) {

		int Temp= 30;
		if(Temp==10)
			System.out.print("low");
		else if(Temp==20)
			System.out.print("medium");
		else if(Temp==30)
			System.out.print("high");
		else
			System.out.print("not found");

	}
}

خروجی عبارت بالا به صورت زیر است:

high

دقت نمایید که فقط دستور if-elseی که Temp را برابر با 30 چک میکرد درست بود.

دستورات if تو در تو

گفته شد که اگر شرط if درست باشد، کدهای داخل Block آن اجرا می شوند. حال می توان در داخل هر بلاکی که برای if می نویسیم یک کد به صورت if بنویسیم. و حتی داخل آن نیز ifی دیگر و به همین ترتیب.

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

if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}

فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند. برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود.

برای مثال if های تودرتو به کد زیر دقت کنید:

public class Main {
	public static void main(String[] args) {

		int i= 30;
		int j= 35;
		int k= 40;

		if(i==30)
			if(j==35)
				if(k==40)
					System.out.print("40");
				else
					System.out.print("not 40");
			else
				System.out.print("not 35");
		else
			System.out.print("not 30");

	}
}

خروجی مثال بالا 40 است. زیرا سه if را با موفقیت پشت سر گذاشته است.

در مثال بالا می توانید با بازی با اعدادی که برای متغیرهای i و j و k انتخاب کرده ایم با این ساختار آشنا شوید.

َشرط Switch

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

شکل نوشتاری ان شرط به شکل زیر است:

switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}

نکاتی که برای استفاده در شرط Switch باید رعایت کنید عبارت است از :

  • در داخل سوییچ فقط می تواند اعداد، کاراکترها و enum ها (بعدا توضیح می دهیم) وجود داشته باشد.
  • بعد از کلمه کلیدی case و مقدار متغیر از علامت دو نقطه (:) باید استفاده کنید.
  • می توانید هر تعدادی که case بخواهید در داخل switch معرفی نمایید.
  • نوع داده ای که به case می دهیم باید با نوع داده Switch یکی باشد.
  • دستور case مانند if عمل می کند به طوری که هر زمان مقدار هر case درست باشد، کدهای مربوط به آن تا خط break اجرا می شوند.
  • هر switch می تواند بخشی به نام default داشته باشد و هدف از این بخش آنست که اگر هیچ کدام از case ها اجرا نشوند، switch به سراغ default رفته و قسمت Default را در نظر می گیرد.
  • کد Break از کل switch خارج می کند.

کد Break اختیاری است، به همین دلیل اگر در یک case از break استفاده نکنید، پس از اتمام کدهای داخل آن case ، برنامه به سراغ case بعدی می رود و اگر شرط آن نیز درست بود به همین ترتیب ادامه می دهد. پس باید برای خروج از switch به طور کامل از دستور break استفاده نمود.

به مثال زیر توجه فرمایید:

public class Main {
	public static void main(String[] args) {

		char ch= 'b';

		switch(ch){

		    case 'a':
				System.out.print("a");
				break;
		    case 'b':
			    System.out.print("b");
			    break;
			case 'c':
				System.out.print("c");
				break;

		}

	}
}

خروجی برنامه بالا b می باشد. دقت نمایید که هر case متغیر char را بررسی می کند. که این متغیر همانی است که در Switch نوشته شده است.

آموزش برنامه نویسی جاوا (بخش پنجم: عبارات کنترل کننده حلقه ها)

استاندارد

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

دستور Break

دستور break در زبان جاوا دو کاربرد دارد.

  1. وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
  2. در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.

این دستور در واقع فقط یک کلمه است که به شکل زیر نوشته می شود:

Break;

برای مثال می توانید کد زیر را ببینید:

public static void main(String[] args) {

	      for(int i=1;i<50;i=i+1){
	         System.out.print("i is : " + i );
	       if(i==6)
			   break;
	         System.out.print("\n");
	      }
	}

خروجی کد بالا به شرح زیر است:

i is : 1
i is : 2
i is : 3
i is : 4
i is : 5
i is : 6

در حلقه بالا گفتیم که وقتی i برابر 6 شد، از حلقه خارج (Break) شو.

دستور continue

دستور Continue در همه حلقه ها قابل استفاده است. و کاربرد آن بدین صورت است که در هرجای حلقه که این دستور وجود داشته باشد، ادامه اجرا لغو و به ابتدای حلقه برمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:

continue;

برای درک بهتر به مثال زیر توجه فرمایید:

public static void main(String[] args) {
		// TODO Auto-generated method stub

	      for(int i=1;i<10;i=i+1){

		       if(i==6)
				   continue;

	         System.out.print("i is : " + i );

	         System.out.print("\n");
	      }
	}

خروجی برنامه بالا به این صورت است:

i is : 1
i is : 2
i is : 3
i is : 4
i is : 5
i is : 7
i is : 8
i is : 9

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

شکل پیشرفته حلقه for

در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:

for(declaration : expression)
{
   //Statements
}

در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.

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

public static void main(String[] args) {
	      int [] numbers = {10, 20, 30, 40, 50};

	      for(int x : numbers ){
	         System.out.print( x );
	         System.out.print(",");
	      }
	      System.out.print("\n");
	      String [] names ={"Gsm", "Developers", "Team", "Site"};
	      for( String name : names ) {
	         System.out.print( name );
	         System.out.print(",");
	      }
	}

 

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

10,20,30,40,50,
Gsm,Developers,Team,Site,

آموزش برنامه نویسی جاوا (بخش چهارم: حلقه های تکرار)

استاندارد

کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند.

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

حلقه For ،حلقه While، حلقه Do While…

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

1- حلقه For

هر وقت تعداد تکرارهایمان را بدانیم و یا تعداد تکرار به تعداد مشخصی که آن تعداد در برنامه معلوم می شود، باشد، از حلقه For استفاده می کنیم.

شکل نوشتاری حلقه  For به شکل زیر است:

for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}

بخش های مختلف حلقه For را در الگوریتم بالا شرح می دهیم:

بخش initialization: این بخش فقط یک بار اجرا شده و باعث می شود که مقدمات اجرای حلقه فراهم شود. معمولا در آن متغیر معرفی می شود تا با آن متغیر بتوانیم تعداد حلقه های تکرار را مشخص کنیم.

بخش Boolean_expression: این بخش یک بخش کنترل است که اگر مقدار آن true باشد، حلقه ادامه پیدا کرده و در صورت false شدن از حلقه خارج می شویم.

بخش update: پس از هر بار اجرای حلقه، بخش update اجرا می شود. مثلا در این قسمت هر بار پس از اجرای حلقه یکی به مقدار متغیر اضافه شده تا وقتی شرط وسط نقض شود، از حلقه خارج شویم.

برای درک بهتر به مثال زیر توجه فرمایید:

public class Test {

   public static void main(String args[]) {

      for(int i = 30; i < 35; i = i+1) {
         System.out.print("value of i : " + i );
         System.out.print("\n");
      }
   }
}

نتیجه خروجی مثال بالا به ترتیب زیر است:

value of i is : 30

value of i is : 31

value of i is : 32

value of i is : 33

value of i is : 34

2- حلقه While

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

while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}

دستوری که در حلقه می نویسیم می تواند یک خط کد باشد و یا یک بلاک از کدهای چند خطی باشد. در قسمت عبارت شرطی می توانیم از یک متغیر که می خواهیم با نقض شدنش از حلقه خارج شویم باشد و یا چندین عبارت باشد!

برای درک بهتر به مثال زیر توجه فرمایید:

public class Test {

   public static void main(String args[]) {
      int i = 30;

      while( i < 35) {
         System.out.print("value of i : " + i );
         i++;
         System.out.print("\n");
      }
   }
}

نتیجه خروجی مثال بالا به ترتیب زیر است:

value of i is : 30

value of i is : 31

value of i is : 32

value of i is : 33

value of i is : 34

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

3- حلقه Do ... While

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

در حلقه While معمولی که در قسمت دوم دیدیم ممکن است که کد داخل حلقه While به دلیل آن که شرطش درست نباشد، اجرا نشود و حلقه While حتی یک بار هم تکرار نشود.

do
{
  //بدنه حلقه
} while(شرط حلقه);

برای درک بهتر به مثال زیر توجه فرمایید:

public class Test {

   public static void main(String args[]){
      int i = 30;

      do{
         System.out.print("value of i : " + i );
         i++;
         System.out.print("\n");
      }while( i < 35 );
   }
}

نتیجه خروجی مثال بالا به ترتیب زیر است:

value of i is : 30

value of i is : 31

value of i is : 32

value of i is : 33

value of i is : 34

3- حلقه های تو در تو

گاهی اوقات لازم است که در یک حلقه، یک یا چند حلقه دیگر هم استفاده نمود.

معروفترین مثال برنامه نویسی در مورد حلقه های تودرتو، نمایش جدول ضرب اعداد است:

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int  i,j;

		for ( i = 1; i<=10 ; i++ )
		{
		    for ( j = 1; j<=10 ; j++ )
		    	System.out.print(i*j + "\t");
		    System.out.print("\n");
		}
	}

خروجی مثال بالا به شرح زیر است:

در ابتدا، برنامه وارد حلقه اول شده و شرط را بررسی می کند و با درستی آن به اجرای دستورات حلقه می پردازد. اینجا برای حلقه آکولاد وجود دارد پس تمامی دستورات درون بلوک به ترتیب اجرا می شوند.

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

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

مثال ستاره:

می خواهیم در خروجی ستاره های زیر چاپ شوند:

*
**
***
****
*****
******
*******
********
*********
**********

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int  i,j;

		for ( i = 1; i<=10 ; i++ )
		{
		    for ( j = 1; j<=i ; j++ )
		    	System.out.print("*");
	    	System.out.print("\n");

		}
	}

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

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

آموزش برنامه نویسی جاوا (بخش سوم: عملگر ها)

استاندارد

جاوا یک محیط عملگر غنی را فراهم کرده است . اکثر عملگرهای آن ر ا می توان در چهار گروه طبقه بندی نمود که عبارت اند از : حسابی (arithmetic) ، رفتاربیتی (BitWise) ، رابطه ای (Relational) و منطقی (Logical) .

کارکرد عملگرها در جاوا مشابه با ++C/C است.

1- عملگرهای حسابی

عملگرهای حسابی در عبارات ریاضی استفاده می شوند و طریقه استفاده از آنها بهمان روش جبری است. عملوندهای مربوط به عملگرهای حسابی باید از نوع عددی باشند .

نمی توانید از این عملگرها روی نوع استفاده کنید ، اما روی انواع Char قابل استفاده هستند ، زیرا نوع Char در جاوا بطور ضروری زیر مجموعه ای از int است.

نام عملگر معنی مثال مقدار عبارت مثال
+ جمع 13+7 20
تفریق 8-4 4
منفی -6 -6
* ضرب 3*5 15
/ تقسیم 20/5 4
% باقی مانده تقسیم 8%3 2

عملگرهای حسابی اصلی عبارت اند از: جمع، تفریق، ضرب، تقسیم. مثال: کد زیر یک متغیر از نوع int معرفی می کند. و به آن مقدار 6 را می دهد. در خط دوم یک متغیر از نوع int انتخاب می کند و مقدار آن را برابر جمع متغیر قبلی با عدد 4 می کند. حاصل متغیر دوم برابر 10 است.

int a=6;
int b=a+4;
//b=10

میتوان تعداد بیشتری متغیر و عملوند را در یک خط به کار برد:

int a=5;
int b=7;
int c=3;
int d = a*b*c;
// d=105

عملگر تعیین باقیمانده یعنی % ، باقیمانده یک عملیات تقسیم را برمی گرداند. این عملگر برای انواع عدد اعشاری و انواع عدد صحیح قابل استفاده است. ( اما در ++C/C این عملگر فقط در مورد انواع عدد صحیح کاربرد دارد. )

برنامه بعدی نشان دهنده عملگر % می باشد.

int x = 42;
double y = 42.3;
float z = x%10;
float v = y%10;

در کد بالا مقدار z برابر با 2 و مقدار v برابر با 2.3 است.

جاوا عملگرهای ویژه ای را تدارک دیده که با استفاده از آنها می توان یک عملیات حسابی را با یک انتساب ترکیب نمود. احتمالا می دانید که دستوراتی نظیر مورد زیر در برنامه نویسی کاملا رایج هستند:

a = a + 4;

در جاوا ، می توانید این دستور را بصورت دیگری دوباره نویسی نمایید:

a += 4;

این روایت جدید از عملگر انتساب =+ استفاده می کند هر دو دستورات یک عمل واحد را انجام می دهند : آنها مقدار a را 4 واحد افزایش می دهند.

عبارت عملگر متغیر عملگرهای انتساب دو مزیت را بوجود می آورند.

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

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

2- عملگرهای افزایشی و کاهشی

علامات ++ و — عملگرهای افزایشی و کاهشی جاوا هستند.

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

به عنوان مثال، دستور زیر را می توان به صورتی دیگر نوشت:

x=x+1;

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

x++;

همچنین دستور

x=x-1;

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

x--;

این عملگرها از آن جهت که هم بشکل پسوند جایی که بعد از عملوند قرار می گیرند و هم بشکل پیشوند جایی که قبل از عملوند قرار می گیرند ظاهر می شوند کاملا” منحصر بفرد هستند.

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

به عنوان مثال:

x = 50;
y = ++x;

در این حالت ، همانطوریکه انتظار دارید y معادل 51 می شود. چون افزایش قبل از این که x به y انتساب بیاید، اتفاق می افتد.

اما وقتی که بصورت زیر نوشته می شوند:

x = 50;
y = x++;

در این عبارت، مقدار y برابر با 50 خواهد بود. سپس بعد از آن که مقدار y مشخص می شود، مقدار x به 51 می رسد.

3- عملگر انتساب

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

int x = y = z = 8;

با توجه به خاصیت عملگر انتساب، عبارت فوق در زبان جاوا معتبر بوده و معنای آن این است که هر سه متغیر x و y و z دارای مقدار اولیه 8 هستند.

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

معادل مثال عملگر
x= x+y x+=y +=
x= x – y x -= y -=
x = x*y x*=y *=
x= x/y x/=y /=

4- عملگرهای مقایسه ای

جاوا عملگرهایی برای مقایسه متغیرها (Variables)، متغیرها و متغیرهای لفظی (Literals) و سایر انواع داده‌ها در برنامه دارد. حاصل این عملگرها یک متغیر بولین است که همواره دارای مقدار true یا false است. جدول زیر شامل فهرست کامل عملگرهای مقایسه‌ای جاوا و مثال‌هایی از هر کدام است:

عملگر معنی مثال توضیح مثال
== تساوی x==8  اگر x برابر با 8 باشد، حاصل عبارت True و در غیر این صورت، حاصل false است.
!= نامساوی x!=8 اگر x برابر 8 باشد حاصل عبارت false و در غیر اینصورت true است.
< کوچکتر x<3 اگر x کوچکتر از سه باشد، true و در غیر اینصورت false است.
> بزرگتر x>3 اگر x بزرگتر از سه باشد true و در غیر این صورت false است.
<= کوچکتر مساوی x <= 3 اگر x کوچکتر از سه و یا مساوی با سه باشد true و در غیر این صورت false است.
>= بزرگتر مساوی  x => 3 اگر x بزرگتر از سه و یا مساوی با آن باشد، true و در غیر اینصورت false است.

5- عملگرهای رفتار بیتی یا منطقی

عملگرهای رفتار بیتی The Bitwise operators جاوا چندین عملگر رفتار بیتی تعریف نموده که قابل اعمال روی انواع عدد صحیح شامل long, int, short , char , byte می باشد.

عبارت‌هایی که حاصل آن‌ها یک مقدار بولی (boolean) است، می‌توانند با هم ترکیب شده و عبارت‌های پیچیده‌تری بسازند. برای ترکیب این عبارت‌ها می‌توان از عملگرهای منطقی استفاده کرد. این عملگرها عبارتند از «و» (AND)، «یا» (OR)، «مخالف» (NOT) و «یای انحصاری» (XOR) و …

عملگر نتیجه
& ANDمنطقی
| OR  منطقی
^ XOR منطقی
|| OR اتصال کوتاه
&& AND اتصال کوتاه
! NOT یگانی منطقی
&= AND و تخصیص
|= OR و تخصیص
^= XOR و تخصیص
== مساوی است با
!= مخالف است با
?: If-then-else سه تایی

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

عملگر معنی مثال توضیح مثال
& AND (و) A & B  در صورتی که هر دو عبارت درست باشند، مقدار True و در غیر اینصورت مقدار False را بر میگرداند.
| Or (یا) A|B تنها کافیست که حداقل یکی از دو عبارت درست باشد تا مقدار True را برگرداند و در غیر این صورت مقدار False را بر میگرداند.
^ یای انحصاری (XOR) A^B فقط و فقط در صورتی مقدار بازگشتی عبارت درست (true) است که یکی از دو عبارت صحیح و دیگری غلط باشد. اگر هر دو عبارت درست (true) یا هر دو عبارت غلط (false) باشند، مقدار بازگشتی عبارت غلط (false) خواهد شد.
! Not (مخالف) A! اگر A مقدار True داشته باشد، مقدار False و اگر مقدار False داشته باشد مقدار True را بر میگرداند.

آموزش برنامه نویسی جاوا (مقدمه)

استاندارد

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

در این بخش ابتدا کمی در مورد جاوا توضیح می دهیم.

جاوا (به انگلیسی: Java) یک زبان برنامه‌نویسیِ شیءگرا است که برای نخستین بار توسط جیمز گاسلینگ در شرکت سان مایکروسیستمز ایجاد گردید و در سال ۱۹۹۵ به عنوان بخشی از سکوی جاوا منتشر شد. زبان جاوا شبیه به ++C است اما مدل شیءگرایی آسان‌تری دارد و از قابلیت‌های سطح پایین کمتری پشتیبانی می‌کند. یکی از قابلیت‌های بنیادین جاوا این است که مدیریت حافظه را بطور خودکار انجام می‌دهد. ضریب اطمینان عملکرد برنامه‌های نوشته‌شده به این زبان نسبت به زبانهای نسل اول C بالا است و وابسته به سیستم‌عامل خاصی نیست. برنامه‌های جاوا به صورت بایت کد (کامپایل) می‌شوند که توسط واسط JVM به کدهای ماشین اجرا می‌شوند؛ و در صورت وجود JVM مانند سایر زبانهای مبتنی بر آن وابسته به سیستم‌عامل خاصی نیستند. (منبع : ویکی پدیا)

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

جاوا برای نوشتن انواع برنامه‌های کاربردی مناسب است. با جاوا می‌توان انواع برنامه‌های زیر را نوشت:

  • برنامه‌های تحت وب
  • برنامه‌نویسی سیستم‌های کوچک مانند تلفن همراه، رایانه جیبی و …
  • برنامه‌های کاربردی بزرگ (Enterprise)
  • برنامه‌های رومیزی (Desktop)
  • و غیره.

سیستم‌عامل: تا سال ۲۰۰۴ net. تنها بر روی پلت فرم ویندوز اجرا می‌شد و برخی ویندوز را سیستم‌عامل غیرقابل اعتمادی در برنامه‌نویسی Enterprise می‌دانستند. ولی جاوا از این نظر انتخاب خوبی محسوب می‌شد.
قابلیت حمل: جاوا بر روی سکوهای رایانش گوناگونی قابل اجرا است، از ATM و ماشین رختشویی گرفته تا سرورهای سولاریس با قابلیت پشتیبانی از 1024 CPU برای پردازشقابلیت حمل: جاوا بر روی سکوهای رایانش گوناگونی قابل اجرا است، از ATM و ماشین رختشویی گرفته تا سرورهای سولاریس با قابلیت پشتیبانی از 1024 CPU برای پردازش.

قابلیت حمل: جاوا بر روی سکوهای رایانش گوناگونی قابل اجرا است، از ATM و ماشین رختشویی گرفته تا سرورهای سولاریس با قابلیت پشتیبانی از 1024 CPU برای پردازش.

جاوا از نظر ساختار بسیار شبیه زبان C و ++C است. و این به هیچ وجه تصادفی نیست. C زبانی است ساخته یافته و ++C زبانی شی گرا است. مهم تر از همه آنست که ++C زبان خیلی از برنامه نویسان در دنیا است.

برنامه نویسی شی گرا هسته اصلی جاوا است . در حقیقت کلیه برنامه های جاوا شی گرا هستند . بر خلاف ++C که در آن امکان گزینش شی گرایی وجود دارد روشهای OOP (شی گرایی)، آن چنان با زبان برنامه نویسی جاوا پیوستگی دارند که حتی قبل از نوشتن یک برنامه ساده جاوا نیز باید از روش های OOP استفاده نمود.

OOP مخفف Object Oriented Programming می باشد. بهمین دلیل این بخش را با بحث جنبه های نظری OOP آغاز می کنیم.

3 اصل OOP

کلیه زبانهای برنامه نویسی شی ئگرا مکانیسمهایی را در اختیار شما قرار میدهند تا مدل شی ئگرا را پیاده سازی نمایید.

این مدل شامل کپسول سازی (Encapsulation)، وراثت (Inheritance) و چند شکلی (polymorphism) می باشد.

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

ریزبرنامه ها applets

از جاوا برای تولید دو نوع برنامه می توان استفاده نمود: برنامه های کاربردی (applications) و ریزبرنامه ها (applets)

یک برنامه کاربردی برنامه ای است که روی رایانه شما و تحت نظارت یک سیستم عامل اجرا می شود. بدین ترتیب یک برنامه کاربردی ایجاد شده توسط جاوا مشابه برنامه های ایجاد شده توسط C و ++C خواهد بود.

هنگامیکه از جاوا برای تولید برنامه های کاربردی استفاده میکنیم تفاوتهای زیادی بین این زبان و سایر زبانهای برنامه نویسی مشاهده نمی کنیم اما ویژگی جاوا برای تولید ریز برنامه ها دارای اهمیت زیادی است.

یک ریز برنامه (applets) یک برنامه کاربردی است که برای انتقال و حرکت روی اینترنت و اجرا توسط یک مرورگر قابل انطباق با جاوا طراحی شده است. یک ریز برنامه در حقیقت یک برنامه ظریف جاوا است که بطور پویا در سراسر اینترنت قابل بارگذاری باشد. درست مثل یک تصویر، یک فایل صوتی یا یک قطعه ویدئویی.

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

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

اپلت‌ها امکانات فراوانی برای نوشتن برنامه‌های تحت وب در اختیار برنامه‌نویسان قرار می‌دهند.

البته وجود ماشین مجازی جاوا برای اجرای اپلت لازم است. اپلت‌ها نظیر فناوری سیلورلایت شرکت مایکروسافت هستند که برنامه‌نویسان را قادر می‌سازد تا امکاناتی را به مرورگر کاربر بیفزایند. البته تفاوت این دو در امنیت می‌باشد به گونه‌ای که سیلورلایت به دلیل اینکه در محیطی به نام جعبه شنی (sandbox) اجرا می‌شوند امن هستند ولی اپلتها فاقد چنین امنیتی هستند و به سادگی هدف حملات استاندارد Social Engineering Toolkit در Kali Linux واقع می‌شوند.

قابلیت های جاوا

  • ساده
  •  شىء گرا
  • (Portable) قابل انتقال
  • (Distributed) توزیع شده
  • کارایى بالا
  • (Interpreted) ترجمه شده
  • Multithreaded (چند نخی)
  • پویا
  • (Secure)  ایمن
  • جاوا مجانی ولی Open Source نیست.