ورود

View Full Version : سوال در مورد Cast کردن در جاوا



Sina.iRoid
چهارشنبه 28 آبان 1393, 08:25 صبح
سلام دوستان. ممنون میشم اگر راهنماییم کنید.

اگر میشه به کد زیر نگاه کنید:


public class DriverClass {

public static void main(String[] args) {

String num3 = "2.5";

System.out.println(Float.parseFloat(num3) + 3);
System.out.println(Float.valueOf(num3) + 3);

double n1 = 2.5;

int n = (int) n1;
System.out.println(n + 3);
}
}


من الان متوجه نمیشم که فرق cast کردن با اینکه به اینصورت "Float.valueOf(num3) + 3" یک مقداری و به عدد تبدیل کنیم چیه!؟
ممنون میشم اگر راهنماییم کنید.

dasssnj
چهارشنبه 28 آبان 1393, 12:02 عصر
داری String را به float تبدیل می کنی . این کار با cast امکان پذیر نیست .

vahid-p
چهارشنبه 28 آبان 1393, 14:02 عصر
این متن ویرایش و تصحیح شده:

دو نوع Casting داریم :
1- بین Primary Values
مثلا
int i=(int)3.2;
که در این مورد عدد اعشاری از نوع Double به عدد صحیح Cast شده و قسمت اعشاریش حذف میشه.
که اینجا فقط بین اعداد امکان پذیر است.

2- بین کلاس ها
در صورتی که بخواهید متغیر superclass رو به subclass نسبت بدید باید از Casting استفاده کنید. همچنین اگر Child implements XClass باشد، آنگاه برای نسبت دادن آبجکتی با نوع استاتیک XClass به Child به Casting نیاز دارید (البته نوع واقعی آبجکت باید Child باشه و نه XClass). اما در جهت عکس نیازی به این کار نیست. اجازه بدید مثلا بزنم :
کد Parent :
public class Parent {
...
}
کد Child :
public class Child extends Parent implements Runnable{
@Override
public void run() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

حالا مثال های زیر رو ببینید.
از اونجایی که Child تمام ویژگی های Parent رو داره، پس هر جا به جای Parent از Child استفاده کنیم مشکلی پیش نمیاد ( برای همین p=c هیچ Casting ای نیاز نداره ). اما اگر بخوای از متغیر Parent جایی که Child هست استفاده کنیم، با Casting به برنامه میگیم که ما حواسمون هست. یعنی یه جورایی با اینکار داریم به کامپایلر میگیم مسئولیتش به عهده خودمون و آبجکت واقعی که جای Parent نشسته نوع واقعیش (بهش میگیم نوع دینامیک) Child هست و فقط نوع استاتیکش (که هنگام تعریف متغیر تعیین کردیم) Parent است. چرا این مجوز داده نمیشه چون ممکنه Parent بعضی از ویژگی های Child رو نداشته باشه ولی همیشه Child ویژگی های Parent رو داره. از اونجایی که ممکنه Parent ویژگی های Child رو نداشته باشه، هیچ وقت آبجکت واقعی Parent (یعنی نوع دینامیکش) هم Parent باشه، نمیتونه به جای Child قرار بگیره و خطای ClassCastException میده، حتی اگر در عمل ممکن بود تداخلی نداشته باشن).

ببینید:
Parent p=new Parent();
Child c=new Child();
Runnable r=new Runnable() {...};
// 1
c=(Child) p; //خطا
// 2
c=(Child) r; //خطا
// 3
p=c; //صحیح
// 4
r=c; //صحیح

یه مثال از اینکه مسئولیتش به عهده خودمون باشه. مثلا این متد رو ببینید :

public void print(Child child){
System.out.println(child.x);
}

خب حالا فرض کنید ما متغیر p از نوع استاتیک Parent رو به متد بالا پاس کنیم :

print((Child)p);

که اینجا ما به برنامه گفتیم حواسمون هست. ولی ممکنه نوع دینامیک (در هنگام اجرای برنامه) متغیر p از نوع Child نباشه و درنتیجه چون امکانش هست متغیر x نداشته باشه jvm خطا میگیره (حالا چه داشته باشه چه نه). پس خودمون باید حواسمون باشه که نوع واقعی (دینامیک) متغیر p همون Child باشه حالا هر چند اومدیم نوع متغیرش رو Parent گرفتیم. یعنی این حالت فقط مجازه:


Parent p= new Child();
print((child)p);

همچنین برای اینکه مطمئن بشید p از نوع child هست میتونید یک if (p instanceof Child) بنویسید.

بحث کاربردش نکردم، ولی کاربرد هم داره. فعلا با مفهوم دینامیک و استاتیک آشنا بشید و Casting رو متوجه بشید، کاربردهاش رو میتونید پیدا کنید

vahid-p
چهارشنبه 28 آبان 1393, 14:11 عصر
اگر متوجه نشدید Casting in java رو تو گوگل سرچ کنید. معمولا آموزشهای قشنگی در اینترنت به زبان انگلیسی وجود داره. مثلا : http://www.javabeginner.com/learn-java/java-object-typecasting