شما قبلاً یاد گرفتهاید اشیا وضعیت خود را در فیلدها ذخیره میکنند. اما زبان جاوا همچنین اصطلاح متغیر را هم استفاده میکند. این بخش این رابطه، قوانین نامگذاری متغیر، انواع داده پایه (انواع اولیه، رشتههای کاراکتری و آرایهها)، مقادیر پیشفرض و Literalها را بحث میکند.
زبان جاوا ایستا تایپ (Statically-Typed) است، یعنی تمام متغیرها ابتدا باید اعلام شوند سپس استفاده شوند. این شامل اعلام نوع و نام متغیر است، مانند چیزی که قبلاً دیدهاید:
int gear = 1;
این به برنامه شما میگوید فیلدی به نام gear وجود دارد، داده عددی نگه میدارد و مقدار اولیه آن 1 است. نوع داده متغیر مقادیری را که میتواند داشته باشد و عملیاتی را که میتوان روی آن انجام داد تعیین میکند. علاوه بر int، زبان جاوا هفت نوع داده اولیه دیگر پشتیبانی میکند. نوع اولیه توسط زبان از پیش تعریف شده و با کلمه کلیدی رزرو شده نامگذاری میشود. مقادیر اولیه وضعیت را با سایر مقادیر اولیه به اشتراک نمیگذارند. هشت نوع داده اولیه پشتیبانیشده توسط زبان جاوا:
byte: نوع دادهای ۸ بیتی عدد صحیح دو مکمل (Two's Complement). حداقل مقدار -۱۲۸ و حداکثر ۱۲۷. برای صرفهجویی در حافظه در آرایههای بزرگ مفید است. همچنین میتواند به جای int استفاده شود تا محدودیتها کد شما را شفافتر کنند.short: نوع دادهای ۱۶ بیتی عدد صحیح دو مکمل. حداقل -۳۲,۷۶۸ و حداکثر ۳۲,۷۶۷. مشابه byte، برای صرفهجویی در حافظه در آرایههای بزرگ قابل استفاده است.int: نوع دادهای ۳۲ بیتی عدد صحیح دو مکمل. حداقل -۲۳۱ و حداکثر ۲۳۱-۱.long: نوع دادهای ۶۴ بیتی عدد صحیح دو مکمل. حداقل -۲۶۳ و حداکثر ۲۶₃-۱.float: نوع اعشاری شناور ۳۲ بیتی IEEE 754 با دقت تکی. برای مقادیر دقیق مانند ارز هرگز استفاده نکنید. برای آن از کلاس java.math.BigDecimal استفاده کنید.double: نوع اعشاری شناور ۶۴ بیتی IEEE 754 با دقت مضاعف. انتخاب پیشفرض برای مقادیر اعشاری. همچنین هرگز برای مقادیر دقیق مانند ارز استفاده نکنید.boolean: فقط دو مقدار ممکن: true و false. برای پرچمهای ساده ردیابی شرط true/false. اندازه دقیق آن تعریف نشده است.char: یک کاراکتر Unicode ۱۶ بیتی. حداقل \u0000 (یا ۰) و حداکثر \uffff (یا ۶۵,۵۳۵).از Java SE 8 به بعد، میتوانید از نوع int برای نمایش عدد صحیح unsigned ۳۲ بیتی (حداقل ۰، حداکثر ۲۳۲-۱) و از long برای unsigned ۶۴ بیتی استفاده کنید. کلاسهای Integer و Long متدهایی مانند Integer.compareUnsigned() و Long.divideUnsigned() برای پشتیبانی از عملیات حسابی unsigned دارند.
علاوه بر هشت نوع داده اولیه، جاوا پشتیبانی ویژهای برای رشتههای کاراکتری از طریق کلاس java.lang.String فراهم میکند. قرار دادن رشته کاراکتری بین دو علامت نقل قول خودکار یک شی String جدید ایجاد میکند:
String s = "this is a string";
اشیای String غیرقابل تغییر (Immutable) هستند — یعنی پس از ایجاد، مقادیرشان قابل تغییر نیست. کلاس String فنی نوع داده اولیه نیست، اما با توجه به پشتیبانی ویژه زبان از آن، احتمالاً آن را به عنوان نوع اولیه در نظر میگیرید.
همیشه لازم نیست هنگام اعلام فیلد، مقداری اختصاص دهید. فیلدهای اعلامشده اما مقداردهی نشده توسط کامپایلر با مقدار پیشفرض معقولی تنظیم میشوند. معمولاً این مقدار پیشفرض صفر یا null است، بسته به نوع داده. اما تکیه بر چنین مقادیر پیشفرضی عموماً به عنوان سبک برنامهنویسی بد در نظر گرفته میشود.
جدول زیر مقادیر پیشفرض انواع داده بالا را خلاصه میکند:
| نوع داده | مقدار پیشفرض (برای فیلدها) |
|---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | \u0000 |
String (یا هر شی) | null |
boolean | false |
متغیرهای محلی کمی متفاوت هستند؛ کامپایلر هرگز مقدار پیشفرضی به متغیر محلی مقداردهی نشده اختصاص نمیدهد. اگر نمیتوانید متغیر محلی را هنگام اعلام مقداردهی کنید، مطمئن شوید قبل از استفاده مقداری به آن اختصاص دهید. دسترسی به متغیر محلی مقداردهی نشده باعث خطای زمان کامپایل میشود.
ممکن است متوجه شده باشید هنگام مقداردهی اولیه متغیر نوع اولیه از کلمه کلیدی new استفاده نمیشود. انواع اولیه نوعهای دادهای خاصی هستند که در زبان تعبیه شدهاند؛ اشیایی نیستند که از کلاس ایجاد شوند. Literal بازنمایی کد منبع یک مقدار ثابت است؛ Literalها مستقیماً در کد شما نمایش داده میشوند و نیازی به محاسبه ندارند.
Literal عدد صحیح اگر با حرف L یا l تمام شود از نوع long است؛ در غیر این صورت از نوع int. توصیه میشود از حرف بزرگ L استفاده کنید چون حرف کوچک l از رقم 1 قابل تشخیص نیست.
مقادیر انواع عددی byte، short، int و long میتوانند از Literalهای int ایجاد شوند. مقادیر long که از محدوده int فراتر روند از Literalهای long ایجاد میشوند. Literalهای عدد صحیح با این سیستمهای عددی قابل بیان هستند:
پیشوند 0x نشاندهنده شانزدهشانزدهیی و 0b نشاندهنده دوتایی است:
int dec = 26;
int hex = 0x1A; // 26
int bin = 0b11010; // 26
Literal اعشاری شناور اگر با F یا f تمام شود از نوع float است؛ در غیر این صورت نوع آن double است و میتواند اختیاری با D یا d تمام شود.
انواع اعشاری (float و double) همچنین با E یا e (برای نمایش علمی)، F یا f (literal float ۳۲ بیتی) و D یا d (literal double ۶۴ بیتی؛ این پیشفرض است و طبق قرارداد حذف میشود) قابل بیان هستند.
Literalهای نوع char و String میتوانند شامل هر کاراکتر Unicode (UTF-16) باشند. همیشه از تکنقل قول برای Literalهای char و دو نقل قول برای Literalهای String استفاده کنید.
جاوا از دنبالههای فرار ویژهای برای Literalهای char و String پشتیبانی میکند:
| کاراکتر | توضیح |
|---|---|
\b | بکاسپیس |
\t | تب |
\n | خط جدید |
\f | فرم فید |
\r | بازگشت ماشین تحریر |
\" | نقل قول دوگانه |
\' | نقل قول تکی |
\\ | خط مورب معکوس |
null Literal خاصی است که میتواند به عنوان مقدار هر نوع مرجع استفاده شود. null به هر متغیری قابل اختصاص است، به جز متغیرهای نوع اولیه. همچنین class literal نوع خاصی از literal است: String.class. این به شیای ارجاع میدهد که خود نوع را نمایش میدهد، از نوع Class.
از Java SE 7 به بعد، هر تعداد کاراکتر زیرخط (_) میتواند در هر مکانی بین اعداد در Literal عددی ظاهر شود. این ویژگی خوانایی کد را بهبود میبخشد.
int creditCardNumber = 1234_5678_9012_3456L;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
long bytes = 0b11010010_01101001_10010100_10010010;
زیرخطها فقط بین اعداد قرار میگیرند:
F یا Lمثالهای زیر قرارگیری صحیح و نادرست زیرخط در Literalهای عددی را نشان میدهد:
long creditCard = 1234_5678_9012_3456L; // صحیح
long hexBytes = 0xFF_EC_DE_5E; // صحیح
// نادرست:
// long invalid1 = _26; // ابتدای عدد
// long invalid2 = 26_; // انتهای عدد
// float invalid3 = 2.3_F; // قبل از F
// long invalid4 = 0x5_F; // بعد از hex
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/