آموزش جاوا برای برنامه نویسان اندروید – جلسه دوم

توضیحات (comments)

اکثر زبان‌های برنامه نویسی اجازه درج توضیحات را می‌دهند و جاوا از این قاعده مستثنا نیست. توضیحات می‌توانند چند خطی باشند، با /* آغاز شده و به */ ختم شوند

/* multi-line

Comments */

همچنین می‌توان توضیحات را در یک خط و یا در انتهای یک خط کد با کاراکتر // وارد کرد

int x = 7; //اولین متغیر برابر با ۷ است
int y = 8; // دومین متغیر برابر با ۸ است
int result = x+y; //نتیجه برابر با حاصل‌جمع آن‌هاست

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

/** This method does something interesting
 *
 * @param someValue processed and returned
 * @param option changes the type of processing done to someValue
 * @return The result of someValue being processed
 */
public int sampleMethod(int someValue, boolean option) {
    //…
}

متغیرها

یک متغیر به سادگی جزئی از یک داده است. متغیرهای جاوا به طور کلی به دو دسته تقسیم می‌شوند:

  • انواع داده‌های اولیه مانند int, float, double, char , …
  • اشیاء جاوا که به صورت یک کلاس تعریف می‌شوند.

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

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

متغیرهای عضو کلاس در زبان‌های شی‌گرا اغلب ویژگی (attribute) نامیده می‌شوند. همچنین فیلد یا خصوصیت نیز گفته می‌شوند.

مانند سایر زبان‌های برنامه نویسی رایج، عملگر انتصاب را داریم که علامت آن = است:

int x = 5;

همچنین عملگرهای محاسباتی مانند /,*,+,- را داریم. به خاطر داشته باشید که در صورت لزوم می‌توان از پرانتزها برای تقدم عملگرها استفاده کرد.

int result = (a + b) / c;

در نهایت عمگرهای یکانی را داریم که امکان تغییر تنها یک متغیر با یک دستور ساده را فراهم می‌کند.

iPositive++ یک واحد این متغیر را افزایش می‌دهد که با دستور زیر معادل است

iPositive = iPositive + 1;

و  iPositive–یک واحد از این متغیر کم می‌کند که برابر با دستور زیر است


iPositive = iPositive - 1;

توجه داشته باشید که عملیات افزایشی(++) و کاهشی(–) می‌توانند پسوند یا پیشوند باشند. به این معنی که افزایش می‌تواند بعد یا قبل از بسیاری از شرایط انجام شود. درصورتی که متغیر در یک حلقه استفاده شود، معمولاً برای افزایش خوانایی کد، عملگر افزایشی به صورت پسوند استفاده می‌شود.

انواع داده ابتدایی

بیاید نگاهی به برخی از انواع داده اولیه موجود در زبان برنامه نویسی جاوا بیاندازیم:

Byte: متغیر byte یک عدد صحیح ۸ بیتی علامت‌دار (بین ۱۲۸- و ۱۲۷+) است که اغلب برای آرایه‌ها استفاده می‌شود.

Short: یک عدد صحیح علامت‌دار ۱۶ بیتی (بین ۳۲۷۶۸- و ۳۲۷۶۷+) است که بازهم اغلب برای آرایه‌ها استفاده می‌شود.

Int: یک عدد صحیح علامت‌دار ۳۲ بیتی (بین ۲۱۴۷۴۸۳۶۴۸- و ۲۱۴۷۴۸۳۶۴۷+) است. این مرسوم ترین نوع عددی است که تعریف می‌شود.

Long: یک عدد صحیح علامت‌دار ۶۴ بیتی است. زمانی که متغیر int به اندازه کافی بزرگ نباشد استفاده می‌شود.

Float: یک عدد اعشاری با دقت ۳۲ بیت است.

Double: یک عدد اعشاری با دقت ۶۴ بیت است.

Boolean: متغیر بولی تنها دو مقدار ممکن دارد: true درست و false نادرست. این نوع داده معمولاً برای عبارات شرطی استفاده می‌شود.

