salam
dastoore clone() too java che kar mikone
yani daghighan che joori kar mikone
bekhosoos darbareye list ha
merci
Printable View
salam
dastoore clone() too java che kar mikone
yani daghighan che joori kar mikone
bekhosoos darbareye list ha
merci
قطعه برنامۀ زیر رو ببین:
نتیجۀ این برنامه این خواهد بود:کد:int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;
mumbersCopy[2] = 0;
System.out.println(numbers[2]);
System.out.println(numbersCopy[2]);
زیرا هر دو آرایه به یکجا اشاره می کنند (یکی هستند).کد:0
0
در مواقعی لازم است که یک کپی از یک شئ به وجود آوریم که داده های آن مانند داده های شئ باشد ولی خود شئ نباشد. برای اینکار از clone() برای اینکار از clone() استفاده می کنیم.
همون طور که انتظار دارید، خروجی به صورت زیر خواهد بود:کد:int [] numbers = { 2, 3, 4, 5};
int [] numbersClone = (int[])numbers.clone();
mumbersCopy[2] = 0;
System.out.println(numbers[2]);
System.out.println(numbersCopy[2]);
البته توجه کنید که متد Clone باعث انجام یک Shallow Copy (کپی سطحی) می شود.کد:4
0
در اینجا ما آرایه را از نوع int گرفتیم ولی اگر متغییر ما از نوع refrence باشد (یک شئ از یک کلاس) کمی فرق می کرد. مثلاً فرض کنید که آرایه ای از Rectangle ها (مستطیل ها) ایجاد کرده ایم. حال اگر Clone آرایه را صدا بزنیم یک آرایۀ جدید ایجاد می شود. مثلاً اگر در این آرایۀ جدید یک عنصر را حذف کنیم تغییری روی آرایۀ قدیم ایجاد نمی شود ولی اگر مثلاً طول و عرض یکی از عناصر را تغییر دهیم، این تغییر روی آرایۀ دیگر نیز اعمال می شود. زیرا دو آرایه دارند به یک شئ یکسان اشاره می کنند. به شکل زیر دقت کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شئ cloneArr1 یک shallow copy از arr1 است که بوسیلۀ متد Clone انجام شده است.
حال اگر یکی از عناصر را به جای دیگر اشاره دهیم، cloneArr1 با arr1 متفاوت خواهد شد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ولی اگر که مثلاً عنصر rect1 را تغییر دهیم، این تغییر در هر دو اعمال می شود (چون هر دو به یک شئ اشاره می کنند)
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) به صورت مناسب پیاده سازی کرده باشد.کد:// hand-coded deep copy
static ArrayList copy2(ArrayList list) {
ArrayList newlist = new ArrayList();
A aobj = (A)list.get(0);
newlist.add(new A(aobj.getX()));
return newlist;
}
2- با استفاده از serialization
در این روش شئ را یک بار درون یک OutputStream می ریزیم و سپس آن را بوسیلۀ یک InputStream می خوانیم:
که البته کلاس باید Serializeable را پیاده سازی کرده باشد:کد:// deep copy via serialization
static ArrayList copy3(ArrayList list) throws
Exception {
// serialize ArrayList into byte array
ByteArrayOutputStream baos =
new ByteArrayOutputStream(100);
ObjectOutputStream oos = new
ObjectOutputStream(baos);
oos.writeObject(list);
byte buf[] = baos.toByteArray();
oos.close();
// deserialize byte array into ArrayList
ByteArrayInputStream bais =
new ByteArrayInputStream(buf);
ObjectInputStream ois = new
ObjectInputStream(bais);
ArrayList newlist =
(ArrayList)ois.readObject();
ois.close();
return newlist;
}
کد:class A implements java.io.Serializable {
private int x;
public A(int i) {
setX(i);
}
public void setX(int i) {
x = i;
}
public int getX() {
return x;
}
}
منظورتون چیه؟ چه تابعی object برمی گردونه؟نقل قول:
dar morede arraylist ha emtehan kardam didam object return mikone
آها راستی یه همچین کاری بکن ببین چی جواب می ده؟
کد:ArrayList newArr = new ArrayList(oldArr);
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 هم زده بودید. خوب بهتره که برای هر سوال یک تاپیک نزنید. همونطور که برای اون تاپیک هم گفتم اگر یه سر به اینجا بزنید شاید بهتون کمک کنه:
:10:
کلاس Object یک سری توابعی داره که بعتره اونا رو هنگام تعریف کلاس بازنویسی (override) کنیم.
مثلاً clone یا tostring و یا hashcode و ...
برای بازنویسیشون کافیه مثل تعریف متد عمل کنیم:
در بالا کلاس BackgroundThread از Thread مشتق شده. در این کلاس متد run لازم بوده که به صورت متفاوتی پیاده سازی بشه. در نتیجه اون رو بازنویسی کردیم.کد:class BackgroundThread extends Thread {
void run() {
. . .
}
}
بعضی مواقع می خواهیم به جای اینکه یک متد را کامل بازنویسی کنیم، آن را توسعه دهیم. به این صورت که تابع کلاس پدر اجرا شود و ما علاوه بر آن یک سری دستور دیگر اجرا کنیم. برای همچین کاری به صورت زیر عمل می کنیم:
توجه کنید که اگر در کلاس پدر متدی به صورت final تعریف شده باشد نمی توان آن را بازنویسی کرد. مثلاً:کد:class MyWindow extends Window {
public MyWindow(Frame parent) {
super(parent);
. . .
// MyWindow-specific initialization here
. . .
}
}
اگر بخواهیم از کلاس ChessAlgorithm یک کلاس مشتق کنیم و سپس متد nextMove آنرا بازنویسی کنیم، با پیام خطای زیر مواجه می شوید:کد:class ChessAlgorithm {
. . .
final void nextMove(ChessPiece pieceMoved, BoardLocation newLocation) {
}
. . .
}
البته کلاس ها را هم می توان final تعریف کرد. در این صورت اصلاً نمی توان کلاسی از کلاس final مشتق کرد (مثلاً فکر کنم که کلاس string یه کلاس final باشه)کد:ChessAlgorithm.java:7: Final methods can't be overriden. Method void nextMove is final in class ChessAlgorithm.
void newxMove(ChessPiece pieceMoved, BoardLocation newLocation) {
^
1 error
بعضی متدها را باید حتماً در کلاس مشتق شده بازنویسی کرد. به این متدها، متدهای abstract می گویند. به کلاس هایی که چنین متدهایی دارند هم کلاس های abstract (مجرد) می گویند. زیرا نمی توان از آن هیچ گونه شئ تعریف کرد.
مثلاً اگر کلاسی abstract باشد:
در کلاس Circle که از کلاس بالا مشتق شده باید حتماً متد draw را بازنویسی کرد:کد:abstract class GraphicObject {
int x, y;
. . .
void moveTo(int newX, int newY) {
. . .
}
abstract void draw();
}
و گرنه خطا می دهد.کد:class Circle extends GraphicObject {
void draw() {
. . .
}
}
class Rectangle extends GraphicObject {
void draw() {
. . .
}
}
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] یه آموزش خوب و کامل از بازنویسی متدهای object (مخصوصاً Clone) هست.