PDA

View Full Version : سوال در مورد Constructor و Override کردن



Sina.iRoid
دوشنبه 14 مهر 1393, 18:07 عصر
سلام. ممنون میشم اگر من و راهنمایی کنید.
سوال اولم در مورد Constructor است. اینکه چرا در یک برنامه از چند Constructor استفاده می کنن!؟ ( یکی از دلایلی که من خودم خوندم این بود که، گاهی اوقات نمی خوایم که بعضی از فیلد های کلاسمون و یا همه فیلد ها رو مقدار دهی کنیم، برای همین از Constructor با پارامتر های مختلف استفاده می کنیم. اما نمی دونم دقیقا چه زمانی باید از چند تا Constructor استفاده کنم. یعنی مثلا بعضی برنامه ها هستن که نیازی نیست، ولی نوشته شدن.)

سوال دوم هم در مورد Override کردن متد هاست. با Override کردن مشکلی ندارم. فقط می خوام بدونم که کارایی این دستور:

@Override

دقیقا چیه؟ چون امتحان کردم، چه این دستور باشه و چه نباشه، برنامه درست اجرا میشه.

ممنون اگر راهنماییم کنید.

sajjad4563
دوشنبه 14 مهر 1393, 19:06 عصر
سلام
چیزایی که من میدونم اینا هستن:

در مورد constructor:

سازنده ها برای نمونه سازی اشیائی از کلاسی که نوشتین، استفاده میشن
بعضی وقتا برای اینکه کار خودمونو راحت و سریعتر کنیم، در constructor یک سری کارهای دیگه هم مینویسیم که انجام بده، مثلا بعضی متدهارو صدا میزنیم، برخی فیلد هارو مقدار دهی می کنیم.
مشخصه که برای اینکه بخوایم تو constructor فیلدهایی هم مقدار دهی کنیم، باید constructor ما پارامتر داشته باشه (هرچند تا که لازمه)

ولی بعضی وقتا ما نیاز داریم که صرفاً یه نمونه سازی از کلاس بکنیم، خوب اینجا نمیتونیم (یا بهتره بگیم درست نیست) که از اون constructor ری استفاده کنیم که پارامتر داره و هزارتا کار اضافی انجام میده، اینجا میتونیم از default constructor یا همون سازنده خالی استفاده کنیم.

در مورد override:

چیزی که نوشتین annotation نام داره و نوشتنش باعث یک بررسی در زمان کامپایل میشه و داره میگه که متد override شده (بازتعریف شده) و همینطور هنگام تولید Javadoc بسیار مفید و ضروریه.

محمد فدوی
دوشنبه 14 مهر 1393, 19:32 عصر
توضیحات کامل بود. اینکه چندتا سازنده برای کلاستون بنویسید کاملا بستگی به هدف خودتون داره. اگه شما دارین یه برنامه کاربردی می‌نویسین حداقل تعداد سازنده رو تعریف کنین. اما مثلا کتابخانه‌هایی مثل کتابخانه‌ی Java چون کاربر هدفش معلوم نیست، میان و چندین سازنده تعریف می‌کنن تا بیشترین کارایی رو برای اکثر برنامه‌نویسان تولید کرده باشن.

در مورد Override@ هم توضیحات خوب بود. اساساً Annotaionها یا همون اصلاحگرها هیچ تغییری توی کدشما ایجاد نمی‌کنن. خیلی از این اصلاحگرها مثل همین Override اساساً هیچ‌کاری نمی‌کنن! فقط برای خوانایی کد اضافه می‌شن و اگه دوست دارین می‌تونین اصلا از این اصلاحگر استفاده نکنین.
اما خیلی از این اصلاحگرها می‌تونن برای یک کلاس دیگه یا برای کامپایلر در هنگام کامپایل یا حتی از زمان اجرا معنی خاصی داشته باشن. Annotaionها بیش از حد توی JavaEE کاربرد دارن...

اما اگه بخوام یه مثال عملی ساده از JavaSE بزنم نزدیک‌ترین چیزی که به ذهنم می‌رسه Deprecated@ هست. شما اگه این اصلاحگر رو به یک عنصر (کلاس، متد...) اضافه کنی به کامپایلر اعلام می‌کنی که دیگه این کلاس از رده خارجه و بهتره که استفاده نشه (مثلا کلاس java.util.Vector یک کلاس از رده خارجه و با چیزای دیگه جایگزین شده) حالا از الان به بعد هرموقع سعی بشه از اون عنصر توی کد‌نویسی استفاده بشه کامپایلر/IDE یه هشدار می‌ده که این عنصر از رده خارجه.

اصلاحگرها میتونن پارامتر ورودی هم داشته باشن! مثلا با SupressWarnings@ می‌تونیم هشدارها رو ساکت کنیم و مثلا از یه کلاس از رده خارج بدون هیچ هشداری استفاده کنیم:


import java.util.Vector;

...

@SupressWarnings("deprecation")
public void iWannaUseVector() {
Vector<String> myVector = new Vector<>(); // No Warning!
}

در ضمن اصلاحگرها می‌تونن به هر عنصری اضافه بشن (کلاس، متغیر، ...)
برای اطلاعات بیشتر یه سرچ بکنی مطلب زیاد هست.
موفق باشی.

cups_of_java
دوشنبه 14 مهر 1393, 19:58 عصر
چرا در یک برنامه از چند Constructor استفاده می کنن!؟

به همون دلیل که شما یک متد رو Overload میکنی. این چند پارامتری کردن برای اینه که به کاربر اون کلاس اجازه بدیم به گونه های مختلفی (که ما تعیین میکنیم)‌بتونه شی بسازه واسه خودش! همین و بس.






سوال دوم هم در مورد Override کردن متد هاست

اون یک دستور نیست یک انوتیشن هست که دوستمون توضیح کاملی داد اما جواب اصلی رو یادش رفت بده:
کاربرد @annotation واسه اینه که احتماا خطای کاربر در اور-راید کردن متد به صفر برسه نه واسه خوانایی و ...
شما همین انوتیشن رو بالای یک متدی که اور-رایدش کردی بزار... بعد یکی از پارامتر هاش رو یا اسمش رو یه تغییر کوچیک بده... ببین چی میبینی!؟
در حالی که اگه این رو نمیزاشتی... ممکنه بود سهون یه اشتباه تایپی کنی... کامپایلر هم که نمی فهمید منظور تو از این متد اور-راید پدریه بوده فکر میکرد یه متد جدیده... بعد کدت ران میشد... بعد درست کار نمیکرد.... بعد تو باید ساعت ها زمان صرف میکردی تا یهو بفهمی اااااا! اشتباده تایپی داشتی :)

ahmad.mo74
دوشنبه 14 مهر 1393, 20:06 عصر
اما نمی دونم دقیقا چه زمانی باید از چند تا Constructor استفاده کنم

سلام،
هر جا لازم بود و بهش نیاز داشتی!