salam
dastoore clone() too java che kar mikone
yani daghighan che joori kar mikone
bekhosoos darbareye list ha
merci
salam
dastoore clone() too java che kar mikone
yani daghighan che joori kar mikone
bekhosoos darbareye list ha
merci
قطعه برنامۀ زیر رو ببین:
نتیجۀ این برنامه این خواهد بود:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
زیرا هر دو آرایه به یکجا اشاره می کنند (یکی هستند).کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مواقعی لازم است که یک کپی از یک شئ به وجود آوریم که داده های آن مانند داده های شئ باشد ولی خود شئ نباشد. برای اینکار از clone() برای اینکار از clone() استفاده می کنیم.
همون طور که انتظار دارید، خروجی به صورت زیر خواهد بود:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته توجه کنید که متد Clone باعث انجام یک Shallow Copy (کپی سطحی) می شود.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در اینجا ما آرایه را از نوع int گرفتیم ولی اگر متغییر ما از نوع refrence باشد (یک شئ از یک کلاس) کمی فرق می کرد. مثلاً فرض کنید که آرایه ای از Rectangle ها (مستطیل ها) ایجاد کرده ایم. حال اگر Clone آرایه را صدا بزنیم یک آرایۀ جدید ایجاد می شود. مثلاً اگر در این آرایۀ جدید یک عنصر را حذف کنیم تغییری روی آرایۀ قدیم ایجاد نمی شود ولی اگر مثلاً طول و عرض یکی از عناصر را تغییر دهیم، این تغییر روی آرایۀ دیگر نیز اعمال می شود. زیرا دو آرایه دارند به یک شئ یکسان اشاره می کنند. به شکل زیر دقت کنید:
شئ cloneArr1 یک shallow copy از arr1 است که بوسیلۀ متد Clone انجام شده است.
حال اگر یکی از عناصر را به جای دیگر اشاره دهیم، cloneArr1 با arr1 متفاوت خواهد شد:
ولی اگر که مثلاً عنصر rect1 را تغییر دهیم، این تغییر در هر دو اعمال می شود (چون هر دو به یک شئ اشاره می کنند)
Last edited by hamidreza_buddy; 22-04-2007 at 22:28.
merci
hala age bekham taghir ham nakone az chi mitoonam estefadeh konam?
dar zemn
dar morede arraylist ha emtehan kardam didam object return mikone
chera?
merci
در جاوا برای انجام کپی عمیق (deep copy) برای ArrayList می توان به دو روش عمل کرد.
1- دستی
2- با استفاده از serialization
1- روش دستی
در این روش همۀ اعضای ArrayList را new می کنیم و در یک ArrayList دیگر می ریزیم.
که البته در این روش کلاس A باید سازنده ای (Constructor) به صورت مناسب پیاده سازی کرده باشد.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
2- با استفاده از serialization
در این روش شئ را یک بار درون یک OutputStream می ریزیم و سپس آن را بوسیلۀ یک InputStream می خوانیم:
که البته کلاس باید Serializeable را پیاده سازی کرده باشد:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدمنظورتون چیه؟ چه تابعی object برمی گردونه؟dar morede arraylist ha emtehan kardam didam object return mikone
آها راستی یه همچین کاری بکن ببین چی جواب می ده؟
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Last edited by hamidreza_buddy; 23-04-2007 at 22:28.
manzooram in bood ke:
ArrayList<Integer> i=new ArrayList<Integer>();
for (int j = 0; j < 10; j++) {
i.add(j);
}
ArrayList<Integer> tep=i.clone();
be hem error mide ke " cannot caonvert from object to arraylist<integer> " va baraye dorost shodanesh majbooram cast konam!
chera?
آها
این به خاطر اینه که این متد بین همۀ کلاس ها مشترک باشه. (به خاطر مباحث مربوط به Polymorphism)
یعنی اینکه بدون توجه به نوع کلاس، تابع Clone کلاس رو فراخوانی کرد و کار مورد نظرو انجام داد.
در ضمن اگه میشه فارسی بنویسید، چون انگلیسی نویسی مخالف قوانین انجمن هست هم خوندنش خیلی سخته!
az komaketoon mamnoon
khodam ham delam mikhad farsi type konam
age mitoonestam hatman in kar ro mikardam
moshkelam ine ke hamin alan bedoone hich feshare ezafe i daram process miterkoonam!!!!!
too fc6 am
va narmafzari ke bahash kar mikonam kheili process mibare
betoori ke kheili vaghta hata nemitoonam terminal baz konam!!!!!
firefox ham be zoor baze!
bazam az in babat motasefam
bebinid ostadam azam khaste ke clone ro rooye rooye ye class tarif konam
mishe ye rahnamaii konin ke chejoori in kar ro konam!
merci
سلام
دوست عزیز setareh_m_c من فکر می کنم یه همچین تاپیکی در مورد دستور static هم زده بودید. خوب بهتره که برای هر سوال یک تاپیک نزنید. همونطور که برای اون تاپیک هم گفتم اگر یه سر به اینجا بزنید شاید بهتون کمک کنه:
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید![]()
کلاس Object یک سری توابعی داره که بعتره اونا رو هنگام تعریف کلاس بازنویسی (override) کنیم.
مثلاً clone یا tostring و یا hashcode و ...
برای بازنویسیشون کافیه مثل تعریف متد عمل کنیم:
در بالا کلاس BackgroundThread از Thread مشتق شده. در این کلاس متد run لازم بوده که به صورت متفاوتی پیاده سازی بشه. در نتیجه اون رو بازنویسی کردیم.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعضی مواقع می خواهیم به جای اینکه یک متد را کامل بازنویسی کنیم، آن را توسعه دهیم. به این صورت که تابع کلاس پدر اجرا شود و ما علاوه بر آن یک سری دستور دیگر اجرا کنیم. برای همچین کاری به صورت زیر عمل می کنیم:
توجه کنید که اگر در کلاس پدر متدی به صورت final تعریف شده باشد نمی توان آن را بازنویسی کرد. مثلاً:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر بخواهیم از کلاس ChessAlgorithm یک کلاس مشتق کنیم و سپس متد nextMove آنرا بازنویسی کنیم، با پیام خطای زیر مواجه می شوید:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته کلاس ها را هم می توان final تعریف کرد. در این صورت اصلاً نمی توان کلاسی از کلاس final مشتق کرد (مثلاً فکر کنم که کلاس string یه کلاس final باشه)کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعضی متدها را باید حتماً در کلاس مشتق شده بازنویسی کرد. به این متدها، متدهای abstract می گویند. به کلاس هایی که چنین متدهایی دارند هم کلاس های abstract (مجرد) می گویند. زیرا نمی توان از آن هیچ گونه شئ تعریف کرد.
مثلاً اگر کلاسی abstract باشد:
در کلاس Circle که از کلاس بالا مشتق شده باید حتماً متد draw را بازنویسی کرد:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و گرنه خطا می دهد.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] یه آموزش خوب و کامل از بازنویسی متدهای object (مخصوصاً Clone) هست.
Last edited by hamidreza_buddy; 25-04-2007 at 21:16.
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)