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

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




صفحه 5 از 7 اولاول 1234567 آخرآخر
نمايش نتايج 41 به 50 از 64

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

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

    پيش فرض

    كلاس پشته A stack class

    اگرچه كلاس Box براي نشان دادن اجزائضروري يك كلاس مناسب بود، اما فاقد ارزش
    عملي است . همانطوريكه از بحث برنامه نويسي شي ئ گرا (oop) بياد داريد ، يكي از
    مزاياي بسيار مهم oop، كپسول سازي داده ها و كدي است كه با اين داده ها سر و كار
    دارد . كلاس مكانيسمي است كه كپسول سازي در جاوا انجام مي گيرد. با خلق يك كلاس
    شما نوع جديدي از داده را ايجاد مي كنيد كه هم طبيعت داده هاي مورد استفاده و
    هم روالهاي ضروري براي كار با داده ها را تعريف مي كند . علاوه بر اين ، روشها
    يك رابط پايدار و كنترل شده به داده هاي كلاس را تعريف مي كنند . بدين ترتيب
    مي توانيد از طريق روشهاي يك كلاس از آن كلاس استفاده نماييد بدون اينكه نگران
    جزئيات پياده سازي كلاس باشيد و يا اينكه نگران باشيد كه داده ها واقعا" چگونه
    داخل آن كلاس مديريت مي شوند .
    در يك مضمون ، يك كلاس شبيه يك " موتور داده "(data engine() است . براي كار
    با موتور از طريق ابزارهاي كنترل كننده اش ، نيازي به دانش و اشراف كامل بر
    چگونگي كاركرد داخلي موتور نداريد . در حقيقت ، از آنجاييكه جزئيات پنهان
    شده اند ، مي توان كاركرد داخلي آن را بر حسب نياز تغيير داد . ماداميكه كد شما
    كلاس را از طريق روشهايش استفاده مي كند ، مي توان جزئيات دروني را بدون ايجاد
    اثرات جانبي در خارج كلاس تغيير داد .
    پشته (stack) ، داده ها را بر حسب آنچه اول آمده آخر بيرون مي رود ذخيره
    مي كند . بنابراين پشته شبيه يك پشته از بشقابهاي روي هم چيده است . اولين
    بشقاب قرار گرفته روي ميز ، آخرين بشقابي است كه از آنجا خارج مي شود . پشته ها
    بطور سنتي از طريق دو عمل نشاندن (push) و پراندن (pop) كنترل مي شوند . براي
    نهادن يك قلم روي پشته ، از push استفاده مي كنيم . براي بيرون آوردن يك قلم
    از پشته ، از pop استفاده مي كنيم . خواهيد ديد كه كپسول سازي كل مكانيسم پشته
    بسيار ساده است .
    در اينجا يك كلاس تحت نام stack وجود دارد كه يك پشته را براي اعداد صحيح
    پياده سازي مي كند :

    + // This class defines an integer stack that can hold 10 values.
    + class Stack {
    + int stck[] = new int[10];
    + int tos;
    +
    + // Initialize top-of-stack
    + Stack )({
    + tos =- 1;
    + }
    +
    + // Pash an item onto the stack
    + void push(int item ){
    + if(tos==9)
    + System.out.println("Stack is full.");
    + else
    + stck[++tos] = item;
    + }
    +
    + // Popan item from the stack
    + int pop )({
    + if(tos < 0 ){
    + System.out.println("Stack underflow.");
    + return 0;
    + }
    + else
    + return stck[tos--];
    + }
    + }


    همانطوريكه مي بينيد ، كلاس stack دو قلم داده و سه روش را تعريف مي كند .
    پشته اعداد صحيح توسط آرايه stck نگهداري مي شود . اين آرايه توسط متغير tos
    نمايه سازي مي شود كه همواره نمايه بالاي پشته را نشان مي دهد . سازنده ()stack
    متغير tos را با عدد 1- مقدار دهي اوليه مي كند ، كه نشان دهنده يك پشته خالي
    است . روش ()push يك قلم را روي پشته مي نشاند . براي بازيابي يك قلم از پشته
    روش ()pop را فراخواني مي كنيم . از آنجاييكه دسترسي به پشته توسط ()push و
    ()pop انجام مي گيرد ، اين حقيقت كه پشته توسط يك آرايه نگهداري مي شود واقعا"
    با استفاده از پشته مرتبط نيست . بعنوان مثال پشته بايد در يك ساختار پيچيده تر
    داده نگهداري شود ، نظير فهرست پيوندي (linked list) ، اما رابط تعريف شده
    بوسيله ()push و ()pop همچنان دست نخورده باقي مي ماند .
    كلاس Test stack كه در زير نشان داده ايم ، نشان دهنده كلاس stack است . اين
    كلاس دو پشته عدد صحيح ايجاد كرده ، برخي مقادير را روي هر يك قرار داده و سپس
    آن مقادير را مي پراند .

    + class TestStack {
    + public static void main(String args[] ){
    + Stack mystack1 = new Stack)(;
    + Stack mystack2 = new Stack)(;
    +
    + // push some numbers onto the stack
    + for(int i=0; i<10; i++ )mystack1.push(i);
    + for(int i=10; i<20; i++ )mystack2.push(i);
    +
    + // pop those numbers off the stack
    + System.out.println("Stack in mystack1:");
    + for(int i=0; i<10; i++)
    + System.out.println(mystack1.pop))(;
    +
    + System.out.println("Stack in mystack2:");
    + for(int i=0; i<10; i++)
    + System.out.println(mystack2.pop))(;
    + }
    + }


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

    Stack in mystack1:
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    Stack in mystack2:
    19
    18
    17
    16
    15
    14
    13
    12
    11
    10


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

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

    پيش فرض

    نگاهي دقيق تر به روشها و كلاسها

    از اين پس موضوعات مربوط به روشها، شامل انباشتن (over loading) ، گذر دادن
    پارامترها(parameter passing) و خود فراخواني يا همان برگشت پذيري (recursion)
    را بررسي مي كنيم . و درباره كنترل دسترسي ، استفاده از واژه كليدي Static و
    يكي از مهمترين كلاسهاي توكار جاوا يعني string بحت خواهيم نمود .

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

    پيش فرض

    انباشتن روشها

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

    + // Demonstrate method overloading.
    + class OverloadDemo {
    + void test )({
    + System.out.println("No parameters");
    + }
    +
    + // Overload test for one integer parameter.
    + void test(int a ){
    + System.out.println("a :" + a);
    + }
    +
    + // Overload test for two integer parameters.
    + void test(int a/ int b ){
    + System.out.println("a and b :" + a + " " + b);
    + }
    +
    + // Overload test for a double parameter.
    + double test(double a ){
    + System.out.println("double a :" + a);
    + return a*a;
    + }
    + }
    +
    + class Overload {
    + public static void main(String args[] ){
    + OverloadDemo ob = new OverloadDemo)(;
    + double result;
    +
    + // call all versions of test)(
    + ob.test)(;
    + ob.test(10);
    + ob.test(10/ 20);
    + result = ob.test(123.2);
    + System.out.println("Result of ob.test(123.2 " + result);
    + }
    + }


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

    No parameters
    a :10
    a and b :10 20
    double a :123.2
    Result of ob.test(123.2 15178.2


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

    + // Automatic type conversions apply to overloading.
    + class OverloadDemo {
    + void test )({
    + System.out.println("No parameters");
    + }
    +
    + // Overload test for two integer parameters.
    + void test(int a/ int b ){
    + System.out.println("a and b :" + a + " " + b);
    + }
    +
    + // Overload test for a double parameter.
    + double test(double a ){
    + System.out.println("Inside test(double )a :" + a);
    + }
    + }
    +
    + class Overload {
    + public static void main(String args[] ){
    + OverloadDemo ob = new OverloadDemo)(;
    + int i = 88;
    +
    + ob.test)(;
    + ob.test(10/ 20);
    +
    + ob.test(i); // this will invoke test(double)
    + ob.test(123.2); // this will invoke test(double)
    + }
    + }


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

    No parameters
    a and b :10 20
    Inside test(double )a :88
    Inside test(double )a :123.2


    همانطوريكه مشاهده ميكنيد، اين روايت ازoverloadDemo تعريف كننده (int)test
    نمي باشد . بنابراين هنگاميكه ()test همراه با يك آرگومان عدد صحيح داخل overload
    فراخواني مي شود ، هيچ روش تطبيق دهنده پيدا نخواهد شد . اما جاوا
    مي تواند بطور خودكار يك عدد صحيح را به يك double تبديل نمايد و اين تبديل
    براي رفع فراخواني مورداستفاده قرار ميگيرد. بنابراين ، بعد از آنكه (int)test
    پيدا نمي شود ، جاوا i را به double ارتقائ داده و آنگاه (double)test را
    فراخواني مي كند . البته اگر (int)test تعريف شده بود ، فراخواني مي شد . جاوا
    فقط در صورتي كه هيچ تطبيق دقيقي پيدا نكند ، از تبديل خودكار انواع استفاده
    مي كند .
    انباشتن روش از چند شكلي هم پشتيباني مي كند زيرا يكي از شيوه هايي است كه
    جاوا توسط آن الگوي " يك رابط و چندين روش " را پياده سازي مي كند . براي درك
    اين مطلب ، مورد بعدي را درنظر بگيريد.در زبانهايي كه از انباشتن روش پشتيباني
    نمي كنند ، هر روش بايد يك اسم منحصر بفرد داشته باشد . اما غالبا" مي خواهيد
    يك روش را براي چندين نوع داده مختلف پياده سازي نماييد . مثلا" تابع قدر مطلق
    را در نظر بگيريد . در زبانهايي كه از انباشتن روش پشتيباني نمي كنند معمولا"
    سه يا چند روايت مختلف از اين تابع وجود دارد ، كه هر يك اسم متفاوتي اختيار
    مي كند . بعنوان نمونه ، در زبان C تابع ()abs قدر مطلق يك عدد صحيح را
    برمي گرداند ، ()labs قدر مطلق يك عدد صحيح long را برمي گرداند ، ()fabs قدر
    مطلق يك عدد اعشاري را برمي گرداند . از آنجاييكه زبان C از انباشتن روش
    پشتيباني نمي كند ، هر تابع بايد اسم خاص خودش را داشته باشد ، حتي اگر هر سه
    تابع يك وظيفه واحد را انجام دهند. از نظر ذهني اين حالت ، شرايط پيچيده تري را
    نسبت به آنچه واقعا" وجود دارد ، ايجاب مي كند . اگرچه مفهوم اصلي اين توابع
    يكسان است ، اما همچنان مجبوريد سه اسم را بخاطر بسپاريد . اين شرايط در جاوا
    اتفاق نمي افتد ، زيرا تمامي روش هاي مربوط به قدر مطلق مي توانند از يك اسم
    واحد استفاده نمايند . در حقيقت كتابخانه كلاس استاندارد جاوا Java's standard)
    (class library شامل يك روش قدر مطلق موسوم به ()abs مي باشد . اين روش توسط
    كلاس Math در جاوا انباشته شده تا كليه انواع رقمي را مديريت نمايد . جاوا بر
    اساس نوع آرگومان ، تصميم مي گيرد كه كدام روايت از ()abs را فراخواني نمايد .
    ارزش انباشتن روشها در اين است كه مي توان با استفاده از يك اسم مشترك به
    كليه روشهاي مرتبط با هم دسترسي پيدا كرد. بدين ترتيب ،اسم abs معرف عمل عمومي
    است كه اجرا خواهد شد . تعيين روايت مخصوص براي هر يك از شرايط خاص بر عهده
    كامپايلر مي باشد . برنامه نويس فقط كافي است تا اعمال عمومي كه بايد انجام
    شوند را بخاطر بسپارد . بدين ترتيب با استفاده از مفهوم چند شكلي ، چندين اسم
    به يك اسم خلاصه شده اند. اگرچه اين مثال بسيار ساده بود، امااگر مفهوم زيربنايي
    آن را گسترش دهيد ، مي فهميد كه انباشتن روشها تا چه حد در مديريت پيچيدگي در
    برنامه ها سودمند و كارساز است .
    وقتي يك روش را انباشته مي كنيد ، هر يك از روايتهاي آن روش قادرند هر نوع
    عمل مورد نظر شما را انجام دهند. هيچ قانوني مبني بر اينكه روشهاي انباشته شده
    بايد با يكديگر مرتبط باشند، وجود ندارد. اما از نقطه نظر روش شناسي ، انباشتن
    روشها مستلزم يك نوع ارتباط است . بدين ترتيب ، اگرچه مي توانيد از يك اسم
    مشترك براي انباشتن روشهاي غير مرتبط با هم استفاده نماييد ، ولي بهتر است اين
    كار را انجام ندهيد . بعنوان مثال ، مي توانيد از اسم sqr براي ايجاد روشهايي
    كه مربع يك عدد صحيح و ريشه دوم عدد اعشاري را برمي گرداند ، استفاده نماييد .
    اما اين دو عمل كاملا" با يكديگر متفاوتند. بكارگيري انباشتن روش درچنين مواقعي
    سبب از دست رفتن هدف اصلي اين كار خواهد شد. در عمل ، فقط عمليات كاملا" نزديك
    بهم را انباشته مي كنيد .

    انباشتن سازندگان Overloading constructors
    علاوه بر انباشتن روشهاي معمولي ، مي توان روشهاي سازنده را نيز انباشته
    نمود. در حقيقت براي اكثر كلاسهايي كه در دنياي واقعي ايجاد مي كنيد ، سازندگان
    انباشته شده بجاي استثنائ يك عادت هستند .
    در زير آخرين روايت 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;
    + }
    + }


    همانطوريكه مي بينيد ، سازنده ()Box نيازمند سه پارامتر است . يعني كليه
    اعلانات اشيائ Box بايد سه آرگومان به سازنده ()Box بگذرانند . بعنوان مثال
    دستور بعدي فعلا" نامعتبر است : + Box ob = new Box)(;

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

    + /* Here/ Box defines three constructors to initialize
    + the dimensions of a box various ways.
    + */
    + class Box {
    + double width;
    + double height;
    + double depth;
    + // constructor used when all dimensions specified
    + Box(double w/ double h/ double d ){
    + width = w;
    + height = h;
    + depth = d;
    + }
    +
    + // constructor used when no dimensions specified
    + Box )({
    + width =- 1; // use- 1 to indicate
    + height =- 1; // an uninitialized
    + depth =- 1; // box
    + }
    +
    + // constructor used when cube is created
    + Box(double len ){
    + width = height = deoth = len;
    + }
    +
    + // compute and return volume
    + double volume )({
    + return width * height * depth;
    + }
    + }
    +
    + class OverloadDemo {
    + public static void main(String args[] ){
    + // create boxes using the various constructors
    + Box mybox1 = new Box(10/ 20/ 15);
    + Box mybox2 = new Box)(;
    + Box mycube = new Box(7);
    +
    + double vol;
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("Volume of mybox1 is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("Volume of mybox2 is " + vol);
    +
    + // get volume of cube
    + vol = mycube.volume)(;
    + System.out.println("Volume of mycube is " + vol);
    + }
    + }


    خروجي اين برنامه بقرار زير مي باشد :

    Volume of mybox1 is 3000
    Volume of mybox2 is- 1
    Volume of mycube is 343

    ne اجرا مي شود ، پارامترها را مشخص

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

    پيش فرض

    استفاده از اشيائ بعنوان پارامترها

    تاكنون فقط از انواع ساده بعنوان پارامترهاي روشها استفاده كرده ايم . اما
    هم صحيح و هم معمول است كه اشيائ را نيز به روشها گذر دهيم . بعنوان مثال
    برنامه ساده بعدي را در نظر بگيريد :

    + // Objects may be passed to methods.
    + class Test {
    + int a/ b;
    + Test(int i/ int j ){
    + a = i;
    + b = j;
    + }
    +
    + // return true if o is equal to the invoking object
    + boolean equals(Test o ){
    + if(o.a == a && o.b == b )return true;
    + else return false;
    + }
    + }
    +
    + class PassOb {
    + public static void main(String args[] ){
    + Test ob1 = new Test(100/ 22);
    +
    + Test ob2 = new Test(100/ 22);
    + Test ob3 = new Test-(1/- 1);
    +
    + System.out.println("ob1 == ob2 :" + ob1.equals(ob2));
    +
    + System.out.println("ob1 == ob3 :" + ob1.equals(ob3));
    + }
    + }


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

    ob1 == ob2 :true
    ob1 == ob3 :false


    همانطوريكه مشاهده ميكنيد، روش ()equals داخل Test دو شي ئ را از نظر كيفيت
    مقايسه نموده و نتيجه را برمي گرداند . يعني اين روش ، شي ئ فراخواننده را با
    شيئي كه گذر كرده مقايسه مي كند . اگر محتوي آندو يكسان باشد ، آنگاه روش true
    را برمي گرداند . در غير اينصورت false را برمي گرداند . توجه داشته باشيد كه
    پارامتر o در ()equals مشخص كننده Test بعنوان نوع آن مي باشد. اگرچه Test يك
    نوع كلاس ايجاد شده توسط برنامه است ،اما بعنوان انواع توكار جاوا و بهمان روش
    مورد استفاده قرار گرفته است .
    يكي از رايجترين كاربردهاي پارامترهاي شيئي مربوط به سازندگان است . غالبا"
    ممكن است بخواهيد يك شي ئ جديد را بسازيد طوري كه اين شي ئ در ابتدا نظير يك شي ئ
    موجود باشد. براي انجام اينكار بايد يك تابع سازنده تعريف نماييد كه يك شي ئ از
    كلاس خود را بعنوان يك پارامتر انتخاب مي كند . بعنوان مثال ، روايت بعدي از
    ()Box به يك شي ئ امكان داده تا آغازگر ديگري باشد :

    + // Here/ Box allows one object to initialize another.
    + class Box {
    + double width;
    + double height;
    + double depth;
    +
    + // construct clone of an object
    + Box(Box ob ){ // pass object to constructor
    + width = ob.width;
    + height = ob.height;
    + depth = ob.depth;
    + }
    +
    + // constructor used when all dimensions specified
    + Box(double w/ double h/ double d ){
    + width = w;
    + height = h;
    + depth = d;
    + }
    +
    + // constructor used when no dimensions specified
    + Box )({
    + width =- 1; // use- 1 to indicate
    + height =- 1; // an uninitialized
    + depth =- 1; // box
    + }
    +
    + // constructor used when cube is created
    + Box(double len ){
    + width = height = depth
    + }
    +
    + // compute and return volume
    + double volume )({
    + return width * height * depth;
    + }
    + }
    +
    + class OverloadCons2 {
    + public static void main(String args[] ){
    + // create boxes using the various constructors
    + Box mybox1 = new Box(10/ 20/ 15);
    + Box mybox2 = new Box)(;
    + Box mycube = new Box(7);
    +
    + Box myclone = new Box(mybox1);
    +
    + double vol;
    +
    + // get volume of first box
    + vol = mybox1.volume)(;
    + System.out.println("Volume of mybox1 is " + vol);
    +
    + // get volume of second box
    + vol = mybox2.volume)(;
    + System.out.println("Volume of mybox2 is " + vol);
    +
    + // get volume of cube
    + vol = mycube.volume)(;
    + System.out.println("Volume of cube is " + vol);
    +
    + // get volume of clone
    + vol = myclone.volume)(;
    + System.out.println("Volume of clone is " + vol);
    + }
    + }


    بعدا" خواهيد ديد كه وقتي شروع به ايجاد كلاسهاي خود مي نماييد، معمولا" براي
    اينكه اجازه دهيم تا اشيائ بصورتي موثر و آسان ساخته شوند ، لازم است اشكال هاي سازنده را فراهم آوريم .

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

    پيش فرض

    نگاهي دقيق تر به گذر دادن آرگومانها

    در كل ، دو راه وجود دارد تا يك زبان كامپيوتري يك آرگومان را به يك زير
    روال گذر دهد. اولين راه " فراخواني بوسيله مقدار "(call-by-value() است . اين
    روش مقدار يك آرگومان را در پارامتر رسمي زير روال كپي مي كند . بنابراين
    تغييراتي كه روي پارامتر زير روال اعمال مي شود ، تاثيري بر آرگوماني كه براي
    فراخواني آن استفاده شده نخواهد داشت . دومين راهي كه يك آرگومان مي تواند گذر
    كند " فراخواني بوسيله ارجاع "(call-by-reference() است . در اين روش ، ارجاع
    به يك آرگومان ( نه مقدار آن آرگومان ) به پارامتر گذر داده مي شود . داخل زير
    روال از اين ارجاع براي دسترسي به آرگومان واقعي مشخص شده در فراخواني استفاده
    مي شود . اين بدان معني است كه تغييرات اعمال شده روي پارامتر ، روي آرگوماني
    كه براي فراخواني زير روال استفاده شده ، تاثير خواهد داشت . خواهيد ديد كه
    جاوا از هر دو روش برحسب اينكه چه چيزي گذر كرده باشد ، استفاده مي كند .
    در جاوا ، وقتي يك نوع ساده را به يك روش گذر مي دهيد ، اين نوع بوسيله
    مقدارش گذر ميكند . بنابراين ، آنچه براي پارامتري كه آرگومان را دريافت ميكند
    اتفاق بيفتد هيچ تاثيري در خارج از روش نخواهد داشت . بعنوان مثال ، برنامه
    بعدي را در نظر بگيريد :

    + // Simple types are passed by value.
    + class Test {
    + void meth(int i/ int j ){
    + i *= 2;
    + j /= 2;
    + }
    + }
    +
    + class CallByValue {
    + public static void main(String args[] ){
    + Test ob = new Test)(;
    + int a = 15/ b = 20;
    +
    + System.out.println("a and b before call :" +
    + a + " " + b);
    +
    + ob.meth(a/ b);
    +
    + System.out.println("a and b after call :" +
    + a + " " + b);
    + }
    + }


    خروجي برنامه فوق بقرار زير مي باشد :

    a and b before call :15 20
    a and b after call :15 20


    بخوبي مشاهده مي كنيد كه عمليات اتفاق افتاده داخل ()meth هيچ تاثيري روي
    مقادير aو bو در فراخواني استفاده شده اند، نخواهد داشت . در اينجا مقادير آنها
    به 30 و 10 تغيير نمي يابد .
    وقتي يك شي ئ را به يك روش گذر مي دهيد ، شرايط بطور مهيجي تغيير مي كند
    زيرا اشيائ بوسيله ارجاعشان گذر داده مي شوند . بياد آوريد كه وقتي يك متغير
    از يك نوع كلاس ايجاد مي كنيد ، شما فقط يك ارجاع به شي ئ خلق مي كنيد . بدين
    ترتيب ، وقتي اين ارجاع را به يك روش گذر مي دهيد ، پارامتري كه آن را دريافت
    مي كند . بهمان شي ئ ارجاع مي كند كه توسط آرگومان به آن ارجاع شده بود . اين
    بدان معني است كه اشيائ با استفاده از طريقه " فراخواني بوسيله ارجاع " به
    روشها گذر داده مي شوند. تغييرات اشيائ داخل روش سبب تغيير شيئي است كه بعنوان
    يك آرگومان استفاده شده است . بعنوان مثال ، برنامه بعدي را در نظر بگيريد :

    + // Objects are passed by reference.
    +
    + class Test {
    + int a/ b;
    +
    + Test(int i/ int j ){
    + a = i;
    + b = j;
    + }
    +
    + // pass an object
    + void meth(Test o ){
    + o.a *= 2;
    + o.b /= 2;
    + }
    + }
    +
    + class CallByRef {
    + public static void main(String args[] ){
    + Test ob = new Test(15/ 20);
    +
    + System.out.println("ob.a and ob.b before call :" +
    + ob.a + " " + ob.b);
    +
    + ob.meth(ob);
    +
    + System.out.println("ob.a and ob.b after call :" +
    + ob.a + " " + ob.b);


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

    ob.a and ob.b before call :15 20
    ob.a and ob.b after call :30 10


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

    برگرداندن اشيائ
    يك روش قادر است هر نوع داده شامل انواع كلاسي كه ايجاد ميكنيد را برگرداند.
    بعنوان مثال ، در برنامه بعدي روش ()incrByTen يك شي ئ را برمي گرداند كه در آن
    مقدار a ده واحد بزرگتر از مقدار آن در شي ئ فراخواننده است .

    + // Returning an object.
    + class Test {
    + int a;
    +
    + Test(int i ){
    + a = i;
    + }
    +
    + Test incrByTen )({
    + Test temp = new Test(a+10);
    + return temp;
    + }
    + }
    +
    + class RetOb {
    + public static void main(String args[] ){
    + Test ob1 = new Test(2);
    + Test ob2;
    + ob2 = ob1.incrByTen)(;
    + System.out.println("ob1.a :" + ob1.a);
    + System.out.println("ob2.a :" + ob2.a);
    +
    + ob2 = ob2.incrByTen)(;
    + System.out.println("ob2.a after second increase :"
    + + ob2.a);
    + }
    + }


    خروجي برنامه فوق بقرار زير مي باشد :

    ob1.a :2
    ob2.a :12
    ob2.a after second increase :22


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

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

    پيش فرض

    نقل قول نوشته شده توسط PersianAmir
    سلام نستا جان
    من اين مطالبي که مي نويسيد را قبلا از روي يک منبع ديگه خواندم.
    من منتظر قسمت J2ME هستم
    برنامه نويسي براي موبايل :idea:
    سلام دوست عزیز شما فرمودید که از پای شروع کن من از پای شروع کردم برای موبایل باید صبر کنین که آماده کنم .من همه چی‌ می‌گذارم اگه باشه واسه موبایل هم میدم .یعنی‌ شما همه اینرو بلدین فقط گیرتون موبایل هست من دارم از بالا میم پائین

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

    پيش فرض

    طراحي و توليد برنامه هاي سازمان مقياس ( Enterprise-Level -- منظور نرم افزارهائي است كه با تكنولوژي هاي چند لايه [N-tier ] و براي محيطهائي وسيع با كاربردهاي مختلف - پلت فرمهاي متفاوت و كاربران غير همگن طراحي ميشوند ) با استفاده از تكنولوژي نه چندان جديد J2EE برخلاف محيطهاي ديگر ( ابزارهاي مايكروسافت و بورلند ) فوق العاده پيچيده و دشوار است و عملا هزينه اي كه بر دپارتمان نرم افزار تحميل ميكند در مقابل ديگر ابزارهاي به هيچ وجه توجيه پذير نيست و شايد تنها كليد حياتي و راز بقاي جاوا مستقل از محيط بودن ( Platform-independent ) آن است . برنامه نويسان حرفه اي جاوا بسيار نادر و حرفه اي هاي EJB بسيار كمياب هستند . ( EJB = enterprise Jaba beans -- با قدري تسامح و بيان غير دقيق تكنولوژي مشابه COM مايكروسافت در عالم جاوا )

    اما هر چه بود گذشت !!! امروز جاوا به لطف آپتيمال جي ( OptimalJ ) داراي ابزاري براي توسعه سريع نرم افزار ها و كامپوننتها ( اجزاي مستقل توليد نرم افزار ) است كه با ابزارهاي مشابه مايكروسافت و بورلند قابل مقايسه و در برخي موارد برتر است !

    آپتيمال جي داراي محيط توسعه اي Model-Driven است . به اين مفهوم كه شما درست مثل يك گرافيست ( شايد هم درست مثل يك مدير با تدبير !!! ) نرم افزار خود را نقاشي (!) ميكنيد و آپتيمال جي زحمت نگارش كد جاوا را خواهد كشيد آنهم نه پس از صدور دستوري شبيه به كامپايل ! خير ! .. درست همزمان ! ... شما مولفه هاي نرم افزار و رابطه بين آنها و همچنين مجموعه وظايف هر قطعه را * طراحي* ميكنيد و همزمان محيط آپتيمال جي براي شما كد مينويسد .

    مژده اي هم براي توسعه دهندگان برنامه هاي وب ( Web Application ) ! آپتيمال جي به همراه خود يك وب سرور قدرتمند دروني و همچنين يك موتور اجراي سرولت ( Servlet Engine ) دارد كه شما را از همه چيز غير از خود بي نياز ميكند . ضمن اينكه نگران توسعه نرم افزار خود روي محيطهاي اجراي آن نباشيد ! ( Deployment ) آپتيمال جي با توجه به نوع پروژه و مواد مورد نياز آن براي آماده سازي محيط اجرا همه كارها را خودكار كرده است . شما ميتوانيد برنامه هاي خود ( به عنوان مثال سيستم مديريت اي ميل يك وب سايت ) را روي محيط خود بنويسيد و تست كنيد و با يك كيليك به محيط مورد نظر منتقل كنيد بدون اينكه درگير تهيه پكيجهاي كامل از امكانات نرم افزار و انتقال آنها باشيد .

    آپتيمال جي درست مثل محيطهاي توسعه نرم افزار مبتني بر كامپوننت ( Component - Based ) مثل سي شارپ - ويژوال سي - دلفي - ويژوال بيسيك و ... داراي يك محيط توسعه مجتمع نرم افزار ( IDE ) قدرتمند است ( بسيار شبيه به محيط دات نت ) اما آنچه شما با آن سر و كار داريد اجزاي UML است نه كامپوننتهاي ويژوال و غير ويژوال و توابع و پراسيجر ها و كلاسها ! اين ابزار با بقيه محيطهاي توليد UML مثل رشنال رز يا مدل ميكر كاملا سازگار بوده و اگر طرحي براي برنامه دات نت خود آماده كرده ايد حالا ميتوانيد فقط با استفاده از همان طرح و قابليتهاي بي نظير آپتيمال جي با چند كيليك ساده و نهايتا نوشتن چند سطر كد مجموعه برنامه را با جاوا هم داشته باشيد !!!

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

    قابليت توليد شي گرا و مبتني بر مدل EJB ها و همچنين صفحات ديناميك وب مبتني بر جاوا ( Java server pages ) از ديگر توانائي هاي قابل ذكر اين مجموعه است . ( نكته قابل توجه اين است كه محيط مبتني بر مدل آپتيمال جي براي طراحي كلاسهاي پايه اي مثل EJB ها بر خلاف محصولات مايكروسافت و بورلند فقط بدنه و رابطهاي كلاس را توليد نميكند ! بلكه زحمت نگارش كد را هم از دوش شما برداشته و بطور كامل كدهاي جاواي كلاس مورد نظر را طبق طراحي شما مينويسد ! .. بدين وسيله حتي بدون نگارش يك خط كد جاوا و داشتن آشنائي مقدماتي با جاوا و تخصص در زمينه UML ميتوانيد حرفه اي ترين EJB ها را جهت استفاده سازماني يا كاربردهائي مثل JSP توليد كنيد ! شعار *پروداكتيويتي اصل است* اينبار واقعا تحقق پيدا كرده است ! )

    نكته قابل ذكر ديگر قدرت و سرعت توليد برنامه هاي رابط بانك اطلاعاتي ست . با ابزارهاي كارآمد موجود در اين مجموعه ( Domain Model و توليد Database Model از آن ) حتي آپتيمال جي كدهاي اسكوئل لازم براي توليد بانكها - جدولها و View هاي شما را هم خواهد نوشت . نيازي به دانستن SQL براي طراحي بانك اطلاعاتي نيست !

    آپتيمال جي ( درست مثل ويژوال استوديو دات نت ) در يك محيط يكتا به شما امكان توليد برنامه هاي كاربردي ( فرض كنيد يك برنامه گرافيكي يا ويرايش فيلم يا حتي JphotoShop !!!! ) و برنامه هاي وب ( فرض كنيد سيستم ثبت نام آنلاين دانشجويان براي انتخاب واحد ) و همچنين نرم افزاهائي سازگار با Portal Device ها ( مثل موبايلهاي نه چندان جديدي كه وارد ايران هم شده اند يا PDA ها ) ميدهد . چه صفحه وب توليد كنيد چه رابط بانك اطلاعاتي براي يك كامپيوتر بزرگ ( Main Frame ) چه براي يك موبايل كوچك برنامه بنويسيد محيط و ابزار شما يكتاست .

    قابليتهاي بسيار زياد و البته شگفت انگيز اين محيط چون سازگاري با Struts Framework و Controller checks in an XML resource file و Model View Controller و Remote View Manager و Presentation Model و plug-in to Macromedia’s Dreamweaver و ..و..و.. را با مراجعه به وب سايت Compuware و مطالعه توضيحات موجود خواهيد ديد . ( [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

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

    پيش فرض

    سلام نستا جان
    گير من دقيقا سر J2ME هست.
    چون J2ME امکانات Java را ندارد و محدودتر هست.

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

    پيش فرض

    سلام
    نستا جان اگر امکان داره منبع اين مقالاتي که گذاشتي را هم به من بده تا من کل مقاله هايي که مي نويسي را يکجا داشته باشم.
    با تشکر

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

    پيش فرض

    نقل قول نوشته شده توسط PersianAmir
    سلام نستا جان
    گير من دقيقا سر J2ME هست.
    چون J2ME امکانات Java را ندارد و محدودتر هست.
    سلام منبع یکی‌ نیست خیلی‌ هاش داره اگه توجه کنی‌ .چند تش هم مال خودم هست ولی‌ اکثرا زیرش یا بالاش سایت داره شما گیرتون j2me هست و چون برای موبایل استفاده می‌شه و java sdk هست.و اون جریانش خیلی‌ فرق داره با این بحث چون به موبایل هم بستگی‌ داره که bluetooth رو پشتیبانی‌ کنه و یا شاید حالا با سیدی و سیم به usb وصل بشه .و شما باید در قسمت موبایل تقاضا کنین چون خیلی‌ به موبایل بستگی‌ داره.و موبایل باید پشتیبانی‌ کنه.
    و کمتر به جوا بستگی‌ داره.

Thread Information

Users Browsing this Thread

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

User Tag List

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

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