آموزش جاوا، فصل ششم: انواع داده‌ها در زبان جاوا

۱- در هر برنامه‌ای ما با تعدادی مقادیر سر و کار داریم. ممکن است برنامه با اعداد کار کند، یا با نویسه‌ها (کاراکترها). برای مثال فرض کنید می‌خواهیم در برنامه‌ای دو عدد مختلف را از ورودی گرفته و بر روی آن‌ها عملیات ریاضی انجام داده و نتیجه را در خروجی چاپ کنیم. نام این برنامه را ماشین حساب ساده یا SimpleCalculator می‌نامیم:

/*
 * A very simple calculator.
 */
public class SimpleCalculator {
	public static void main(String[] args) {
	}
}


حال باید برنامه را به صورتی تغییر دهیم تا بتواند دو عدد با نام‌ها و مقدارهای مختلف را ذخیره کند:

/*
 * A very simple calculator.
 */
public class SimpleCalculator {	

	public static void main(String[] args) {
		int first;
		int second;
	}
}

حال متد main() ما دارای دو متغیر به نام‌های first و second است. در اصطلاح برنامه نویسی first و second را متغیر (Variable) می‌نامند. همانطور که تا به حال دیده‌اید هر متغیری شامل یک نام و یک نوع (type) است. در مثال SimpleCalculator ما دو متغیر به نام‌های first و second که هر دو از نوع int هستند داریم. هر متغیر علاوه بر نام و نوع، مقدار نیز دارد. اکنون می‌خواهیم کلاس SimpleCalculator را به گونه‌ای تغییر دهیم که بتوانیم متغیرهای خود را مقداردهی کنیم:

/*
 * A very simple calculator.
 */

import java.util.Scanner;

public class SimpleCalculator {

	public static void main(String[] args) {
		int first;
		int second;

		Scanner input = new Scanner( System.in );

		System.out.print("Enter first integer: ");
		first = input.nextInt();

		System.out.print("Enter second integer: ");
		second = input.nextInt();
	}
}

فعلاً به کلاس Scanner کاری نداریم. همین قدر بدانید که برای خواندن ورودی‌های برنامه از متدهای این کلاس استفاده می‌کنیم. پس از اجرای برنامه فوق، در کنسول خروجی عبارت Enter first integer: نمایش داده شده و شما می‌توانید جلوی آن مقدار مورد نظر خود را وارد کنید. سپس خط بعدی با عبارت Enter second integer: نمایش داده می‌شود که می‌توانید مقدار مورد نظرتان برای متغیر second را وارد کنید:

/*
 * A very simple calculator.
 */

import java.util.Scanner;

public class SimpleCalculator {

	public static void main(String[] args) {
		int first;
		int second;

		Scanner input = new Scanner( System.in );

		System.out.print("Enter first integer: ");
		first = input.nextInt();

		System.out.print("Enter second integer: ");
		second = input.nextInt();

		System.out.println("first + second = " + ( first + second ) );
		System.out.println("first - second = " + ( first - second ) );
		System.out.println("first * second = " + ( first * second ) );
		System.out.println("first / second = " + ( first / second ) );
	}
}

در چهار خط آخر برنامه حاصل جمع، تفریق، ضرب و تقسیم دو عدد first و second را نمایش می‌دهیم. در تصویر زیر نمونه‌ای از اجرای برنامه را می‌بینید:

ch04_001

۲- هدف هر برنامه‌‌ی رایانه‌ای، محاسبه داده‌ها است. برای این کار هر برنامه‌ای باید بتواند داده‌ها را وارد کند، آن‌ها را پردازش کند و نتیجه را به نحو مقتضی نمایش دهد. برای انجام محاسبات بر روی داده‌ها در برنامه باید بتوانیم داده‌ها را شناسایی کنیم. باید بدانیم آن‌ها از چه نوعی هستند. همچنین باید بدانیم که در هر لحظه هر کدام از آن‌ها چه مقداری دارند. همانطور که در برنامه قبلی دیدید برای هر متغیر سه ویژگی قائل می‌شویم: نوع، نام و مقدار. الگوی کلی تعریف متغیرها (اعلان یا Declaration نیز گفته می‌شود) در زبان جاوا به صورت زیر است:

