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

[ + افزودن آگهی متنی جدید ]




صفحه 4 از 7 اولاول 1234567 آخرآخر
نمايش نتايج 31 به 40 از 64

نام تاپيک: همه چیز در مورد جاوا

  1. #31
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    چرا جاوا براي اينترنت اهميت دارد

    اينترنت جاوا را پيشاپيش زبانهاي برنامه نويسي قرار داد و در عوض جاوا
    تاثيرات پيش برنده اي روي اينترنت داشته است . دليل اين امر بسيار ساده است :
    جاوا سبب گسترش فضاي حركت اشيائ بطور آزادانه در فضاي الكترونيكي مي شود . در
    يك شبكه ، دو نوع طبقه بندي وسيع از اشيائ در حال انتقال بين سرويس دهنده و
    رايانه شخصي شما وجود دارد : اطلاعات غير فعال (passive) و برنامه هاي فعال
    (active) و پويا (dynamic) . بعنوان نمونه هنگاميكه پست الكترونيكي e-mail خود
    را مرور مي كنيد ، در حال بررسي داده هاي غير فعال هستيد . حتي هنگاميكه يك
    برنامه را گرفته و بار گذاري مي كنيد ، ماداميكه از آن برنامه استفاده نكنيد
    كدهاي برنامه بعنوان داده هاي غير فعال هستند . اما نوع دوم اشيائي كه امكان
    انتقال به رايانه شخصي شما را دارند ، برنامه هاي پويا و خود اجرا هستند . چنين
    برنامه اي اگر چه توسط سرويس دهنده ارائه و انتقال مي يابد ، اما يك عامل فعال
    روي رايانه سرويس گيرنده است . بعنوان نمونه سرويس دهنده قادر است برنامه اي را
    بوجود آورد كه اطلاعات و داده هاي ارسالي توسط سرويس دهنده را نمايش دهد .
    بهمان اندازه كه برنامه هاي پويا و شبكه اي شده موردتوجه قرار گرفته اند بهمان
    نسبت نيز دچار مشكلاتي در زمينه امنيت و قابليت حمل هستند . قبل از جاوا ، فضاي
    الكترونيكي شامل فقط نيمي از وروديهايي بود كه اكنون وجود دارند . همانطوريكه
    خواهيد ديد ، جاوا درها را براي يك شكل جديد از برنامه ها باز نموده است :
    ريز برنامه ها (applets) .

    ريز برنامه ها و برنامه هاي كاربردي جاوا
    از جاوا براي توليد دو نوع برنامه مي توان استفاده نمود: برنامه هاي كاربردي
    (applications) و ريز برنامه ها (applets) . يك برنامه كاربردي برنامه اي است كه
    روي رايانه شما و تحت نظارت يك سيستم عامل اجرا مي شود . بدين ترتيب يك برنامه
    كاربردي ايجاد شده توسط جاوا مشابه برنامه هاي ايجاد شده توسط Cو C++و خواهد
    بود. هنگاميكه از جاوا براي توليد برنامه هاي كاربردي استفاده ميكنيم ، تفاوتهاي
    زيادي بين اين زبان و ساير زبانهاي برنامه نويسي مشاهده نمي كنيم . اما ويژگي
    جاوا براي توليد ريز برنامه ها داراي اهميت زيادي است . يك ريز برنامه (applet)
    يك برنامه كاربردي است كه براي انتقال و حركت روي اينترنت و اجرا توسط يك
    مرورگر قابل انطباق با جاوا طراحي شده است . يك ريز برنامه در حقيقت يك برنامه
    ظريف جاوا است كه بطور پويا در سراسر اينترنت قابل بارگذاري باشد ، درست مثل
    يك تصوير، يك فايل صوتي يا يك قطعه ويدئويي .تفاوت اصلي در اينست كه ريزبرنامه
    يك برنامه كاربردي هوشمند است و شباهتي با يك تصوير متحرك يا فايل رسانه اي
    ندارد . بعبارت ديگر اين برنامه قادر به عكس العمل در برابر ورودي كاربر و
    ايجاد تغييرات پويا است .
    ريز برنامه هاي جاوا بسيار جالب و هيجان انگيزند و قادرند دو مشكل اصلي يعني
    امنيت و قابليت حمل را پشت سر بگذارند . قبل از ادامه بحث بهتر است مفهوم اصلي
    اين دو مشكل را بيشتر مورد بررسي قرار دهيم .

    امنيت
    همانطوريكه خودتان هشيار هستيد ، هرگاه كه يك برنامه عادي (normal) را بار
    گذاري مي كنيد با خطر يك حمله ويروسي مواجه خواهيد شد . قبل از جاوا اكثر
    كاربران ، برنامه هاي قابل اجرا را بتناوب گرفته و بارگذاري مي كردند و قبل از
    اجرا براي ويروس زدايي اقدام به اسكن (Scanning) برنامه ها مي كردند . با اين
    حال بسياري از اين كاربران نسبت به حمله ويروسها به سيستم خود نگران بودند .
    علاوه بر ويروسها ، نوع ديگري از برنامه هاي مزاحم وجود دارند كه بايد در
    برابر آنها نيز ايمن ماند . اين نوع برنامه ها قادرند اطلاعات خصوصي نظير شماره
    كارتهاي اعتباري ،ترازهاي حساب بانكي و كلمات عبور براي جستجو درسيستم فايلهاي
    محلي رايانه شما را كشف نموده و استفاده نمايند . جاوا توسط ايجاد يك ديواره
    آتش (firewall) بين رايانه شما و برنامه شبكه اي شده ، بر اين مشكلات فائق آمده
    است .
    هنگاميكه از يك مرورگر قابل انطباق با جاوا در وب استفاده ميكنيد، ميتوانيد
    با اطمينان ريزبرنامه هاي جاوا را بارگذاري نماييد، بدون اينكه از حمله ويروسها
    و برنامه هاي مزاحم واهمه اي داشته باشيد . جاوا يك برنامه خاص جاوا را به محيط
    خاص اجرايي مربوطه اش منحصر كرده و اجازه دسترسي اين برنامه به ساير بخشهاي
    رايانه را نمي دهد و بدين ترتيب مشكل امنيت را حل كرده است . توانايي بارگذاري
    ريز برنامه ها بصورت مطمئن يكي از مهمترين جنبه هاي جاوا است .

    قابليت حمل
    انواع مختلفي از رايانه ها و سيستم هاي عامل در سراسر دنيا مورد استفاده قرار
    مي گيرند و بسياري ازاين سيستم ها با اينترنت متصل ميشوند. براي اينكه برنامه ها
    بتوانند بطور پويا روي انواع مختلف سيستم ها و محيط هاي عامل متصل به اينترنت
    بارگذاري شوند ، وسائلي براي توليد كدهاي اجرايي و قابل حمل مورد نياز است .
    همانطوريكه بزودي خواهيد ديد ، همان مكانيسمي كه امنيت را بوجود مي آورد سبب
    ايجاد قابليت حمل نيز خواهد شد . در حقيقت راه حل جاوا براي اين مسائل هم زيبا

  2. #32
    مهمان
    تاريخ عضويت
    Mar 2005
    پست ها
    513

    پيش فرض

    سلام نستا جان ممنون از مقاله ها
    اگر امکان داره مطلب درباره J2ME هم اگر داريد بگذاريد.
    با تشکر از زحمات شما

  3. #33
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    معرفي روشها

    موضوع روشها بسيار گسترده است ، چون جاوا قدرت و انعطاف پذيري زيادي به
    روشها داده است .
    شكل عمومي يك روش بقرار زير است :

    type name(parameter-list ){
    // body of method
    }


    در اينجا ، type مشخص كننده نوع داده برگشت شده توسط روش است . اين نوع هر
    گونه نوع معتبر شامل نوع كلاسي كه ايجاد كرده ايد ، مي تواند باشد . اگر روش
    مقداري را برنمي گرداند ، نوع برگشتي آن بايد Void باشد . نام روش توسط name
    مشخص مي شود . اين نام مي تواند هر نوع شناسه مجاز باشد ، البته غير از آنهايي
    كه قبلا" براي اقلام داخل قلمرو جاري استفاده شده باشند . parameter-list يك
    پس آيند نوع و شناسه است كه توسط يك كاما جدا مي شود . پارامترها ضرورتا"
    متغيرهايي هستند كه مقدار آرگومان (arguments) گذركرده در روش ، هنگام فراخواني
    را جذب مي كنند . اگر روش فاقد پارامتر باشد ، آنگاه فهرست پارامتر تهي خواهد
    بود .
    روشهايي كه بجاي void يك نوع برگشتي (return) دارند ، مقداري را به روال
    فراخواننده با استفاده از شكل بعدي دستور return باز مي گردانند .

    return value;


    در اينجا value همان مقدار برگشتي است .

    افزودن يك روش به كلاس Box
    اگرچه خيلي خوب است كه كلاسي ايجاد نماييم كه فقط شامل داده باشد، اما بندرت
    چنين حالتي پيش مي آيد. در اغلب اوقات از روشها براي دسترسي به متغيرهاي نمونه
    تعريف شده توسط كلاس ، استفاده مي كنيم . در حقيقت ، روشها توصيف گر رابط به
    اكثر كلاسها هستند . اين امر به پياده سازان كلاس امكان مي دهد تا صفحه بندي
    مشخصي از ساختارهاي داده داخلي را در پشت تجريدهاي (abstractions) روشهاي
    زيباتر پنهان سازند . علاوه بر تعريف روشهايي كه دسترسي به داده ها را بوجود
    مي آورند ، مي توانيد روشهايي را تعريف كنيد كه بصورت داخلي و توسط خود كلاس
    مورد استفاده قرار مي گيرند .
    اجازه دهيد با اضافه كردن يك روش به كلاس Box شروع كنيم . ممكن است درمثالهاي
    قبلي شما هم احساس كرده باشيد كه محاسبه فضاي اشغالي (Volume) يك box چيزي
    است كه توسط كلاس Box در مقايسه با كلاس BoxDemo بسيار راحت تر مديريت مي شود .
    بعلاوه ، چون فضاي اشغالي يك box بستگي به اندازه آن دارد، بنظر مي رسد كه بهتر
    است كلاس Box اين محاسبه را انجام دهد . براي انجام اينكار، بايد بصورت زير يك
    روش را به Box اضافه نماييد :

    + // This program includes a method inside the box class.
    +
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // display volume of a box
    + void volume )({
    + System.out.print("Volume is ");
    + System.out.println(width * height * depth);
    + }
    + }
    +
    + class BoxDemo3 {
    + public static void main(String args[] ){
    + Box mybox1 = new Box)(;
    + Box mybox2 = new Box)(;
    +
    + // assign values to mybox1's instance variables
    + mybox1.width = 10;
    + mybox1.height = 20;
    + mybox1.depth = 15;
    +
    + /* assign different values to mybox2's
    + instance variables */
    + mybox2.width = 3;
    + mybox2.height = 6;
    + mybox2.depth = 9;
    +
    + // display volume of first box
    + mybox1.volume)(;
    +
    + // display volume of second box
    + mybox2.volume)(;
    + }
    + }


    اين برنامه خروجي زير را توليد مي كند كه مطابق خروجي روايت قبلي همين
    برنامه است . Volume is 3000
    Volume is 162

    با دقت به دو خط بعدي كدها نگاه كنيد :

    + mybox1.volume)(;
    + mybox2.volume)(;


    خط اول در اينجا ، روش ()volume را روي mybox1 قرار مي دهد. يعني كه اين خط
    ()volume را با استفاده از نام شي ئ كه بدنبال آن عملگر نقطه اي قرار گرفته است
    نسبت به شي ئ mybox1 فراخواني مي كند . بدين ترتيب ، فراخواني ()mybox1.volume
    فضاي اشغالي boxتوصيف شده بوسيله mybox1را نمايش داده و فراخواني ()mybox2.volume
    فضاي اشغالي box توصيف شده بوسيله mybox2 را نمايش مي دهد. هر بار كه ()volume
    خواسته شود ، فضاي اشغالي يك box مشخص را نمايش خواهد داد .
    اگر با مفهوم فراخواني يك روش نا آشنا هستيد ، توصيف بعدي موضوع را تا حد
    زيادي روشن مي كند . هنگاميكه ()mybox1.volume اجرا شود، سيستم حسن اجراي جاوا
    كنترل را به كدي كه داخل ()volume تعريف شده منتقل مي كند . پس از اينكه دستور
    داخل ()volume اجرا شود ، كنترل به روال فراخواننده برگشته و اجراي خط كد بعد
    از فراخواني از سر گرفته خواهد شد . از يك نقطه نظر عمومي ، يك روش (method)
    شيوه جاوا براي پياده سازي زير روالهاست (subroutions) .
    يك نكته مهم درون روش ()volume وجود دارد : ارجاع به متغيرهاي نمونه width height
    و depthو بصورت مستقيم بدون يك نام شي ئ يا يك عملگر نقطه اي پيش آيند
    ( قبلي ) انجام مي گيرد. وقتي يك روش از متغير نمونه اي كه توسط كلاس خود تعريف
    شده استفاده مي كند ، اينكار را بطور مستقيم و بدون ارجاع صريح به يك شي ئ و
    بدون استفاده از عملگر نقطه اي انجام مي دهد . اگر درباره آن بينديشيد ، بخوبي
    درك مي كنيد . يك روش همواره نسبت به شي ئ از كلاس خود قرار داده مي شود . وقتي
    اين تعبيه اتفاق مي افتد ، شي ئ شناخته شده است . بدين ترتيب ، داخل يك روش
    نيازي به مشخص كردن يك شي ئ براي بار دوم وجود ندارد . اين بدان معني است كه width
    ، height،و depthو داخل ()volume بطور صريحي به كپيهاي متغيرهاي پيدا شده
    در آن شي ئ كه ()volume را فعال مي كند ، ارجاع مي كنند .
    اجازه دهيد مجددا" مرور كنيم : وقتي يك متغير نمونه بوسيله كدي كه بخشي از
    كلاسي كه آن متغير نمونه در آن تعريف شده نيست مورد دسترسي قرار مي گيرد
    اينكار بايد از طريق يك شي ئ با استفاده از عملگر نقطه اي انجام شود. اما ، وقتي
    كه متغير نمونه بوسيله كدي كه بخشي از همان كلاس مربوط به آن متغير نمونه
    باشد مورد دسترسي قرار گيرد ، به آن متغير مي توان بطور مستقيم ارجاع نمود .
    همين مورد براي بررسي روشها نيز پياده سازي مي شود .

    برگرداندن يك مقدار
    در حاليكه پياده سازي ()volume محاسبه فضاي اشغالي يك box داخل كلاس مربوطه Box
    را حركت مي دهد ، اما بهترين راه نيست . بعنوان مثال ، اگر بخش ديگري از
    برنامه شما بخواهد فضاي اشغالي يك box را بداند ، اما مقدار آن را نمايش ندهد
    چكار بايد كرد ? يك راه بهتر براي پياده سازي ()volume اين است كه آن را وادار
    كنيم تا فضاي اشغالي box را محاسبه نموده و نتيجه را به فراخواننده (caller)
    برگرداند . مثال بعدي كه روايت پيشرفته تر برنامه قبلي است ، همين كار را انجام
    مي دهد :

    + // Now/ volume )(returns the volume of a box.
    +
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // compute and return volume
    + doble volume )({
    + return width * height * depth;
    + }
    + }
    +
    + class BoxDemo4 {
    + public static void main(String args[] ){
    + Box mybox1 = new Box)(;
    + Box mybox2 = new Box)(;
    + double vol;
    +
    + // assign values to mybox1's instance variables
    + mybox1.width = 10;
    + mybox1.height = 20;
    + mybox1.depth = 15;
    +
    + /* assign different values to mybox2's
    + instance variables */
    + mybox2.width = 3;
    + mybox2.height = 6;
    + mybox2.depth = 9;
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("Volume is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("Volume is " + vol);
    + }
    + }


    همانطوريكه مي بينيد ، وقتي ()volume فراخواني مي شود ، در سمت راست يك
    دستور انتساب قرار مي گيرد. در سمت چپ يك متغير است كه در اين حالت vol ميباشد
    كه مقدار برگشتي توسط ()volume را دريافت مي كند . بدين ترتيب ، بعد از اجراي + vol = mybox.volume)(;

    مقدار ()mybox1.volume برابر 3000 شده و سپس اين مقدار در vol ذخيره خواهد
    شد .
    دو نكته مهم درباره برگرداندن مقادير وجود دارد :
    ؤ نوع داده برگشت شده توسط يك روش بايد با نوع برگشتي مشخص شده توسط همان
    روش سازگار باشد. بعنوان مثال ، اگر نوع برگشتي برخي روشها boolean باشد، نبايد
    يك عدد صحيح را برگردان نماييد .
    ؤ متغيري كه مقدار برگشتي توسط يك روش را دريافت مي كند ( نظير vol در اين
    مثال ) بايد همچنين با نوع برگشتي مشخص شده براي آن روش سازگاري داشته باشد .
    يك نكته ديگر : برنامه قبلي را مي توان كمي كاراتر نيز نوشت زيرا هيچ نياز
    واقعي براي متغير vol وجود ندارد . فراخواني ()volume را مي شد بطور مستقيم
    ( بصورت زير ) در دستور ()println استفاده نمود :

    + System.out.println("Volume is " + mybox1.volume90);


    در اين حالت ، هنگاميكه ()println اجرا مي شود ، ()mybox1.volume بصورت
    خودكار فراخواني شده و مقدار آن به ()println گذر مي كند .

    افزودن روشي كه پارامترها را مي گيرد
    اگرچه برخي روشها نيازي به پارامترها ندارند ، اما اكثر روشها اين نياز را
    دارند . پارامترها به يك روش ، امكان عمومي شدن را مي دهند . يعني كه يك روش
    پارامتردار (parameterized) مي تواند روي طيف گوناگوني از داده ها عمل كرده و
    يا در شرايط نسبتا" گوناگوني مورد استفاده قرار گيرد . براي مشاهده اين نكته
    از يك برنامه خيلي ساده استفاده مي كنيم . در اينجا روشي را مشاهده مي كنيد كه
    مربع عدد 10 را برمي گرداند :

    + int square)(
    + {
    + return 10 * 10;
    + }


    در حاليكه اين روش در حقيقت مقدار مربع عدد 10 را برمي گرداند ، اما كاربرد
    آن بسيار محدود است . اما اگر روش را بگونه اي تغيير دهيد كه پارامتري را بگيرد
    همانطوريكه خواهيد ديد ، مي توانيد ()square را مفيدتر بسازيد .

    + int square(int i)
    + {
    + return i * i;
    + }


    اكنون ()square مربع هر مقداري را كه فراخواني شود ، برمي گرداند . يعني كه
    اكنون ()square يك روش با هدف عمومي است كه مي تواند مربع هر مقدار عدد صحيح
    ( بجاي فقط عدد 10 ) را محاسبه مي كند .
    مثالي را در زير مشاهده مي كنيد :

    + int x/ y;
    + x = square(5); // x equals 25
    + x = square(9); // x equals 81
    + y = 2;
    + x = square(y); // x equals 4


    در اولين فراخواني ()square مقدار 5 به پاارمتر i گذر مي كند . در دومين
    فراخواني ، i مقدار 9 را دريافت مي كند . سومين فراخواني مقدار y كه در اين
    مثال 2 است را مي گذراند . همانطوريكه اين مثالها نشان مي دهند، ()square قادر
    است مربع هر داده اي را كه از آن مي گذرد ، برگرداند .
    مهم است كه دو اصطلاح پارامتر (parameter) و آرگومان (argument) را بوضوح
    درك نماييم . پارامتر ، متغيري است كه توسط يك روش تعريف شده و هنگام فراخواني
    روش ، مقداري را دريافت مي كند. بعنوان مثال ، در ()square، i يك پارامتر است .
    آرگومان مقداري است كه هنگام فراخواني يك روش به آن گذر مي كند . بعنوان مثال
    (َ100)square مقدار100 را بعنوان يك آرگومان گذر ميدهد. داخل ()square، پارامتر i
    مقداري را دريافت مي كند .
    مي توانيد يك روش پارامتردار را براي توسعه كلاس Box مورداستفاده قرار دهيد.
    در مثالهاي قبلي ، ابعاد هر يك box بايد بصورت جداگانه با استفاده از يك سلسله
    دستورات نظير مورد زير ، تعيين مي شدند :

    + mybox1.width = 10;
    + mybox1.height = 20;
    + mybox1.depth = 15;


    اگرچه اين كد كاري مي كند، اما بدو دليل داراي اشكال است . اول اينكه ، اين
    كد بد تركيب و مستعد خطا است . بعنوان مثال ، خيلي ساده امكان دارد تعيين يك
    بعد فراموش شود . دوم اينكه در برنامه هاي خوب طراحي شده جاوا ، متغيرهاي نمونه
    فقط از طريق روشهاي تعريف شده توسط كلاس خودشان قابل دسترسي هستند . در آينده
    قادر خواهيد بود تا رفتار يك روش را تغيير دهيد ، اما نمي توانيد رفتار يك
    متغير نمونه بي حفاظ ( افشا شده ) را تغيير دهيد .
    بنابراين ، يك راه بهتر براي تعيين ابعاد يك box اين است كه يك روش ايجاد
    نماييم كه ابعادbox را در پارامترهاي خود نگهداشته و هر متغير نمونه را بصورت
    مناسبي تعيين نمايد . اين برنامه توسط برنامه زير ، پياده سازي خواهد شد :

    + // This program uses a parameterized method.
    +
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // compute and return volume
    + double volume )({
    + return width * height * depth;
    + }
    + // sets dimensions of box
    + void setDim(double w/ double h/ double d ){
    + width = w;
    + height = h;
    + depth = d;
    + }
    + }
    +
    + class BoxDemo5 {
    + public static void main(String args[] ){
    + Box mybox1 = new Box)(;
    + Box mybox2 = new Box)(;
    + double vol;
    +
    + // initialize each box
    + mybox.setDim(10/ 20/ 15);
    + mybox.setDim(3/ 6/ 9);
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("Volume is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("Volume is " + vol);
    + }
    + }


    همانطوريكه مي بينيد ، روش ()setDim براي تعيين ابعاد هر box مورد استفاده
    قرار مي گيرد . بعنوان مثال وقتي

    + mybox1.setDim(10/ 20/ 15);


    اجرا مي شود ، عدد 10 به پارامتر w ، 20به h و 15به d كپي مي شود . آنگاه heightو depthو نسبت داده

  4. #34
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    نقل قول نوشته شده توسط PersianAmir
    سلام نستا جان
    پس بقيه مطلب چي شد!!!
    سلام آقا اینا رو فعلا داشته باش .بخون تا بدا باز بگذارم این دیگه از پایه هست.

  5. #35
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    سازندگان Constructors

    خيلي خسته كننده است كه هربار يك نمونه ايجاد مي شود كليه متغيرهاي يك كلاس
    را مقداردهي اوليه نماييم . حتي هنگاميكه توابع سهل الاستفاده نظير ()setDim را
    اضافه مي كنيد ، بسيار ساده تر و دقيق تر آن است كه كليه تنظيمات در زمان ايجاد
    اوليه شي ئ انجام شود . چون نياز به مقدار دهي اوليه بسيار رايج است ، جاوا به
    اشيائ امكان مي دهد تا در زمان ايجاد شدن خودشان را مقدار دهي اوليه نمايند .
    اين مقدار دهي اوليه خودكار بااستفاده از سازنده (constructor) انجام مي گيرد.
    يك سازنده بمحض ايجاد يك شي ئ بلافاصله آن را مقدار دهي اوليه مي نمايد . اين
    سازنده نام همان كلاسي را كه در آن قرار گرفته اختيار نموده و از نظر صرف و نحو
    مشابه يك روش است . وقتي يكبار سازنده اي را تعريف نماييد، بطور خودكار بلافاصله
    پس از ايجاد يك شي ئ و قبل از اينكه عملگر new تكميل شود ، فراخواني خواهد شد .
    سازندگان كمي بنظر عجيب مي آيند زيرا فاقد نوع برگشتي و حتي فاقد void هستند .
    بخاطر اينكه نوع مجازي برگشتي سازنده يك كلاس ، همان نوع خود كلاس مي باشد . اين
    وظيفه سازنده است كه وضعيت داخلي يك شي ئ را بگونه اي مقدار دهي اوليه نمايد كه
    كدي كه يك نمونه را ايجاد مي كند ، بلافاصله يك شي ئ كاملا" قابل استفاده و مقدار
    دهي شده بوجود آورد .
    مي توانيد مثال مربوط به Box را طوري بازنويسي كنيد كه ابعاد يك box وقتي
    كه يك شي ئ ساخته مي شود ، بطور خودكار مقدار دهي اوليه شوند . براي انجام اين
    كار ، يك سازنده را جايگزين ()setDim نماييد . كار را با تعريف يك سازنده ساده
    شروع مي كنيم كه بسادگي ابعاد هر box را بهمان مقادير تنظيم ميكند. اين روايت
    جديد بقرار زير است :

    + /* Here/ Box uses a constructor to initialize the
    + dimensions of a box.
    + */
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // This is the constructor for Box.
    + Box )({
    + System.out.println("Constructing Box");
    + width = 10;
    + height = 10;
    + depth = 10;
    + }
    +
    + // compute and return volume
    + double volume )({
    + return width * height * depth;
    + }
    + }
    +
    + class BoxDemo6 {
    + public static void main(String args[] ){
    + // declare/ allocate/ and initialize Box objects
    + Box mybox1 = new Box)(;
    + Box mybox2 = new Box)(;
    +
    + double vol;
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("volume is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("volume is " + vol);
    + }
    + }


    پس از اجراي اين برنامه ، خروجي آن بصورت زير خواهد شد :

    Constructing Box
    Constructing Box
    Volume is 1000
    Volume is 1000


    همانطوريكه مشاهده مي كنيد ، mybox1و mybox2و هنگام ايجاد شدن بوسيله ()Box
    مقداردهي اوليه ميشوند. چون سازنده به همه boxها همان ابعاد يعني 10x10x10
    را مي دهد ، هم mybox1 و هم mybox2 فضاي اشغالي يكساني خواهند داشت . دستور
    ()println داخل ()Box فقط بمنظور توصيف بهتر قرار گرفته است . اكثر توابع
    سازنده چيزي را نمايش نمي دهند. آنها فقط خيلي ساده ، اشيائ را مقدار دهي اوليه
    مي كنند .
    قبل از ادامه بحث ، عملگر new را مجددا" بررسي ميكنيم . همانطوريكه مي دانيد
    هنگاميكه يك شي ئ را اختصاص مي دهيد ، شكل عمومي زير را مشاهده مي كنيد :

    class-var = new classname)(;


    اكنون مي توانيد بفهميد چرا پرانتزها بعد از نام كلاس مورد نيازند . آنچه
    واقعا" اتفاق مي افتد اين است كه سازنده كلاس فراخواني شده است . بدين ترتيب
    در خط

    + Box mybox1 = new Box)(;


    ()newBox سازنده ()Box را فراخواني مي كند اگر يك سازنده براي كلاس تعريف
    نشود ، آنگاه جاوا يك سازنده پيش فرض براي كلاس ايجاد مي كند . بهمين دليل خط
    قبلي از كد در روايتهاي اوليه Box كه هنوز يك سازنده تعريف نشده بود ، كار
    مي كرد. سازنده پيش فرض بطور خودكار كليه متغيرهاي نمونه را با عدد صفر، مقدار
    دهي اوليه مي نمايد . سازنده پيش فرض غالبا" براي كلاسهاي ساده كفايت مي كند
    اما براي كلاسهاي پيچيده تر كفايت نمي كند . هر بار كه سازنده خاص خود را تعريف
    كنيد ، ديگر سازنده پيش فرض استفاده نخواهد شد .

    سازندگان پارامتردار شده (parameterized)
    هنگاميكه سازنده ()Box در مثال قبلي يك شي ئ Box را مقدار دهي اوليه مي كند
    چندان سودمند نيست ، زيرا كليه box ها ، ابعاد يكساني دارند . آنچه مورد نياز
    است ، روشي براي ساخت اشيائ Box داراي ابعاد گوناگون است . ساده ترين راه
    افزودن پارامترها به سازنده است . همانطوريكه احتمالا" حدس مي زنيد ، اين عمل
    سودمندي سازندگان را افزايش مي دهد . بعنوان مثال ، روايت بعدي Box يك سازنده
    پارامتردار شده را تعريف مي كند كه ابعاد يك box را همانطوريكه آن پارامترها
    مشخص شده اند ، تنظيم مي كند. دقت كافي به چگونگي ايجاد اشيائ Box داشته باشيد.

    + /* Here/ Box uses a parameterized constructor to
    + initialize the dimensions of a box.
    + */
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // This is the constructor for Box.
    + Box(double w/ double h/ double d ){
    + width = w;
    + height = h;
    + depth = d;
    + }
    +
    + // compute and return volume
    + double volume )({
    + return width * height * depth;
    + }
    + }
    +
    + class BoxDemo7 {
    + public static void main(String args[] ){
    + // declare/ allocate/ and initialize Box objects
    + Box mybox1 = new Box(10/ 20/ 15);
    + Box mybox2 = new Box(3/ 6/ 9);
    +
    + double vol;
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("volume is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("volume is " + vol);
    + }
    + }


    خروجي اين برنامه بقرار زير است :

    Volume is 3000
    Volume is 162


    همانطوريكه مي بينيد ، هر شي ئ همانطوريكه در پارامترهاي سازنده اش مشخص شده
    مقدار دهي اوليه خواهد شد .

    + Box mybox1 = new Box(10/ 20/ 15);


    هنگاميكه new شي ئ را ايجاد مي كند ، مقادير 10 ، 20 ، 15 به سازنده ()Box
    گذر مي كنند . بدين ترتيب كپي خاص mybox1از widthز، height،و depthو بترتيب

  6. #36
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    واژه كليدي This

    گاهي لازم است يك روش به شي ئ كه آن را فراخواني نموده ، ارجاع نمايد . براي
    اين منظور، جاوا واژه كليدي this را تعريف كرده است . this را مي توان داخل هر
    روشي براي ارجاع به شي ئ جاري (current) استفاده نمود. يعني this همواره ارجاعي
    است به شي ئ كه روش روي آن فراخواني شده است . مي توانيد از this هر جايي كه
    ارجاع به يك شي ئ از نوع كلاس جاري مجاز باشد ، استفاده نماييد .
    براي اينكه بفهميد this به چه چيزي ارجاع مي كند ، روايت بعدي ()Box را در
    نظر بگيريد :

    + // A redundant use of this.
    + Box(double w/ double h/ double d ){
    + this.width = w;
    + this.height = h;
    + this.depth = d;
    + }


    اين روايت ()Box دقيقا" مثل روايت اوليه كار مي كند . استفاده از this به
    ندرت انجام گرفته اما كاملا"صحت دارد. داخل ()Box همواره this به شي ئ فراخوانده
    شده ارجاع مي كند . اگرچه در اين مثالها بندرت پيش آمده مي كند . اگرچه در اين
    مثالها بندرت پيش آمده ، اما this در ساير متون بسيار مفيد است .

    مخفي نمودن متغير نمونه
    حتما" مي دانيد كه اعلان دو متغير محلي با يك نام داخل يك قلمرو يا قلمروهاي
    بسته شده ، غير مجاز است . بطرز خيلي جالبي ، مي توانيد متغيرهاي محلي شامل
    پارامترهاي رسمي براي روشها ، داشته باشيد كه با اسامي متغيرهاي نمونه كلاسها
    مشترك باشند . اما ، هنگاميكه يك متغير محلي همان اسم متغير نمونه را داشته
    باشد، متغير محلي ، متغير نمونه را مخفي مي سازد. بهمين دليل بود كه از width height
    و depthو بعنوان اسامي پارامترهاي سازنده ()Box داخل كلاس Box استفاده
    نكرديم . اگر از آنها بهمين روش استفاده مي كرديم ، آنگاه width به پارامتر
    رسمي ارجاع مي كرد و متغير نمونه width را مخفي مي ساخت . اگرچه آسان تر است
    كه از اسامي متفاوت استفاده كنيم ، اما راه حل ديگري براي چنين شرايطي وجود
    دارد . چون this امكان ارجاع مستقيم به شي ئ را به شما مي دهد ، مي توانيد با
    استفاده از آن هر نوع تصادف و يكي شدن اسامي بين متغيرهاي نمونه و متغيرهاي
    محلي را رفع نماييد . بعنوان مثال ، در اينجا روايت ديگري از ()Box وجود دارد
    كه از width، height،و depthو بعنوان اسامي پارامترها استفاده نموده و آنگاه
    از this براي دستيابي به متغيرهاي نمونه با همين اسامي استفاده كرده است :

    + // Use this to resolve name-space collisions.
    + Box(double width/ doublee height/ double depth ){
    + this.width = width;
    + this.height = height;
    + this.depth = depth;
    + }


    احتياط . استفاده از this درچنين متني ممكن است گاهي گيج كننده بشود و برخي
    از برنامه نويسان مراقب هستند تا از اسامي متغيرهاي محلي و پارامترهاي رسمي كه
    متغيرهاي نمونه را مخفي مي سازند ، استفاده نكنند. البته ، ساير برنامه نويسان
    طور ديگري فكر ميكنند . يعني معتقدند استفاده از اسامي مشترك براي وضوح ، ايده
    خوبي است و از this براي غلبه بر مخفي سازي متغير نمونه بهره ميگيرند. انتخاب
    يكي از دو روش با سليقه شما ارتباط دارد .
    اگرچه this در مثالهايي كه تاكنون نشان داده ايم ارزش زيادي نداشته ، اما در واهد بود .

  7. #37
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    جمع آوري زباله Garbage collection

    از آنجاييكه اشيائ بصورت پويا و با استفاده از عملگر new تخصيص مي يابند
    ممكن است تعجب كنيد كه چگونه اين اشيائ خراب شده و حافظه آنها آزاد شده و
    مجددا" تخصيص مي يابد . در برخي زبانها ، نظير C++ ، اشيائ تخصيص يافته پويا
    بايد بصورت دستي و با استفاده از عملگر delete رها شوند . جاوا در اين مورد
    روش متفاوتي دارد. جاوا اينكار را بصورت خودكار براي شما انجام مي دهد. تكنيكي
    كه تخصيص مجدد اشيائرا انجام ميدهد،اصطلاحا" جمع آوري زباله garbage collection
    ناميده مي شود. طرز كار آن بشرح بعدي مي باشد : وقتي كه هيچگونه ارجاعي به يك
    شي ئ وجود نداشته باشد، فرض مي شود كه آن شي ئ نيازي به خراب كردن اشيائ بصراحت
    نظير زبان C++ وجود ندارد . جمع آوري زباله طي اجراي برنامه شما فقط بصورت
    پراكنده و گاه و بيگاه اتفاق مي افتد ( البته اصلا" اگر اتفاق بيفتد ) . اين
    جريان بخاطر اينكه يك يا دو شي ئ وجود دارند كه ديگر استفاده نمي شوند ، اتفاق
    نمي افتد . بعلاوه ، پياده سازيهاي گوناگون حين اجراي جاوا ، شيوه هاي متفاوتي
    در جمع آوري زباله بوجود مي آورد، اما در غالب اوقات هنگام نوشتن برنامه هايتان اين موضوع نگراني نداشته باشيد .

  8. #38
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    روش ()finalize

    گاهي لازم است تا يك شي ئ هنگاميكه در حال خراب شدن است ، يك عمل خاصي را
    انجام دهد. بعنوان مثال ، ممكن است يك شي ئ دربرگيرنده منابع غير جاوا نظير يك
    دستگيره فايل (file handle) يا فونت كاراكتر ويندوز باشد، و مي خواهيد اطمينان
    يابيد كه قبل از اينكه آن شي ئ خراب شود ، منابع فوق آزاد شوند . براي اداره
    چنين شرايطي ، جاوا مكانيسمي تحت نام finalization ( تمام كننده ) فراهم آورده
    است .
    با استفاده از اين مكانيسم ، مي توانيد عمليات مشخصي را تعريف نماييد كه
    زمانيكه يك شي ئ در شرف مرمت شدن توسط جمع آوري زباله است ، اتفاق بيفتند .
    براي افزودن يك تمام كننده (finalizer) به يك كلاس ، خيلي راحت كافي است تا
    روش ()finalize را تعريف نماييد. سيستم حين اجراي جاوا هرگاه در شرف چرخش مجدد
    يك شي ئ از كلاسي باشد ، اين روش را فراخواني مي كند . داخل روش ()finalize شما
    عملياتي را مشخص مي كنيد كه بايد درست قبل از خرابي آن شي ئ انجام گيرند . جمع
    كننده زباله (garbage collector) بطور متناوب اجرا شده و بدنبال اشيايي ميگردد
    كه ديگر مورد ارجاع هيچيك از شرايط اجرايي نبوده و يا غير مستقيم توسط ساير
    اشيائ ارجاع شده باشند . درست قبل از اينكه يك داراي رها شود، سيستم حين اجراي
    جاوا روش ()finalize را روي شي ئ فراخواني مي كند .
    شكل عمومي روش ()finalize بقرار زير مي باشد :

    protected void finalize)(
    {
    // finalization code here
    }


    دراينجا واژه كليدي protected توصيفگري است كه از دسترسي به روش ()finalize
    توسط كدهاي تعريف شده خارج از كلاس جلوگيري مي كند.
    مهم است بدانيد كه روش ()finalize درست مقدم بر جمع آوري زباله فراخواني
    مي شود . بعنوان مثال وقتي يك شي ئ از قلمرو خارج مي شود ، اين روش فراخواني
    نخواهد شد.اين بدان معني است كه نميتوانيد تشخيص بدهيد كه چه زماني ()finalize
    اجرا خواهد شد و يا اصلا" اجرا نخواهد شد . بنابراين ، برنامه شما بايد ساير
    وسائل براي آزاد كردن منابع سيستم مورد استفاده شي ئ را تدارك ببيند . برنامه
    نبايد براي عمليات برنامه اي عادي ، متكي به روش ()finalize باشد .
    نكته : اگر با C++ آشنايي داريد، پس مي دانيد كه C++ امكان مي دهد تا يك خراب
    كننده (destructor) براي يك كلاس تعريف نماييد ، كه هرگاه يك شي ئ خارج
    از قلمرو قرار گيرد ، فراخواني خواهد شد . جاوا چنين كاري نكرده و از
    اين ايده پشتيباني نمي كند . روش ()finalize فقط به يك تابع خراب كننده
    نزديك مي شود. به مرور كه تجربه بيشتري با جاوا كسب مي كنيد ، مي بينيد
    كه نياز به توابع خراب كننده بسيار كم است زيرا زير سيستم جمع آوري حسن انجام مي دهد .

  9. #39
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    دو دستور كنترلي

    اين دو دستور يك جنبه بسيار مهم از جاوا يعني بلوك هاي كد (block of code)
    را تشريح مي كنند .

    دستور if(if statement()
    دستور if در جاوا نظير دستور lf درهر يك از زبانهاي برنامه نويسي كار ميكند.
    بعلاوه اين دستور از نظر قواعد صرف و نحو با دستور ifدر Cرو C++و شباهت دارد .
    ساده ترين شكل آن را در زير مشاهده مي كنيد :

    if( condition )statement;


    در اينجا شرط (condition) يك عبارت بولي (Boolean) است . اگر شرايط درست
    باشد ، آنگاه دستور اجرا خواهدشد . اگر شرايط صحيح نباشد ، آنگاه دستور پشت سر
    گذاشته مي شود (bypassed). بعنوان مثال در نظر بگيريد :

    + if(num < 100 )println("num is less then 100");


    در اين حالت ، اگر متغير num شامل مقداري كوچكتر از 100 باشد ، عبارت شرطي
    درست بوده و ()println اجرا خواهد شد . اگر num شامل مقداري بزرگتر يا مساوي 100
    باشد ، آنگاه روش ()println پشت سر گذاشته مي شود .
    بعدا" خواهيد ديد كه جاوا يك ضميمه كامل از عملگرهاي رابطه اي (Relational)
    تعريف مي كند كه قابل استفاده در عبارات شرطي هستند . چند نمونه از آنها بشرح
    زير است :


    |
    مفهوم آن | عملگر |
    |
    كوچكتر از | < |
    |
    بزرگتر از | > |
    |
    مساوي با | = = |


    دقت داشته باشيد كه آزمايش تساوي با علامت تساوي انجام مي گيرد .
    در زير برنامه اي مشاهده مي كنيد كه يك دستور if را توصيف كرده است :

    + /*
    + Demonstrate the if.
    + Call this file "IfSample.java".
    + */
    + class IfSample {
    + public static void main( String args [] ){
    + int x/ y;
    +
    + x = 10;
    + y = 20;
    + if(x < y )System.out.println("x is less than y");
    +
    + x = x * 2;
    + if(x == y )System.out.println("x now equal to y");
    +
    + x = x * 2;
    + if(x > y )System.out.println("x now greater than y");
    +
    + // this won't display anything
    + if(x == y )System.out.println("you won't see this");
    + }
    + }


    خروجي توليد شده توسط اين برنامه بشرح زير خواهد بود :

    x is less than y
    x now equal to y
    x now greater than y


    به يك نكته ديگر در اين برنامه دقت نماييد . خط

    + int x/ y;


    دو متغير xو yو را با استفاده از فهرست جدا شده با كاما اعلان مي كند .

    حلقه for
    شايد از تجربيات قبلي در برنامه نويسي تا بحال فهميده باشيد كه دستورات
    حلقه (loop statements) يك بخش بسيار مهم در كليه زبانهاي برنامه نويسي هستند.
    جاوا نيز از اين قاعده مستثني نيست . در حقيقت همانگونه كه در فصل پنجم خواهيد
    ديد ، جاوا يك دسته بندي پر قدرت از ساختارهاي حلقه اي عرضه مي كند . شايد از
    همه اين ساختارها سليس تر حلقه for باشد . اگر با Cو C++و آشنايي داشته باشيد
    خوشحال خواهيد شد كه بدانيد نحوه كار حلقه هاي for در جاوا با اين زبانها مشابه
    است . اگر با Cو C++و آشنايي نداريد ، باز هم فراگيري استفاده از حلقه for
    بسيار ساده خواهد بود . ساده ترين شكل اين حلقه بقرار زير مي باشد :

    for( initialization; condition )statement;


    دستور اجراي مكرر شرايط مقداردهي اوليه
    بخش مقداردهي اوليه در يك حلقه در معمول ترين شكل خود يك مقدار اوليه را در
    يك متغير كنترل اگر ماحصل اين آزمايش صحيح باشد ، حلقه for به تكرار خود ادامه
    مي دهد . اگر حاصل ناصحيح باشد ، حلقه متوقف خواهد شد . عبارت اجراي مكرر
    تعيين كننده اين است كه متغير كنترل حلقه پس از هر بار تكرار حلقه چگونه تغيير
    خواهد كرد . برنامه كوتاه زير توصيف كننده يك حلقه for مي باشد :

    + /*
    + Demonstrate the for loop.
    + Call this file "ForTest.java".
    + */
    + class ForTest {
    + public static void main(String args [] ){
    + int x;
    +
    + for(x = 0; x<10; x = x+1)
    + System.out.println("This is x :" + x);
    + }
    + }


    اين برنامه ، خروجي زير را توليد خواهد نمود :

    this is x:0
    this is x:1
    this is x:2
    this is x:3
    this is x:4
    this is x:5
    this is x:6
    this is x:7
    this is x:8
    this is x:9


    در اين مثال ، x متغير كنترل حلقه است . در بخش مقداردهي اوليه حلقه for به
    اين متغير مقدار صفر داده مي شود. در شروع هر تكرار ( شامل مرحله اول ) آزمايش
    شرط 10 اجرا خواهد شد ، و سپس بخش اجراي مكرر حلقه اجرا خواهد شد . اين روال ماداميكه
    آزمايش شرايط صحيح باشد ، ادامه مي يابد .
    بعنوان يك نكته قابل تامل ،در برنامه هاي حرفه اي نوشته شده توسط جاوا بندرت
    بخش اجراي مكرر حلقه بصورت برنامه قبلي نوشته مي شود . يعني شما بندرت دستوري
    مثل عبارت زير خواهيد ديد :

    + x = x + 1;


    دليل اين است كه جاوا دربرگيرنده يك عملگر افزايشي ويژه است كه همين عمليات
    را بطور موثرتري انجام مي دهد . اين عملگر افزايشي ++ است ( دو علامت جمع در
    كنار هم ) . عملگر افزايشي ، عملوند خود را يكي يكي افزايش خواهد داد . با
    استفاده از عملگر افزايشي دستور قبلي را مي توان بصورت زير نوشت :

    + x++;


    بدين ترتيب for در برنامه قبلي را معمولا" بصورت زير مي نويسند :

    + for(x = 0; x<10; x++)


    ممكن است بخواهيد اين مورد را آزمايش كنيد . همانطوريكه خواهيد ديد ، حلقه
    درست مثل قبل و بهمان ترتيب اجرا خواهد شد .
    جاوا همچنين يك عملگر كاهشي (decrement) فراهم نموده كه باعلامت (- -) مشخص يكي يكي كاهش خواهد داد .

  10. #40
    مهمان
    تاريخ عضويت
    Mar 2005
    پست ها
    513

    پيش فرض

    سلام نستا جان
    من اين مطالبي که مي نويسيد را قبلا از روي يک منبع ديگه خواندم.
    من منتظر قسمت J2ME هستم
    برنامه نويسي براي موبايل :idea:

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •