PDA

View Full Version : سوال در مورد ارث بری از کلاس JFrame



Sina.iRoid
سه شنبه 22 مهر 1393, 16:30 عصر
سلام دوستان.
من وقتی که از کلاس JFrame ارث بری می کنم، یه هشداری بم میده که نمی دونم معنیش چیه. ممنون میشم اگر راهنماییم کنید.

این کد منه:


import javax.swing.JFrame;


public class LabelFrame extends JFrame{


}


برای اسم کلاس این پیغام و می نویسه:
The serializable class LabelFrame does not declare a static final serialVersionUID field of type long

ممنون میشم اگر توضیح بدین یعنی چی.

parvizwpf
سه شنبه 22 مهر 1393, 17:18 عصر
نام کلاس رو تغییر بدید آیا همین ارور میاد؟

Sina.iRoid
سه شنبه 22 مهر 1393, 17:34 عصر
بله دوست عزیز.
البته برنامه اجرا میشه. ولی می خوام بدونم که برای چی هست.

vahid-p
سه شنبه 22 مهر 1393, 17:40 عصر
احتمالا از اکلیپس استفاده میکنی که برای کلاس ها فکر کنم خودش این عدد رو مینویسه. دقیق نمیدونم چه عددیه ولی بهتره نوشته بشه، اما ننویسی هم مشکلی پیش نمیاد. تو کلاس های استاندارد دیدم هست این عدد.

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

اطلاعات زیادی ندارم ازش، این چیزی بود که تا الان فکر میکردم درسته

parvizwpf
سه شنبه 22 مهر 1393, 17:42 عصر
من با اون اسم کلاس جواب گرفتم و اجرا شد. احتمالا در برنامه یا لایبرری دارید که این کلاس قبلا تعریف شده یا توی نامهای کلاسهای دیگر شما وجود داره.

محمد فدوی
سه شنبه 22 مهر 1393, 19:10 عصر
Java موقع سریالی کردن اشیاء (Object Serialization) و همینطور برعکس موقع دِسریاله کردن اشیاء (Object Deserialization) برای تشخیص اینکه این شیء از چه نوعی هست یا اصلا به کلاسی که برنامه‌نویس درخواست کرده قابل تبدیل هست یا نه از یه ID یکتا استفاده می‌کنه و اگر ID شیء با ID منبع سریالی شده باهم یکی نباشن یه استثناء InvalidCastException پرتاب می‌کنه.
اگه این ID توسط برنامه‌نویس تعیین نشه Java خودش با توجه به خیلی مسائل (...) یه ID یکتا برای اون کلاس تولید می‌کنه و در صورت لزوم ازش برای سریالی/دِسریاله کردن اون شیء استفاده می‌کنه.
برای تعیین این ID توسط خودتون کافیه ثابت serialVersionUID رو با هر معرف دلخواهی (private یا public یا protected) برای کلاس ایجاد کنی:


public class LabelFrame extends JFrame {
private /* public - protected */ static final long serialVersionUID = 1L; // Or any other long value...
...
}

در مواقعی که مطمئنید شما قرار نیست شیء رو سریالی کنید (مثل همینجا) فرقی نمی‌کنه، ولی اگه کلاسی که دارید می‌نویسید قراره سریالی بشه، بهتره این ثابت رو هم خودتون بنویسید.
در غیر اینصورت، برای راحتی از نشون دادن این اخطار، می‌تونید این Warning رو از تنظیمات IDEتون غیرفعال کنید؛ علاوه بر این می‌تونید اصلاحگر SupressWarnings رو به کلاستون اضافه کنید و در مورد این کلاس از این اخطار راحت شید:


@SupressWarnings("serial")
public class LabelFrame extends JFrame {
// No Warning!
...
}

موفق باشید.

ویرایش:
* به نوشتن یه شیء توی یه جریان خروجی (Output Stream) سریالی کردن میگن (مثل موقعی که می‌خواید اطلاعات یک شیء رو توی یه فایل ذخیره کنید) و بالعکس، به خوندن یه شیء از طریق یه جریان ورودی (Input Stream) دِسریاله کردن میگن (مثل موقعی که همون شیء رو دوباره از روی فایل ذخیره شده بازسازی می‌کنید)

abdoullah.aberi
سه شنبه 22 مهر 1393, 19:39 عصر
سلام دوست عزیز این کد شما در کل اجرا نمیشه این کلاس نیاز به متد main داره که الان اینجا نیست