Type name;

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

name = Value;

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

Type name = Value;

اکنون چند مثال از تعریف و مقداردهی به متغیرها:

متغیری از نوع صحیح و با مقدار اولیه ۵ int a = 5;
متغیری از نوع نویسه (کاراکتر) و با مقدار
اولیه A
char someChar = ‘A’;
متغیری از نوع اعشاری و با مقدار اولیه ۳٫۱۴ float PI = 3.14;
متغیری از نوع رشته‌ای (String)
و با مقدار اولیه «Hello Java»
String hello = “Hello Java”;

پس از آشنایی مقدماتی با متغیرها و نحوه تعریف و مقداردهی به آن‌ها آشنا شدیم، می‌توانیم فهرست کامل نوع داده‌های اولیه (Primitive) را ببینیم:

توضیحات محدوده مقادیر مجاز نوع متغیر
مناسب برای متغیرهای منطقی که
همواره یکی از دو مقدار درست یا غلط دارند
false
و true
boolean
مناسب برای انواع متغیرهای
حرفی. با توجه به این که متغیرهای حرفی در جاوا
یونیکد ۱۶ بیتی هستند، از آن‌ها می‌توان برای کلیه
حروف کلیه زبان‌ها (از جمله فارسی) استفاده کرد.
از صفر یونیکد تا
۲۱۶
یونیکد
char
مناسب برای متغیرهای عددی صحیح
که در محدود مقادیر مجاز صحیح قرار دارند.
از ۱۲۸- تا ۱۲۷ byte
مناسب برای متغیرهای عددی صحیح که در محدود مقادیر
مجاز صحیح (حدود منفی سی و دو هزار تا مثبت سی و
دو هزار) قرار دارند.
از ۲۱۵– تا
۲۱۵
short
مناسب برای متغیرهای عددی صحیح که در محدود مقادیر
مجاز صحیح (حدود منفی دو میلیارد تا مثبت دو
میلیارد) قرار دارند.
از ۲۳۱– تا
۲۳۱
int
مناسب برای متغیرهای عددی صحیح
بسیار بسیار بزرگ!
از ۲۶۳– تا
۲۶۳
long
مناسب برای متغیرهای اعشاری با
دقت خوب برای محاسبات معمولی
استاندارد
IEEE754 (تقریباً از
۳٫۴E38- تا ۳٫۴E38
با ۸ رقم دقت اعشاری)
float
مناسب برای متغیرهای اعشاری با دقت بسیار زیاد
برای محاسبات با دقت مضاعف
استاندارد
IEEE754
(تقریباً از ۱٫۸E308-
تا ۱٫۸E308 با ۱۶ رقم
دقت اعشاری)
double
برای متغیرهایی که هیچ نوعی
ندارند (بعداً درباره نوع void
بیشتر خواهیم گفت)
void

۳- مقادیر لفظی یا لیترال (literal): در جاهایی از برنامه‌های جاوا ممکن است بخواهید مستقیماً از مقادیر استفاده کنید. عبارت زیر را در نظر بگیرید:

int a = 5;

در مثال فوق عدد ۵ اصطلاحاً متغیر لفظی یا لیترال است. کامپایلر جاوا برای متغیرهای لفظی تعدادی پیش‌فرض دارد. برای مثال متغیرهای لفظی صحیح مانند مثال فوق را به صورت پیش‌فرض از نوع int می‌شناسد. حال اگر بخواهید عدد ۵ را در یک دستور انتساب با استفاده از عملگر = به یک متغیر از نوع long نسبت دهید باید به صورت زیر عمل کنید:

long a = 5L;

حرف L که بلافاصله بعد از عدد ۵ آمده است به کامپایلر جاوا می‌فهماند که متغیر لفظی ۵ از نوع long است. همچنین پیش‌فرض متغیرهای لفظی اعشاری در جاوا از نوع double است. دستور زیر را در نظر بگیرید:

float a = 3.14;

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

ch04_002