Char: یک کاراکتر یونیکد ۱۶ بیتی است.

  • متغیرهای انواع اولیه با مشخص کردن نوع داده سپس نام متغیر و پس از علامت انتصاب یک مقدار اولیه، تعریف می‌شوند. همچنین مانند تمامی دستورات جاوا با semi-colon پایان می‌پذیرند. برای مثال دستور زیر یک متغیر با نام iVal و مقدار اولیه ۱ تعریف می‌کند:
  • int iVal = 1;
    
  • مانند بسیاری از زبان‌ها می‌توانید یک آرایه مبتنی بر مقدار اولیه صفر از یک نوع داده خاص تعریف کنید. برای مثال در زیر یک آرایه با ۴ مقدار صحیح که خانه با شماره اندیس ۲ با مقدار ۴ پر شده است، را تعریف می‌کنیم.

*نکته: در جاوا شماره اندیس خانه‌های آرایه از صفر شروع می‌شود.


int[] aiPowersOfTwo;
aiPowersOfTwo = new int[4];
aiPowersOfTwo [0] = 1;    //  2^0=1
aiPowersOfTwo [1] = 2;    //  2^1=2
aiPowersOfTwo [2] = 4;    //  2^2=4
aiPowersOfTwo [3] = 8;    //  2^3=8

اشیایی که به طور معمول در جاوا استفاده می‌شوند

معمولاً کتابخانه جاوا تعدادی از اشیا مفید برای استفاده با ساختمان داده‌های مشترک را ارائه می‌دهد. تمامی اشیا از کلاس object مشتق می‌شوند. و در نقطه مقابل کلاس‌هایی برای همه انواع داده اولیه وجود دارد. به عنوان مثال کلاس integer یک مقدار int را کپسوله می‌کند و تعدادی متدهای مفید برای دستکاری مقادیر داده عدد صحیح فراهم می‌کند. برای مثال کد جاوا زیر متغیر صحیح به نام iVal را معرفی می‌کند. سپس با استفاده از یک سازنده، یک شی inreger که مقدار صحیح می‌گیرد را ایجاد می‌کند. سپس


int iVal = 1;
Integer integ1= new Integer(iVal);
float f = integ1.floatValue();

ممکن است از اشیا رایج زیادی در برنامه‌های اندرویدی برای کار با رشته‌ها (String) استفاده کنید. کلاس String برای کپسوله کردن کاراکترهای متن قابل فهم انسان استفاده می‌شود، که اغلب برروی صفحه نمایش نشان داده می‌شوند. اگر بخواهید رشته‌ها را به بخش های کوچکتر اصلاح کنید یا بسازید، می‌توانید کلاس‌های  StringBuffer و StringBuilder را نیز بررسی کنید.


String strHello = new String(“Hello World”);

برای مشاهده یک لیست کامل از انواع داده مشترک جاوا و اندروید می‌توانید به این آدرس مراجعه نمایید. همچنین می‌توانید اشیا ورودی و خروجی مشترک را در پکیج java.io پیدا کنید.

  • برای ساختمان داده‌های پیچیده‌تر مانند لیست‌ها، صف‌ها، پشته‌ها، تارخ و زمان کلاس‌های مناسبی در پکیج utils موجود هستند.
  • در نهایت برنامه‌های اندرویدی به تعدادی از کلاس‌های مفید متکی هستند. این کلاس‌ها عموماً برای اجزای نر‌افزاری مانند activityها، برنامه‌های محاوره‌ای و سرویس‌ها استفاده می‌شوند. این کلاس‌ها را می‌توان در پکیج app پیدا کرد.

دسترسی و مجوزهای کلاسی

قابلیت دیدن یک کلاس و همچنین متغیرها و متدهای آن به وسیله آیتم‌های سطح دسترسی کنترل می‌شوند. سطوح دسترسی سه نوع هستند: public(عمومی)، protected(محافظت‌شده) و private(خصوصی). به طورکلی اگر می‌خواهید به چیزی خارج از کلاس دسترسی داشته باشید، public را استفاده کنید. اگر یک متد یا متغیر دارید که فقط باید در کلاس خودشان در دسترس باشند، private را استفاده کنید. Protected زمانی استفاده می‌شود که یک کلاس یا زیرکلاس‌های آن نیازمند دسترسی به آن عضو باشند.

