PDA

View Full Version : مبتدی: class class چیست



karimi72
جمعه 16 اسفند 1392, 15:25 عصر
دوستان کلاس class دقیقا برای چه منظوری درست شده است؟
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
این مطلب راه گشایم نبود.

vahid-p
جمعه 16 اسفند 1392, 17:19 عصر
سوال خوبی بود، خودمم به این کلاس دقت نکرده بودم در صورتی که هر آبجکتی با متد getClass این کلاس رو بهمون میده و عمومیه.
طبق چیزی که من از داکیومنتش فهمیدم این کلاس به شما اجازه میده در مورد کلاس شی تون اطلاعاتی رو در زمان اجرا به دست بیارید. بذارید بیشتر توضیح بدم.
فرض کنید شما میتونید اسم یک کلاسی (مثلا کلاس Random ) رو به این صورت بدست بیارید Random.class.getName() و کاربردهایی داشته باشه براتون. ولی این برای خود کلاس هست و نه Object ساخته شده از اون و در نتیجه از قبل باید تو کدتون بنویسید. فرض کنید میخواید چک کنید تمام عناصر یک آرایه مثلا از فلان آبجکت هستند :
if(obj1 instanceof Random) System.out.println("obj1 is a object of random");
خب این کار درستیه. ولی فرض کنید بخواهید دو تا آبجکت رو چک کنید که آیا از یک کلاس هستند یا نه. اونوقت شما از قبل کلاس هیچ کدوم رو نمیدونید که از instanceof استفاده کنید پس باید اول آبجکت کلاس هاشون رو بگیرید و اونا رو باهم مقایسه کنید. مثال زیر رو ببینید :

JFrame win1=new JFrame();
JFrame win2=new JFrame();
Random r=new Random();
Class cwin=win1.getClass();
Class cw=win2.getClass();
Class cr=r.getClass();

if(win1.equals(win2)) System.out.println("#0");
if(cwin.equals(cw)) System.out.println("#1");
if(cwin.equals(cr)) System.out.println("#2");
خروجی :
#1

چرا؟ چون اولین شرط میگه اگر دو تا آبجکت با هم برابر بودند. خب میدونیم دو آبجکت مجزا حتی اگر از یک کلاس باشند هم با هم برابر و معادل نیستند ( البته String استثنا هست و کاری باهاش نداریم چون اونم متد eqauls اش رو اورراید کردن که این قضیه رو متفاوت میکنه ). پس شرط برقرار نیست.
شرط دوم از آبجکت کلاسهاشون استفاده میکنه. دقت کنید کلاس Class رو نمیتونید new کنید. برای همین هم تمام آبجکت های ساخته شده از یک کلاس به یک و تنها یک آبجکت که اون هم آبجکت کلاسشون هست به هم مرتبط هستند. برای همین حاصل getClass همواره یک آبجکت هست و نه یک نوع آبجکت. پس هر دو یه یک شی اشاره میکنند پس برقرار است.
شرط سوم بین آبجکت کلاس دو کلاس مختلف اشاره میکنه. پس برقرار نیست. اینطوری شما میتونید بین کلاس دو آبجکت مختلف هنگام اجرا مقایسه و ... داشته باشید.

مثال مقایسه کلاس زدم ولی کاربردهای خیلی زیاد دیگه ای داره. فرض کنید شما میخواهید اسم تمامی آبجکت های یک آرایه رو بدست بیارید. چه راهکاری دارید؟ هیچ راهکاری مگر اینکه فیلد جداگونه ای براش خودتون در نظر بگیرید یا اینکه خیلی بهتر از اون بیایید آبجکت کلاسش رو بگیرید و اسمش رو با getName بدست بیارید.
خیلی متد های دیگه مثل
isInterface()
cwin.getDeclaredMethods()
,...
رو داره.

موفق باشید