آیا متوجه علت خطا شدید؟ متغیر لفظی ۳٫۱۴ را کامپایلر جاوا به صورت پیش‌فرض از نوع double فرض می‌کند. وقتی می‌خواهد مقدار آن را در یک متغیر اعشاری از نوع float قرار دهد، دقت عدد اعشاری از نوع double باید به float کاهش یابد و این از دید کامپایلر جاوا یک خطا است. برای رفع این مشکل باید به صراحت به کامپایلر جاوا بگویید که ۳٫۱۴ یک متغیر لفظی اعشاری از نوع float است. برای این کار مشابه دستور زیر عمل می‌کنیم:

float a = 3.14F;

حرف F که بلافاصله بعد از ۳٫۱۴ آمده است کامپایلر جاوا را مجبور می‌کند که متغیر لفظی ۳٫۱۴ را از نوع اعشاری float در نظر بگیرد.

۴- متغیرهای رشته‌ای: همیشه متغیرهای ما از انواع عددی نیستند. در اغلب موارد، ما نیاز داریم که حروف و کلمات را در برنامه خود وارد کنیم، آن‌ها را پردازش کنیم و نتیجه‌ای را به صورت یک کلمه یا جمله نمایش دهیم. برای مثال فرض کنید برنامه‌ای داریم که نام یک دانش‌آموز را از ورودی گرفته و نمره وی را نمایش می‌دهد. ما نیاز به متغیری داریم که بتوانیم نام دانش‌آموز را در آن ذخیره کنیم. به این نوع متغیرها رشته (یا string) گفته می‌شود. زبان جاوا دارای امکانات گسترده‌ای برای کار با رشته‌ها است که در فصول مختلف این کتاب با آن‌ها آشنا خواهیم شد.

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

String name;

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

String name = "Some text";

عبارت‌های رشته‌ای همواره در بین دو علامت ” قرار می‌گیرند.

۵- متغیرهایی که نمی‌توان مقدار آن‌ها را تغییر داد (!): تعریف فوق به اندازه کافی خود متناقض است. متغیر یعنی چیزی که تغییر می‌کند، پس متغیری که نتوان مقدار آن را تغییر داد بی‌معنی است. ولی اگر بازی با کلمات را رها کنیم، می‌بینیم که در مواقع زیادی در برنامه‌ها ممکن است متغیرهایی را تعریف کنیم که تمایلی نداریم در حین اجرای برنامه، خواسته یا ناخواسته مقدار آن‌ها تغییر کند. برای مثال فرض کنید در محاسبات ریاضی، از عدد پی (π) استفاده می‌کنیم. مقدار این متغیر در طول اجرای برنامه نباید تغییر کند. برای این کار ما این متغیر را ثابت و نهایی تعریف می‌کنیم:

final double PI = 3.14;

پس از تعریف متغیر PI به شکل فوق دیگر نمی‌توانیم در حین اجرای برنامه مقدار آن را تغییر دهیم:

final double PI = 3.14;
PI = 25; // Compiler error
PI = a; // Compiler error

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

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

/*
 * An example about variables' scope
 */
public class VariableScopeTest {

	public void firstMethod() {
		int myNumber = 5;
	}		

	public void someMethod () {
		myNumber = 10; //?
	}
}

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

ch04_003

علت آن کاملاً واضح است: متغیری که در یک متد تعریف شده است، متعلق به آن متد بوده و در بیرون آن وجود ندارد. بنابراین در متدهای دیگر به آن دسترسی نداریم.

حوزه متغیرها در زبان جاوا به صورت زیر تقسیم‌بندی می‌شود:

حوزه کلاس: ویژگی‌های کلاس، متغیرهایی هستند که در سرتاسر یک کلاس قابل دسترسی‌اند. برای مثال اگر یک متغیر در حوزه کلاس باشد، همه متدهای آن کلاس به آن دسترسی دارند و هر کدام از متدها که آن متغیر را تغییر دهند، مقدار آن در سایر متدها نیز تغییر می‌کند.

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

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

/*
 * An example about variables' scope
 */
public class VariableScopeTest {

	public void someMethod () {
		for( int i = 0 ; i < 10 ; i++ ) {
			// Do something
		}		

		// Now what is i's value?
		System.out.println( "i = " + i );
	}
}

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

ch04_004

علت این است که حوزه متغیر i فقط همان حلقه تکرار است و در خارج از آن دیگر متغیر i وجود ندارد.