برای مثال تعریف کلاس SillySensor چندین متغیر و متد با سطوح دسترسی مختلف تعریف می‌کند:

  • یک متغیرکلاس به نام sensorData که فقط در کلاس قابل رؤیت است،
  • یک سازنده (constructor) که می‌تواند از خارج از کلاس هم صدا زده شود،
  • یک متد خصوصی به نام calibrate() که فقط توسط خود کلاس می‌تواند صدا زده شود،
  • یک متد محافظت شده به نام seedCalibrate() که فقط توسط خود کلاس یا زیرکلاس‌هایش می‌تواند صدا زده شود و
  • یک متد عمومی به نام getSensorData() که می‌تواند از هرجایی صدا زده شود و یک دسترسی فقط‌خواندنی به متغیر sensorData را فراهم کند.

public class SillySensor
    {
        private int sensorData;

        public SillySensor()
        {
            sensorData=0;
        }

        private void calibrate(int iSeed)
        {
            // Do some calibration here
        }

        protected void seedCalibration(int iSeed)
        {
            calibrate(iSeed);
        }

        public int getSensorData()
        {
            // Check sensor here

            return sensorData;
        }

    }

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

  • == برابر است با، a == b
  • != نامساوی، a != b
  • < بزرگتر است از، a > b
  • >= بزرگتر مساوی، a >= b
  • < کوچکتر است از، a < b
  • <= کوچکتر مساوی، a <= b

وقتی که لازم باشد چندین دستور شرطی را باهم ترکیب کرده و یک تست شرطی بزرگتر بسازید، می‌توانید از AND(&&) و یا OR(||) استفاده کنید.

  • (a == b) && (a == c) زمانی درست است که a با b و همچنین با c برابر باشد،
  • (a == b) || (a == c) زمانی درست است که a با b یا c برابر باشد.

جاوا همچنین از عملگرهای بیتی (&, |, ^)، شیفت‌ها (>>, <<) و عملگر متمم (~) نیز به خوبی پشتیبانی می‌کند. برای اطلاعات بیش‌تر در این زمینه به مستندات جاوا مراجعه کنید.

اکنون که یادگرفتید چگونه دستورات شرطی را بسازید، زمان آن رسیده است که قطعه کدهای شرطی را ایجاد کنید. ساده‌ترین نوع از یک تکه کد شرطی ساختار if() است:

boolean condition = true;
if(condition==true)
{
    // Execute this code only if condition variable is true
}

اگر بخواهید در صورت برقرار نشدن شرط، کد دیگری را اجرا کنید، باید از عبارت else در ساختار if() استفاده کنید:


boolean condition = true;
if(condition==true)
{
    // Execute this code only if condition variable value is true
} else {
    // Execute this code only if condition variable value is false
}

همچنین اگر بخواهید دو مورد یا بیشتر را اداره کنید ساختار آبشاری if-else-if-else را پیشنهاد می‌کنیم:


 if(iVar==0) {
    // variable is zero
} else if (iVar > 0) {
    // variable is a positive number
} else {
    // variable is a negative number
}

ساختار switch-case

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


char singleChar = 'z';
        switch(singleChar) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            // singleChar is a vowel! Execute this code!
            break;
        default:
             // singleChar is a consonant! Execute this code instead!
             break;
        }

حلقه‌ ها

زمانی که بخواهید بخشی از کد مکرراً اجرا شود یا از بازگشت(recursion) استفاده کنید، جاوا از انواع مختلف حلقه ‌ها پشتیبانی می‌کند.

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

