ورود

نسخه کامل مشاهده نسخه کامل : دستور clone تو java کارش چی هست



Cris_Y
20-04-2007, 19:20
salam
dastoore clone() too java che kar mikone
yani daghighan che joori kar mikone
bekhosoos darbareye list ha
merci

hamidreza_buddy
22-04-2007, 22:02
قطعه برنامۀ زیر رو ببین:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نتیجۀ این برنامه این خواهد بود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
زیرا هر دو آرایه به یکجا اشاره می کنند (یکی هستند).
در مواقعی لازم است که یک کپی از یک شئ به وجود آوریم که داده های آن مانند داده های شئ باشد ولی خود شئ نباشد. برای اینکار از clone() برای اینکار از clone() استفاده می کنیم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همون طور که انتظار دارید، خروجی به صورت زیر خواهد بود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته توجه کنید که متد Clone باعث انجام یک Shallow Copy (کپی سطحی) می شود.
در اینجا ما آرایه را از نوع int گرفتیم ولی اگر متغییر ما از نوع refrence باشد (یک شئ از یک کلاس) کمی فرق می کرد. مثلاً فرض کنید که آرایه ای از Rectangle ها (مستطیل ها) ایجاد کرده ایم. حال اگر Clone آرایه را صدا بزنیم یک آرایۀ جدید ایجاد می شود. مثلاً اگر در این آرایۀ جدید یک عنصر را حذف کنیم تغییری روی آرایۀ قدیم ایجاد نمی شود ولی اگر مثلاً طول و عرض یکی از عناصر را تغییر دهیم، این تغییر روی آرایۀ دیگر نیز اعمال می شود. زیرا دو آرایه دارند به یک شئ یکسان اشاره می کنند. به شکل زیر دقت کنید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

شئ cloneArr1 یک shallow copy از arr1 است که بوسیلۀ متد Clone انجام شده است.
حال اگر یکی از عناصر را به جای دیگر اشاره دهیم، cloneArr1 با arr1 متفاوت خواهد شد:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

ولی اگر که مثلاً عنصر rect1 را تغییر دهیم، این تغییر در هر دو اعمال می شود (چون هر دو به یک شئ اشاره می کنند)

Cris_Y
23-04-2007, 11:50
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

hamidreza_buddy
23-04-2007, 22:24
در جاوا برای انجام کپی عمیق (deep copy) برای ArrayList می توان به دو روش عمل کرد.
1- دستی
2- با استفاده از serialization

1- روش دستی
در این روش همۀ اعضای ArrayList را new می کنیم و در یک ArrayList دیگر می ریزیم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

که البته در این روش کلاس A باید سازنده ای (Constructor) به صورت مناسب پیاده سازی کرده باشد.
2- با استفاده از serialization
در این روش شئ را یک بار درون یک OutputStream می ریزیم و سپس آن را بوسیلۀ یک InputStream می خوانیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

که البته کلاس باید Serializeable را پیاده سازی کرده باشد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


dar morede arraylist ha emtehan kardam didam object return mikone

منظورتون چیه؟ چه تابعی object برمی گردونه؟

آها راستی یه همچین کاری بکن ببین چی جواب می ده؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Cris_Y
24-04-2007, 09:56
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?

hamidreza_buddy
24-04-2007, 10:10
آها
این به خاطر اینه که این متد بین همۀ کلاس ها مشترک باشه. (به خاطر مباحث مربوط به Polymorphism)
یعنی اینکه بدون توجه به نوع کلاس، تابع Clone کلاس رو فراخوانی کرد و کار مورد نظرو انجام داد.

در ضمن اگه میشه فارسی بنویسید، چون انگلیسی نویسی مخالف قوانین انجمن هست هم خوندنش خیلی سخته!

Cris_Y
24-04-2007, 11:31
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

Cris_Y
25-04-2007, 17:00
bebinid ostadam azam khaste ke clone ro rooye rooye ye class tarif konam
mishe ye rahnamaii konin ke chejoori in kar ro konam!
merci

site_hamid
25-04-2007, 19:25
سلام
دوست عزیز setareh_m_c من فکر می کنم یه همچین تاپیکی در مورد دستور static هم زده بودید. خوب بهتره که برای هر سوال یک تاپیک نزنید. همونطور که برای اون تاپیک هم گفتم اگر یه سر به اینجا بزنید شاید بهتون کمک کنه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
:10:

hamidreza_buddy
25-04-2007, 20:52
کلاس Object یک سری توابعی داره که بعتره اونا رو هنگام تعریف کلاس بازنویسی (override) کنیم.
مثلاً clone یا tostring و یا hashcode و ...

برای بازنویسیشون کافیه مثل تعریف متد عمل کنیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در بالا کلاس BackgroundThread از Thread مشتق شده. در این کلاس متد run لازم بوده که به صورت متفاوتی پیاده سازی بشه. در نتیجه اون رو بازنویسی کردیم.

بعضی مواقع می خواهیم به جای اینکه یک متد را کامل بازنویسی کنیم، آن را توسعه دهیم. به این صورت که تابع کلاس پدر اجرا شود و ما علاوه بر آن یک سری دستور دیگر اجرا کنیم. برای همچین کاری به صورت زیر عمل می کنیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

توجه کنید که اگر در کلاس پدر متدی به صورت final تعریف شده باشد نمی توان آن را بازنویسی کرد. مثلاً:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر بخواهیم از کلاس ChessAlgorithm یک کلاس مشتق کنیم و سپس متد nextMove آنرا بازنویسی کنیم، با پیام خطای زیر مواجه می شوید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته کلاس ها را هم می توان final تعریف کرد. در این صورت اصلاً نمی توان کلاسی از کلاس final مشتق کرد (مثلاً فکر کنم که کلاس string یه کلاس final باشه)

بعضی متدها را باید حتماً در کلاس مشتق شده بازنویسی کرد. به این متدها، متدهای abstract می گویند. به کلاس هایی که چنین متدهایی دارند هم کلاس های abstract (مجرد) می گویند. زیرا نمی توان از آن هیچ گونه شئ تعریف کرد.
مثلاً اگر کلاسی abstract باشد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در کلاس Circle که از کلاس بالا مشتق شده باید حتماً متد draw را بازنویسی کرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و گرنه خطا می دهد.
اینجا ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) یه آموزش خوب و کامل از بازنویسی متدهای object (مخصوصاً Clone) هست.

Cris_Y
26-04-2007, 10:57
az tozihatetoon mamnoon
vali javabe soal mano nadadid
aksare chiz haii ro ke goftid ro modoonestam
faghat begid chejoori mitoonam methode clone ro override konam!!!!
merci

Cris_Y
26-04-2007, 11:19
az tozihatet mamnoon
vali javabe soalam ro nadadi
ina ro ke khodam ham midoonestam
soal man ine ke che joori methode clone ro override konam
bazam mamnoon

Cris_Y
26-04-2007, 11:21
vaghean motasefam computeram ghati kard fekr kardam avali ro nafrestade!!!!

hamidreza_buddy
26-04-2007, 16:07
اون لینک که گذاشته بودم کلی دربارۀ بازنویسی clone نوشته:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Cris_Y
26-04-2007, 16:42
merci
linke khoobi bood
vali ghablan nazashte boodin
ya hadaghal man nadide boodam!
az komaketoon mamnoon