مسأله مهمی که درباره حوزه متغیرها نیاز به توضیح دارد، مسأله همنامی متغیرها است. آیا می‌توان دو متغیر با یک نام داشت؟ بستگی دارد! اگر متغیرهای همنام در حوزه‌های متفاوت باشند، این امر امکان‌پذیر است. برای مثال اگر یک کلاس دارای یک ویژگی (Attribute) به نام someInt باشد و یکی از متدهای آن کلاس هم یک متغیر به همان نام داشته باشد، هیچ خطایی وجود ندارد. فقط نکته مهم در این است که متغیرهای همنام در همان حوزه‌ای که تعریف شده‌اند معتبرند. به مثال زیر دقت کنید:

/*
 * An example about variables' scope
 */
public class VariableScopeTest {

	int someInt;

	public void someMethod () {
		int someInt;

		someInt = 5; // ?
	}
}

در مثال فوق، متغیری به نام someInt در کلاس VariableScopeTest تعریف شده و جزو ویژگی‌های آن کلاس است. در متد someMethod هم باز متغیری به نام someInt تعریف شده است. حال اگر در متد someMethode مقدار ۵ را به متغیر someInt نسبت دهیم چه اتفاقی می‌افتد؟ آیا متغیر تعریف شده در تابع تغییر می‌کند یا ویژگی آن کلاس؟ برای پاسخ دادن به این سؤال باید به این نکته توجه داشت که اولویت با حوزه‌ای است که متغیر در آن تعریف شده است. بنابراین اگر مقدار ۵ را به someInt نسبت دهیم، متغیری که در متد فوق تعریف شده است تغییر می‌کند نه ویژگی کلاس به همان نام. حال اگر بخواهیم در متد someMethod ویژگی کلاس به نام someInt را تغییر دهیم چه باید بکنیم؟ برای این کار کافی است از نام کلاس استفاده کنیم. به مثال زیر دقت کنید:

/*
 * An example about variables' scope
 */
public class VariableScopeTest {

	int someInt;

	public void someMethod () {
		int someInt;

		someInt = 5; // Method variable

		this.someInt = 7; // class variable
	}
}

۷- اشیا یا همان متغیرهایی که از روی کلاس‌ها ساخته می‌شوند: همانطور که در قسمت‌های قبل دیدید، متغیرها می‌توانند از انواع اولیه (primitive data types) باشند. ولی همانطور که در فصل‌های بعد خواهید دید، نوع متغیرها محدود به انواع داده اولیه نیست و از روی هر کلاسی می‌توان یک متغیر تعریف کرد. در فصل ۳ از کلاس Circle یک شیء ساختیم. اگر به نحوه اعلان (تعریف) شیء theCircle دقت کنید، خواهید دید که تعریف آن کاملاً منطبق بر ساختار تعریف متغیرها است. پس هر شیءای که از روی یک کلاس ساخته می‌شود، خود یک متغیر است

۸- آرایه‌ها: فرض کنید که می‌خواهید نمره‌های دانشجویان یک کلاس را گرفته و میانگین آن‌ها را محاسبه کنید. تعداد دانشجویان کلاس ۲۵ است. آیا ۲۵ متغیر از نوع float تعریف می‌کنید؟ اگر تعداد دانشجویان کلاس ۵۰ نفر بود چه کار می‌کردید؟ برای ۲۰۰ نفر چه می‌کردید؟ همانطور که حدس می‌زنید راه‌حل، استفاده از تعداد زیادی متغیر نیست. اگر می‌توانستیم تعداد زیادی متغیر همنوع را با یک نام ذخیره کنیم و با استفاده از یک اندیس به آن‌ها دسترسی داشته باشیم مشکل حل می‌شد. مثلاً می‌گفتیم فهرست نمره‌های دانشجویان که شامل ۲۵ متغیر float است و بعد می‌گفتیم نمره دانشجوی اول ۱۵ و دانشجوی دوم ۱۶ و … است. به چنین نوع داده‌ای آرایه گفته می‌شود. آرایه (Array) مجموعه‌ای از متغیرها است که عنصر (element) یا جزء (Component) نامیده می‌شوند و همگی از یک نوع (type) هستند. یک آرایه با چند چیز شناخته می‌شود: نام آن، تعداد متغیرهایی که نگهداری می‌کند که طول آرایه نامیده می‌شود و نوع متغیرهایی که آرایه در خود نگه می‌دارد. بنابراین برای تعریف یک آرایه که نمره‌های دانشجویان را نگهداری کند به شکل زیر عمل می‌کنیم:

