۱۳۸۹/۷/۸, ۱۰:۳۱ عصر
سلام!
ما زباد از جاوا صحبت کردیم ولی خیلی از جنبه ها را درست توضیح ندادیم و تعدادی دیگر از یادمون رفت توضیح بدیم! خب حالا وقتشه! (این یک بخش ویژه است٬ به همراه منابعی است که برای مطالعهی بیشتر لطفا به آنها مراجعه نمایید)
بخش اول : تفاوت ها با زبان سی / سی++ :
یکی زبانهایی که جاوا از آن تاثیر پذیرفته است زبان سی ++ است. 1 بسیاری از ساختار های این زبان سی++ گرفته شده ٬ حتی کلمات کلیدی استفاده شده. اما بالاخره تفاوتهای بین آنها وجود دارد. یکی از این موارد شیوهی تخصیص حافظه برای آرایه است.
به کد توجه بفرمایید:
خب یک آرایه به اندازهی ۹ واحد ایجاد شده و بعد خانهی شمارهی چهارم مقدار دهی و بعد چاپ شده ( توجه : شروع آرایه در سی++ و جاوا از صفر است). حال اگر همین بخش از کد را در جاوا مقایسه نماییم به این شکل در میآید:
مشاهده مینمایید که برای ایجاد آرایه نمیتوان مستقیما در بخش تعریف متغیر اندازه وارد شود. ابتدا باید نوع سپس نام متغیر و بعد علامت آرایه یعنی [ ] آورده شود. بعد از علامت انتساب (یعنی = ) و سپس نوع متغیر و بعد اندازهی آرایه آورده شود. میتوان این برنامه را به صورت زیر هم نوشت :
در خط سه مشاهده میفرمایید که فقط نام و نوع متغیر به همراه علامت آرایه ذکر شده. در هنگام تعریف می توان علامت آرایه را در سمت راست یا چپ متغیر قرار داد. همچنین لزومی به مقدار دهی برای اندازهی آرایه نیست و بعدا ٬ پیش از استفاده میتوان آن را مقدار دهی نمود٬ مانند همین مثال.
این موضوع متبادر کنندهی شیوهای مشابه در سی++ است چیزی شبیه این کد :
ابتدا یک اشارهگر با نام a ایجاد شده و سپس اندازه تعیین میشود. به این روش تخصیص آرایه به روش پویا گفته میشود.
از این روش برای ایجاد آرایههایی با دو یا چند بعد استفاده میشود. برای ایجاد یک ماتریس (آرایهای دو بعدی ) به این روش عمل مینماییم:
نکتهی جالب در سی++ آن است که شما می توانید برای هر یک از سطرها اندازهی تفاوت قایل شوید(اگرجه در اینجا همه اندازه مساوی ۸ دارند.)
همین قطعه کد در جاوا به صورت :
البته طولانی شدن برنامه به خاطر پیروی (کمی بیشتر !) از اصول شیگرایی است!
خط دوم ایجاد یک متغیر برای ایجاد ماتریس است.
خط سوم دو متغیر کلاس برای اندازهی طول و عرض ماتریس است که از طریق متد سازنده (خط چهارم )مقدار دهی میشود.
در متد مقدار دهی مشاهده می نمایید که ماتریس به راحتی ایجاد می شود! فقط قرار دادن اعداد در نمادها آرایه!
و باقی کد هم شامل مقداردهی عددی و چاپ آنهاست.
شاید این سوال پیش آید که تفاوت شیوهی پویا در سی++ و شیوهی معمولی در جاوا در همان علامت * پیش از نام متغیر است؟
جواب خیر است. در اینجا باید به یکی از مهمترین تفاوتهای بین سی++ و جاوا اشاره نماییم-------> اشاره گر!
در زبان سی برای تخصیص حافظه و ارسالبه توابع و متدها از اشارهگر و ارجاع استفاده می شود. منظور از اشاره را میتوانید در اینجا و اینجا مشاهده کنید و با آن بیشتر آشنا شوید.
در در زبان سی++ شما میتوانید این اشارهگر را به هرکجا خواستید اشاره بدهید و همین طور پیش بروید! مشکل از زمانی شروع میشود که کنترل اشاره گر را در برنامه به هر نحوی ( مثلا در یک حلقه که به اشتباه مقدار دهی شده و میخواهید در جایی که متعلق به برنامهی شما نیست اطلاعاتی بنویسید یا بخوانید) از دست شما خارح شود! یاد کابوس های بورلند بخیر!
در جاوا این موضوع با استفاده از درست از اشارهگر حل شده. در واقع شما به همان شکل سی++ آرایه ایجاد مینمایید ولی شما دیگر به صورت صریح از اشارهگر استفاده نمینمایید بلکه برنامه خودش این کار را برای شما انجام میدهد و دیگر شما را از مشکلات سی++ رها می کند.
lموضوع دیگر ارسالهاست. زمانی که شما یک تابع را فرخوانی می نمایید باید به نوعی دادهی مورد نظر خود را به آن ارسال نمود. چند راه برای این کار وجود دارد:
* ارسال با استفاده از مقدار
* ارسال با استفاده از ارجاع
* ارسال با استفاده از اشارهگر
از آنجا که اختیار استفاده از اشارهگر را در جاوا نداریم٬ آخرین موضوع در جاوا بیمعنی است. از این رو فقط دو مورد باقی میماند. اما یک سوال آیا می توان متد تغییر دو متغیر را در جاوا با استفاده از ارجاع (Reference) اجرایی کرد؟ به کد زیر توجه بفرمایید :
این یک کد در سی++ است. آیا امکان اجرایی در جاوا دارد؟
جواب خیر است. ارسال در این تابع به صورت "Passing by Reference" صورت گرفته است. و مقادیر در داخل تابع با یکدیگر عوض شدهاند.
در جاوا شما نمیتوانید این کار را انجام دهید! ارسال در جاوا به صورت Passing by Value است! حتی reference ها!
راه حل : شیگرایی است..
خب آخرین موضوع جالب مقدادهی متغیرهای کلاس است!
فرض کنید در همین ماتریس که در بالا ذکر شد می خواهیم مقدار دهی اولیه داشته باشیم. چند راه وجود دارد.
یکی اینکه در متد سازنده یا متدی مشابه (در همین مثال از متد مقداردهی init ) استفاده شود.
راه دیگر و جالب تر استفاده از بلوکی به نام استاتیک است به این قطعه کد نگاه کنید :
تنها مورد آن است که متغیرها باید به شکل استاتیک تعریف شده باشند. منظور از استاتیک آن است که این متغیرها به عنوان بخشی از شیِ کلاسی هستند! در این مورد در جلسات بعد صحبت خواهیم نمود!
لطفا نظرات خود را به صورت پیغام برای نویسنده ارسال نمایید. و در صورتی که موضوع خاصی در جاوا برای یادگیری مد نظر دارید٬ بفرمایید تا در اولویتِ بالاتر قرار گیرد.
ما زباد از جاوا صحبت کردیم ولی خیلی از جنبه ها را درست توضیح ندادیم و تعدادی دیگر از یادمون رفت توضیح بدیم! خب حالا وقتشه! (این یک بخش ویژه است٬ به همراه منابعی است که برای مطالعهی بیشتر لطفا به آنها مراجعه نمایید)
بخش اول : تفاوت ها با زبان سی / سی++ :
یکی زبانهایی که جاوا از آن تاثیر پذیرفته است زبان سی ++ است. 1 بسیاری از ساختار های این زبان سی++ گرفته شده ٬ حتی کلمات کلیدی استفاده شده. اما بالاخره تفاوتهای بین آنها وجود دارد. یکی از این موارد شیوهی تخصیص حافظه برای آرایه است.
به کد توجه بفرمایید:
C++ Programming
- #include <iostream.h>
- #include <conio.h>
- void main(){
- int y[9];
- y[3]=10;
- cout<<y[3]<<endl;
- getch();
- }
خب یک آرایه به اندازهی ۹ واحد ایجاد شده و بعد خانهی شمارهی چهارم مقدار دهی و بعد چاپ شده ( توجه : شروع آرایه در سی++ و جاوا از صفر است). حال اگر همین بخش از کد را در جاوا مقایسه نماییم به این شکل در میآید:
JAVA5 Programming
- public class ClassName { // در جاوا وجود یک کلاس که شمال متد اصلی (main باشد الزامی است.)
- int y[]=new int[9]; // یک متغیر آرایهای با اندازه دلخواه تعریف می نماییم.
- y[3]=10; // و خانهی مورد نظر را مقدار دهی مینماییم.
- } // پایان متد اصلی
- } //پایان کلاس
مشاهده مینمایید که برای ایجاد آرایه نمیتوان مستقیما در بخش تعریف متغیر اندازه وارد شود. ابتدا باید نوع سپس نام متغیر و بعد علامت آرایه یعنی [ ] آورده شود. بعد از علامت انتساب (یعنی = ) و سپس نوع متغیر و بعد اندازهی آرایه آورده شود. میتوان این برنامه را به صورت زیر هم نوشت :
JAVA5 Programming
- public class ClassName {
- <span style="font-weight: bold;"> int []y;</span>
- <span style="font-weight: bold;">y=new int[9];</span>
- y[3]=10;
- }
- }
در خط سه مشاهده میفرمایید که فقط نام و نوع متغیر به همراه علامت آرایه ذکر شده. در هنگام تعریف می توان علامت آرایه را در سمت راست یا چپ متغیر قرار داد. همچنین لزومی به مقدار دهی برای اندازهی آرایه نیست و بعدا ٬ پیش از استفاده میتوان آن را مقدار دهی نمود٬ مانند همین مثال.
این موضوع متبادر کنندهی شیوهای مشابه در سی++ است چیزی شبیه این کد :
ابتدا یک اشارهگر با نام a ایجاد شده و سپس اندازه تعیین میشود. به این روش تخصیص آرایه به روش پویا گفته میشود.
از این روش برای ایجاد آرایههایی با دو یا چند بعد استفاده میشود. برای ایجاد یک ماتریس (آرایهای دو بعدی ) به این روش عمل مینماییم:
C++ Programming
- #include <iostream.h>
- #include <conio.h>
- void main(){
- int **a; //اشاره گری به اشارهگری دیگر!
- a=new int *[10]; //اشاره به مکانی از حافظه برای ایجاد ارایه از ۱۰ واحد
- for(int i=0;i<10;i++) // در طی یک حلقهی ۱۰تایی هر یک از ۱۰ خانهی آرایه به عنوان اشارهگری به آرایه ۸ واحدی //استفاده می شود.
- a[i]=new int[8];
- for(int i=0;i<10;i++)
- for(int j=0;j<8;j++)
- a[i][j]=i*j; //مقداردهی ماتریس!
- for(int i=0;i<10;i++)
- { //چاپ ماتریس
- for(int j=0;j<8;j++)
- cout<<a[i][j]<<"\t";
- cout<<endl;
- }
- getch();
- }
نکتهی جالب در سی++ آن است که شما می توانید برای هر یک از سطرها اندازهی تفاوت قایل شوید(اگرجه در اینجا همه اندازه مساوی ۸ دارند.)
همین قطعه کد در جاوا به صورت :
JAVA5 Programming
- public class Matrix {
- private int a[][];
- int width,h;
- Matrix(int w,int h){
- width=w;
- this.h=h;
- }
- public void init(){
- a = new int[width][h];
- for(int i=0;i<width;i++)
- for(int j=0;j<h;j++)
- a[i][j]=i*j;
- }
- public void Print(){
- for(int i=0;i<width;i++)
- {
- for(int j=0;j<h;j++)
- }
- }
- Matrix m=new Matrix(10,4);
- m.init();
- m.Print();
- }
- }
البته طولانی شدن برنامه به خاطر پیروی (کمی بیشتر !) از اصول شیگرایی است!
خط دوم ایجاد یک متغیر برای ایجاد ماتریس است.
خط سوم دو متغیر کلاس برای اندازهی طول و عرض ماتریس است که از طریق متد سازنده (خط چهارم )مقدار دهی میشود.
در متد مقدار دهی مشاهده می نمایید که ماتریس به راحتی ایجاد می شود! فقط قرار دادن اعداد در نمادها آرایه!
و باقی کد هم شامل مقداردهی عددی و چاپ آنهاست.
شاید این سوال پیش آید که تفاوت شیوهی پویا در سی++ و شیوهی معمولی در جاوا در همان علامت * پیش از نام متغیر است؟
جواب خیر است. در اینجا باید به یکی از مهمترین تفاوتهای بین سی++ و جاوا اشاره نماییم-------> اشاره گر!
در زبان سی برای تخصیص حافظه و ارسالبه توابع و متدها از اشارهگر و ارجاع استفاده می شود. منظور از اشاره را میتوانید در اینجا و اینجا مشاهده کنید و با آن بیشتر آشنا شوید.
در در زبان سی++ شما میتوانید این اشارهگر را به هرکجا خواستید اشاره بدهید و همین طور پیش بروید! مشکل از زمانی شروع میشود که کنترل اشاره گر را در برنامه به هر نحوی ( مثلا در یک حلقه که به اشتباه مقدار دهی شده و میخواهید در جایی که متعلق به برنامهی شما نیست اطلاعاتی بنویسید یا بخوانید) از دست شما خارح شود! یاد کابوس های بورلند بخیر!
در جاوا این موضوع با استفاده از درست از اشارهگر حل شده. در واقع شما به همان شکل سی++ آرایه ایجاد مینمایید ولی شما دیگر به صورت صریح از اشارهگر استفاده نمینمایید بلکه برنامه خودش این کار را برای شما انجام میدهد و دیگر شما را از مشکلات سی++ رها می کند.
lموضوع دیگر ارسالهاست. زمانی که شما یک تابع را فرخوانی می نمایید باید به نوعی دادهی مورد نظر خود را به آن ارسال نمود. چند راه برای این کار وجود دارد:
* ارسال با استفاده از مقدار
* ارسال با استفاده از ارجاع
* ارسال با استفاده از اشارهگر
از آنجا که اختیار استفاده از اشارهگر را در جاوا نداریم٬ آخرین موضوع در جاوا بیمعنی است. از این رو فقط دو مورد باقی میماند. اما یک سوال آیا می توان متد تغییر دو متغیر را در جاوا با استفاده از ارجاع (Reference) اجرایی کرد؟ به کد زیر توجه بفرمایید :
JAVA5 Programming
- void swap(int & arg1, int & arg2) {
- int temp = arg1;
- arg1 = arg2;
- arg2 = temp;
- }
- int var1 = ...; // مقدار "الف"
- intvar2 = ...; // مقدار "ب"
- swap(var1, var2); // جابجایی مقادیر آنها!
این یک کد در سی++ است. آیا امکان اجرایی در جاوا دارد؟
جواب خیر است. ارسال در این تابع به صورت "Passing by Reference" صورت گرفته است. و مقادیر در داخل تابع با یکدیگر عوض شدهاند.
در جاوا شما نمیتوانید این کار را انجام دهید! ارسال در جاوا به صورت Passing by Value است! حتی reference ها!
راه حل : شیگرایی است..
خب آخرین موضوع جالب مقدادهی متغیرهای کلاس است!
فرض کنید در همین ماتریس که در بالا ذکر شد می خواهیم مقدار دهی اولیه داشته باشیم. چند راه وجود دارد.
یکی اینکه در متد سازنده یا متدی مشابه (در همین مثال از متد مقداردهی init ) استفاده شود.
راه دیگر و جالب تر استفاده از بلوکی به نام استاتیک است به این قطعه کد نگاه کنید :
تنها مورد آن است که متغیرها باید به شکل استاتیک تعریف شده باشند. منظور از استاتیک آن است که این متغیرها به عنوان بخشی از شیِ کلاسی هستند! در این مورد در جلسات بعد صحبت خواهیم نمود!
لطفا نظرات خود را به صورت پیغام برای نویسنده ارسال نمایید. و در صورتی که موضوع خاصی در جاوا برای یادگیری مد نظر دارید٬ بفرمایید تا در اولویتِ بالاتر قرار گیرد.
![[تصویر: thisp.png?psid=1]](http://zsp24a.bay.livefilestore.com/y1pwj9x9QXxKPj2YcrYBHpcMtkxwS6G3mPdXO1HeqKnOqSIt7I6DMu-XqXazYPObOQLI3A92WB6lDXLkH3c_wcF_x2v9yV0raoh/thisp.png?psid=1)