int numItemsToProcess = 3;
while(numItemsToProcess > 0)
{
    // process an item
    numItemsToProcess--;

اگر می‌خواهید شرط حلقه را پس از اولین تکرار ارزیابی کنید، به جای while از do-while استفاده کنید:

do
{
    // check for items to process, update numItemsToProcess as required
    // process item, updated numItemsToProcess
} while (numItemsToProcess > 0);

در نهایت اگر تمایل به تکرار دستورات به تعداد مشخصی داشته باشیم، می‌توانیم از حلقه for استفاده کنیم. یک حلقه for سه پارامتر دارد: مقدار اولیه، مقدار خاتمه و مقدار افزاینده. به عنوان مثال برای ۱۰۰ بار اجرای یک حلقه و چاپ اعداد از ۱ تا ۱۰۰ می‌توانید مشابه کد زیر عمل کنید:


for(int i = 1; i <=100; i++)
{
    // print i
}

*نکته: شما می‌توانید برای خروج از یک حلقه در صورت نیاز، از دستور break استفاده کنید. همچنین می‌توانید برای گذر از ادامه دستورات در تکرار جاری حلقه و انتقال به تکرار بعدی (و البته ارزیابی مجدد عبارت شرطی)، از دستور continue استفاده کنید.

پاس دادن توسط نوع مقداری و ارجاعی

در جاوا هیچ اشاره‌گری وجود ندارد. شاید این خبر خوشی برای شما باشد، اما عجله نکنید…

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

در روش ارجاع مقداری یا by value، مقدار اصلی متغیر دست نخورده باقی می‌ماند و یک کپی از آن متغیر به متد ارسال شده و تغییرات روی آن نسخه کپی اعمال می‌شود. در روش ارجاعی یا by reference، آدرسی از متغیر به متد ارسال می‌شود و تغییرات مستقیماً روی داده اصلی انجام می‌شود. اما نمی‌توانید خود شی را ارسال کنید. در مثال زیر یک کلاس به نام Cat داریم .


public class Cat {
    private String mCatName;

    Cat(String name) {
        mCatName=name;
    }

    public String getName() {
        return mCatName;
    };

    public void setName(String strName) {
        mCatName = strName;
    };
}

اکنون اجازه دهید از این کلاس استفاده کرده و یک شی Cat را به توابعی ارسال کنیم و ببینیم چه اتفاقی می‌افتد


void messWithCat(Cat kitty) {
        kitty = new Cat("Han");
        }

    void changeKitty(Cat kitty) {
        kitty.setName("Wookie");
    }

    Cat haveKitten()
    {
        Cat kitten = new Cat("Luke");
        return kitten;
    }

در نهایت، بیایید این متدها را صدا بزنیم و ببینیم چگونه روی نمونه‌های شی Cat عمل می‌کند:

Cat cat1 = new Cat("Jabba");
Cat cat2 = new Cat("Leia");

cat1.getName();    // Returns Jabba
cat2.getName();    // Returns Leia
messWithCat(cat1);
changeKitty(cat2);
Cat cat3 = haveKitten();
cat1.getName();    // Returns Jabba – Note that object remains unchanged!
cat2.getName();    // Returns Wookie
cat3.getName();    // Returns Luke

جمع‌بندی

 

شما تنها یک دوره کوچک از برنامه نویسی جاوا را گذرانده‌اید. ممکن است برای توسعه اولین برنامه جاوا خود آماده نباشید اما حتماً قادر خواهید بود که با کلاس‌های جاوای applicationهای اندرویدی کار کنید و تا آنجایی به جاوا مربوط می‌شود را درک کنید. اولین کلاسی که برای آمادگی در توسعه اندروید به آن نگاه خواهید انداخت، کلاس activity است. یک application اندرویدی برای مشخص کردن وظایف زمان اجرا از activityها استفاده می‌کند. همچنین به عنوان نقطه شروع و ورودی یک app باید از activity استفاده کنید. اکنون که استفاده از syntax جاوا را یاد گرفته‌اید پیشنهاد می‌کنیم با یک آموزش ابتدایی اندروید شروع به کار کنید. اما فراموش نکنید که برای توسعه application های حرفه‌ای و بدون نقص به ادامه این سری از آموزش‌ها نیاز دارید. پس در آموزش‌های بعدی با ما همراه باشید.

 

 

 

مترجمان :

مهدی قاسم خانی

شیما عرفان

ویرایش  فنی :

محمد غفاری فر

این آموزش ها اختصاصی هستند و ساعت ها برای هر آموزش  زحمت کشیده شده  پس با کپی کردن  بدون ذکر منبع تمامی زحمات مدرسین  و ما رو ضایع نکنین  . با تشکر
بهمن ۱۲, ۱۳۹۶

آموزش جاوا برای برنامه نویسان اندروید – جلسه دوم

توضیحات (comments) اکثر زبان‌های برنامه نویسی اجازه درج توضیحات را می‌دهند و جاوا از این قاعده مستثنا نیست. توضیحات می‌توانند چند خطی باشند، با /* آغاز […]
دی ۱۵, ۱۳۹۶

آموزش جاوا برای برنامه نویسان اندروید – جلسه اول

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