float[25] grades;

به اجزای تعریف فوق دقت کنید. float نوع آرایه را مشخص می‌کند. در واقع می‌گوید که آرایه فوق عناصری از نوع float را نگهداری می‌کند. [۲۵] اعلام می‌کند که طول آرایه ۲۵ است. [] نشان دهنده آرایه است و عدد صحیحی که درون آن قرار می‌گیرد طول آرایه را مشخص می‌کند. grades هم که نام آرایه است. حال اگر بخواهیم عناصر این آرایه را مقداردهی کنیم به شکل زیر عمل می‌کنیم:

grades[0] = 12.3f;
grades[1] = 15.5f;
...
grades[24] = 16f;

همانطور که در مثال‌های بالا می‌بینید برای مقدار دهی به عناصر آرایه از نام آرایه به همراه اندیس عنصر استفاده می‌کنیم.

(در حال آماده‌سازی…)

۹- قواعد نامگذاری متغیرها در جاوا: نامگذاری متغیرها در جاوا دارای هیچ محدودیتی نیست. متغیرها با حروف (a-z و A-Z) و خط زیر (ـ) آغاز می‌شوند و بعد از آن هر تعداد حرف یا عدد می‌تواند بیاید.

چند مثال از نام‌های غلط برای متغیرها در جاوا:

int 1i; // Wrong name
String #name = "My Name"; // Wrong name

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

۱- نام متغیرها با حرف کوچک شروع می‌شود. در صورتی که نام متغیر بیشتر از یک کلمه بود، کلمات به هم می‌چسبند و حرف ابتدایی کلمات دوم و بعد از آن با حروف بزرگ آغاز می‌شود. این شیوه نامگذاری به کوهان شتری (Camel case) معروف است. چند مثال از نام‌های خوب و بد:

int number;          // Good name!
int second_number;   // Bad name!
int secondNumber;    // Good name!
String Name;         // Bad name!
String name;         // Good name!
float _average;      // Bad name!

۲- متغیرهای ثابت (final) معمولاً با حروف بزرگ نوشته شده و در صورتی که تعداد کلمات بیشتر از یک کلمه باشد، با خط زیر (ـ) از هم جدا می‌شوند:

double PI = 3.14;
String URL = "http://www.HowToProgram.ir";
String DB_URL = "jdbc:mysql://127.0.0.1:3306/testDB";

البته نامگذاری کلاس‌ها و بسته‌ها (package) در زبان جاوا قواعدی دارد که در فصول بعدی به آن‌ها هم می‌پردازیم.

ادامه دارد…

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail




10 فکر می‌کنند “آموزش جاوا، فصل ششم: انواع داده‌ها در زبان جاوا

  1. مجید

    /*
    * An example about variables’ scope
    */
    public class VariableScopeTest {

    public void someMethod () {
    for( int i = 0 ; i < 10 ; i++ ) {
    // Do something
    }

    // Now what is i’s value?
    System.out.println( “i = ” + i );
    }
    }
    استاد این قسمت کدتون چی هست؟ i &lt در حلقه for

    پاسخ
  2. امیر

    من می خواستم اندروید یاد بگیرم بعد فهمیدم باید java بلد باشم . پس با یک سایت هم جاوا یادگرفتم هم اندروید.

    دستتون درد نکنه.
    سایتتون خیییییییییییییییییییییییلیییییییییییییییییییییییییییییییییی خووووووووووووووووووووووووووووبهههههههههههههههههه.
    مممممممممممممممممممممممممنووووووووووووووووووووووووووووووووون

    پاسخ
  3. شيدا

    سلام
    در چه حالتی امکان استفاده از متغیرهای تعریف نشده داده نمیشود ؟؟
    میشه لطفاً راهنماییم کنید سپاسگزارم

    پاسخ
    1. علی بهزادیان نژاد نویسنده

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

      پاسخ

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

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