PDA

View Full Version : مشکل در کامپایل



iman_n21
جمعه 27 مهر 1386, 18:33 عصر
اساتید لطف کنن یک نگاه به این کد بندازن و بگن چرا کامپایل نمیشه ؟؟؟؟؟؟؟؟!!!!!!!!!
اعصاب برام نزاشته دیگه
دو تا کلاس کوچولو تعریف کردم
یکیش که تابع main توشه که هیچ !
اون یکی رو وقتی public تعریف میکنم کامپایل نمیشه و خطا میگیره و میگه باید به صورت فایل جدا باشه ، ولی وقتی public نباشه راحت کامپایل میشه
2 تا کلاس رو هم که جدا میکنم و هر کدوم رو تو یه فایل میزارم، این بار کلاس main کامپایل نمیشه

4 تا کتاب فارسی گرفتم با یه PDF فارسی که همش رو هم مفت نمی ارزه

unhandled_event
جمعه 27 مهر 1386, 21:14 عصر
با اجازه اساتید :لبخندساده:

با در نظر گرفتن نکته های زیر کامپایل میشه :
نام هر فایل کلاس جاوا دقیقا باید معادل با فقط و فقط یک کلاس public درون فایل باشه.
و فقط یک کلاس با سطح public درون فایل میتونه باشه اما بهتره که هر فایل .java شامل یک کلاس باشه. طبق اصول نامگذاری ، کلاس همیشه باید با حرف بزرگ و متغیرها و متدها با حرف کوچک شروع میشن.
در اینجا نام کلاس public شما pr هست در صورتیکه اسم فایلتون main.java هست.
ضمنا بهتره اسم کلاس شامل متد main رو هیچوقت main نذارین.
پس در اولین قدم اسم کلاس باید باشه Pr اسم فایل Pr.java تا با اسم کلاس Pr که public هست یکی بشه.
لزومی نداره که حتما دو تا کلاس بنویسید میتونید یک کلاس بنویسید شاید دلیل اینکه این کارو کردین اینه که داخل متد main نمیشده متدهای pr1 , pr2 و pr3 رو مستقیما فراخوانی کرد دلیلش هم اینه که ,main یک متد static هست از داخل یک متد static نمیشه متدهای غیر static رو فراخوانی کرد. متدهای pr1 , pr2 و pr3 زمانی معنی دار هستند که از کلاس p1 یک object ساخته شده باشه اما main یک متد static هست و زمانی که ساختار کلاس اومد داخل scope ماشین مجازی یا jvm شناسایی و قابل فراخوانیه و نیازی به new شدن کلاس نیست یعنی حیات یک متد static وابسته به حیات object ساخته شده از کلاسش نیست برای فراخوانه یک متد static باید نام کلاس و بعد اسم متد رو بگین مثلا : MyClass.methodStatic( متدهای static کاربردهای زیادی به این شکل دارند. معروفترینش هم همین System.out.println
کاری که اولین بار بنظر شاید عجیب میاد ولی کاملا مرسوم و با اصول object orianted منطبقه اینه که شما داخل متد main یک کلاس از خود کلاس new کنین و ازش استفاده کنین بنابراین متد main بیشتر نقش شروع کننده برنامه رو داره تا یکی از خصیصه های کلاس در اونصورت اشکال فراخوانی متدهای غیر استاتیک پیش نمیاد چرا که از p1 یک object ساخته شده :

public class Pr
{
private String p1 = " IMAN ";
private String p2 = " computer ";
private String p3 = " Love ";
private String p4 = " java ";

public void pr1 () { System.out.println (p1); }
public void pr2 () { System.out.println (p2); }
public void pr3 () { System.out.println (p3); }
public void pr4 () { System.out.println (p4); }

public static void main (String args[]) {
Pr print = new Pr();
System.out.println();
print.pr1();
print.pr2();
print.pr3();
print.pr4();
}
}



اگر از IDE استفاده نمیکنین باید حتما "." رو هم در classpath قرار داده باشین وگرنه برنامه اجرا نمیشه حتی اگر کامپایل بشه. "." یعنی دنبال کلاس در شاخه جاری هم بگرد که در واقع کلاس Pr شما در شاخه جاری قرار داره.

پانوشت :

بهترین رفرنس :
http://java.sun.com/docs/books/tutorial/


یک رفرنس خوب آموزش جاوا بزبان فارسی :
نویسنده : هربرت شیلد
ترجمه : کانون نشر علوم
مشخصات : کتابی قطور با جلد سیاه رنگ روش هم عکس ببره ( نماد java 5 ) متاسفانه قیمتش یک کم بالاست یعنی 9900 تومن.

موفق باشین.

iman_n21
شنبه 28 مهر 1386, 01:52 صبح
عزیز دستت درد نکنه، زحمت کشیدی
مرسی

راستش دلیل اینکه دو تا کلاس تعریف کردم این بود که بعد میخواستم یک package ازش تعریف کنم چون تو این چیزایی که من خوندم در مورد package اینو فهمیدم که کلاسای داخل package باید public باشن تا بشه ازشون استفاده کرد
اومدم این دو سه خط و نوشتم واسه تست
میشه یه مقدار هم به صورت کاربردی (نه کتابی ! ) در مورد package ها توضیح بدید ؟

با وجود این 5-6 کتابی که دور و برمه دارم همه چیز رو با حدس و خطا یاد میگیرم
بعضیاش خیلی گیجم میکنه
مثلا یکیش اومده در مورد interface درس بده، ربطش داده به وراثت و میگه کلاس از رابط ارث میبره و .....!
بعد از 2 روز گیج و ویجی فهمیدم که ای بابا interface هدف اصلیش چندریختی و پنهان سازیه اطلاعاته نه وراثت و کلاس ازش چیزی به ارث نمیبره بلکه پیاده سازیش میکنه ( البته در مورد متدها )
بگذریم... سرتو درد آوردم

iman_n21
شنبه 28 مهر 1386, 02:18 صبح
چنتا سوال دیگه هم دارم ( البته با اجازه )

1- اگر بخوام این برنامه رو همن جور که اول نوشتم کامپایل کنم چیکار کنم یعنی یه برنامه با چند کلاس که چنتاش public باشه که اگه خواستیم بزاریمشون تو یک package و ازشون با import جای دیگه استفاده کنیم ؟
2- دو تا کلاس public رو بخوام بزارم تو یه package چی ؟
3- اگه یه فایل داشته باشم که 2 تا کلاس توش باشه، یکیش هم public باشه ، اسم فایل رو چی بزارم ؟ (اسم کلاس public یا کلاسی که متد main توشه ؟ )

این یکی کامپایل شد خیلی راحت هم اجرا شد

4- اگه بخوام 2 تا کلاس داخل فایل زیر رو هر کدوم بزارم تو یه فایل جدا و هر کدوم رو مستقل کامپایل کنم چی کار کنم ؟ (( کلاسی که متد main داره رو چه جور کامپایل کنم ؟ (یا هر کلاسی که از متدهای یه کلاس دیگه استفاده میکنه ) ، ( یا چنتا کلاس که از هم ارث میبرن ) ))

5- من میتونم 2-3 تا کلاس تو یه package تعریف کنم ولی متد main نداشته باشم ، مثلا 2-3 تا کلاس کاملا مجزا که هیچ ربطی به هم ندارن ؟


6- قوانین رابط ها دقیقا مثل کلاسهاست ؟ یعنی دو تا رابط public یا یه رابط public و یه کلاس pubic با هم تو یه فایل نباید باشن ؟ (چون بعد از کامپایل هم که واسشون .class درست میشه، آره ؟ ) اینجوری خیلی محدود نمیشیم ؟

iman_n21
یک شنبه 29 مهر 1386, 14:32 عصر
کسی نیست که به این سوالها جواب بده ؟؟؟!!!!
مدیران
اساتید

در حد بله یا خیر هم باشه خوبه ؟!