View Full Version : پارامترهای ارجاعی
esshahab
پنج شنبه 28 خرداد 1388, 19:45 عصر
سلام
توی C++ برای اینکه پارامتر را ارجاعی کنیم از & استفاده می کردیم
فکر می کردم توی جاوا کلاس ها خود به خود فراخوانی با ارجاع بشند
ولی انگار این طور نیست
void get(String a, String b) {
a = this.a;
b = this.b;
}
در کد بالا به جای اینکه مقدار a و b تغییر کنه اما همون مقدار های قبلی بر میگرده. که میشه فراخوانی با مقدار.
راه حلی برای ارجا عی کردن پارامترها توی جاوا هست؟
با تشکر.
adinochestva
پنج شنبه 28 خرداد 1388, 20:49 عصر
از آرایه استفاده کن ( شاید راههای بهتری هم باشه )
public void methodWithTwoOutParams(int[] out_int, double[] out_double) {
out_int[0] = 1;
out_double[0] = 1.1;
}
usage:
int[] out_int = { 0 };
double[] out_double = { 0.0 };
methodWithTwoOutParams(out_int, out_double);
System.out.println(out_int[0]);
System.out.println(out_double[0]);
cups_of_java
جمعه 29 خرداد 1388, 01:23 صبح
سلام
توی C++ برای اینکه پارامتر را ارجاعی کنیم از & استفاده می کردیم
فکر می کردم توی جاوا کلاس ها خود به خود فراخوانی با ارجاع بشند
ولی انگار این طور نیست
void get(String a, String b) {
a = this.a;
b = this.b;
}
در کد بالا به جای اینکه مقدار a و b تغییر کنه اما همون مقدار های قبلی بر میگرده. که میشه فراخوانی با مقدار.
راه حلی برای ارجا عی کردن پارامترها توی جاوا هست؟
با تشکر.
برای این کار از دو متد مختلف استفاده کنید:
String getA() {
return this.a;
}
String getB() {
return this.b;
}
esshahab
جمعه 29 خرداد 1388, 09:02 صبح
با سلام به دوستان
ممنون بابت جواب هاتون
جناب cups_of_java راستشو بخواهی بعد از اینکه این پست را گذاشتم همین کار را کردم اما بعضی جاها چون کلاسم شش تا صفت داشت مجبور شدم شش تا متد بنویسم.
می خواستم بدونم راهی نداریم که توی جاوا هم مثل سی پلاس پلاس عمل کنیم.
با تشکر.
java_nith
جمعه 29 خرداد 1388, 19:51 عصر
بله، تعداد متدهای get او set خیلی زیاد میشه
(حتا برنامهٔ elipse یه گزینهیی داره که میتونه همهٔ اینهارو برات اوتومات درست کنه)
برای این موضوع میتونی از آرایهها استفاده کنی
بد که خواستم برات کد رو بنویسم دیدم که شاید بخوای تعداد ایندکس عوض بشه
برای همین از ArrayList استفاده کردم
قابلیت این اینه که احتیاجی نداری از اول بهش بگی ایندکس Array ات چقدر باشه
بلکه بهش هی عدد میدی و اون بد از اینکه لیستش پر شد میبینه که چقدر از لیستش پر شده
با متد setDataToList به ArrayList عدد میدم
هرچقدر که کاشتم،
بد میگم که کل لیستو برام بنویسه.. getDataFromList
import java.util.ArrayList;
public class ArrayParm
{
private static ArrayList<Integer> list = new ArrayList<Integer>();
public static void main(String []args){
//Put int into list
setDataToList(12);
setDataToList(34);
setDataToList(78);
setDataToList(129);
//get list over ArrayList
getDataFromList();
}
public static void setDataToList(int data){
list.add(data);
}
public static int getDataFromList(){
for(int i = 0; i < list.size(); i++){
System.out.println("Index nr. "+i+" have value: "+list.get(i));
}
return 0;
}
}
cups_of_java
شنبه 30 خرداد 1388, 02:01 صبح
با سلام به دوستان
ممنون بابت جواب هاتون
جناب cups_of_java راستشو بخواهی بعد از اینکه این پست را گذاشتم همین کار را کردم اما بعضی جاها چون کلاسم شش تا صفت داشت مجبور شدم شش تا متد بنویسم.
می خواستم بدونم راهی نداریم که توی جاوا هم مثل سی پلاس پلاس عمل کنیم.
با تشکر.
اتفاقن راه اصولیش اینه که برای هر خصوصیت یک متد برای set کردنش (setter) و یک متد برای خواندنش (getter) بنویسی. این مسله در جاوا به انواع یک استاندارد (برای تعریف یک Java Bean) به کار می ره. زیاد شدن تعداد متد ها اصلن ایرادی نداره :)
java_nith
شنبه 30 خرداد 1388, 05:18 صبح
من هم با cups_of_java موافقم
و همانطوری که هم گفتم توی eclipse خوده برنامه میتونه این متد هارو براتون درست کنه
یه چیز دیگیی که توی مدرسه به ما یاد دادن که من میگم اینجا
برای امنیت بیشتره برنامه است
کل atributt هارو باید private بزنید
جوری که کلاس دیگییی نتونه تغیرش بده و یه بخونتشن
و برای تغییر اونها و برای خواندن اونها از متد استفاده کنید
مثلا
private int age;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
و یه عکسی هم از قابلیت eclipse
برای getter and setter
فقط با ایجاده یک atributt
خودش متدهای get و set درست میکنه
mazdadoost
سه شنبه 02 تیر 1388, 20:42 عصر
سلام
توی C++ برای اینکه پارامتر را ارجاعی کنیم از & استفاده می کردیم
فکر می کردم توی جاوا کلاس ها خود به خود فراخوانی با ارجاع بشند
ولی انگار این طور نیست
void get(String a, String b) {
a = this.a;
b = this.b;
}
در کد بالا به جای اینکه مقدار a و b تغییر کنه اما همون مقدار های قبلی بر میگرده. که میشه فراخوانی با مقدار.
راه حلی برای ارجا عی کردن پارامترها توی جاوا هست؟
با تشکر.
با سلام
دوست عزیز چرا می خواهید ازارسال با ارجاع در متد کلاس برای انواع داده اولیه استفاده کنید.
میشه نمونه کد جایی رو در برنامتون که به این ویژگی نیاز داره رو در اینجا بذارید.
cups_of_java
چهارشنبه 03 تیر 1388, 09:29 صبح
با سلام
دوست عزیز چرا می خواهید ازارسال با ارجاع در متد کلاس برای انواع داده اولیه استفاده کنید.
میشه نمونه کد جایی رو در برنامتون که به این ویژگی نیاز داره رو در اینجا بذارید.
۱. string نوع اولیه داده نیست.
۲. در جاوا ارسال از نوع ارجاع برای انواع داده اولیه معنی نداره
mazdadoost
چهارشنبه 03 تیر 1388, 10:18 صبح
۱. string نوع اولیه داده نیست.
۲. در جاوا ارسال از نوع ارجاع برای انواع داده اولیه معنی نداره
در کجای سوال بنده گذاره : String نوع داده اولیه است می باشد؟
حالا سوال ها شد سه تا؟
جالبه؟
esshahab
پنج شنبه 04 تیر 1388, 20:35 عصر
سلام به همه دوستان
در جواب mazdadoost عزيز
مي خواستم مثل C++ عمل کنم که ديدم نمي شه. يک متد get براي کليه صفات کلاسم بنويسم. که هيچ کدوم از روش هايي که دوستان گفتند مشکل من را حل نمي کنه.
مثلا
public class InboxDetail implements Serializable{
int identifier;
String sender;
String subject;
String status;
String context;
public InboxDetail() {
}
public void set(int identifier, String sender, String subject, String context, String status) {
this.identifier = identifier;
this.context = context;
this.sender = sender;
this.status = status;
this.subject = subject;
}
public void get(Int identifier, String sender, String subject, String context, String status) {
identifier = this.identifier;
context = this.context;
sender = this.sender;
status = this.status;
subject = this.subject;
}
}
آخرش هم براي هر کدوم يک متد get جداگونه نوشتم.
توي C++ وقتي از & استفاده مي کنيم مي گيم متغير ارجاعي ميشه.
يعني اون ارجاعي با کلاس هاي ارجاعي جاوا و سي شارپ فرق داره!؟
با تشکر از همه دوستان که جواب دادند.
java_nith
پنج شنبه 04 تیر 1388, 23:46 عصر
توی جاوا برای GET از void استفاده نمیکنن
و از اون دسته دیتا که میخواین return بشه استفاده میکنید
مثلا اگه میخواهید که String رو get براتون نشون بده:
public String getSender(){
return this.sender;
}
حتما باید کلمهٔ return توش باشه
mazdadoost
شنبه 06 تیر 1388, 16:31 عصر
با تشکر از همه دوستان که جواب دادند.[/QUOTE]
سلام به همه دوستان
در جواب mazdadoost عزيز
مي خواستم مثل C++ عمل کنم که ديدم نمي شه. يک متد get براي کليه صفات کلاسم بنويسم. که هيچ کدوم از روش هايي که دوستان گفتند مشکل من را حل نمي کنه.
مثلا
public class InboxDetail implements Serializable{
int identifier;
String sender;
String subject;
String status;
String context;
public InboxDetail() {
}
public void set(int identifier, String sender, String subject, String context, String status) {
this.identifier = identifier;
this.context = context;
this.sender = sender;
this.status = status;
this.subject = subject;
}
public void get(Int identifier, String sender, String subject, String context, String status) {
identifier = this.identifier;
context = this.context;
sender = this.sender;
status = this.status;
subject = this.subject;
}
}
آخرش هم براي هر کدوم يک متد get جداگونه نوشتم.
توي C++ وقتي از & استفاده مي کنيم مي گيم متغير ارجاعي ميشه.
يعني اون ارجاعي با کلاس هاي ارجاعي جاوا و سي شارپ فرق داره!؟
با تشکر از همه دوستان که جواب دادند.
دوست عزیز :
راستش بنده هنوز هم دقیقا نتونستم منظور شما و ضرروت انجامش رو درک کنم! منتها سعی میکنم تا با ذکر چند نکته به جواب سوالی که دقیقا درک نکردم نزدیک بشم:
1-در جاوا کلا دو نوع داده داریم :
الف : داده های نوع اولیه:که 8 تا هستند .(int-char-boolean و ...)
ب : داده های مرجع شامل کلاس ها چه مجرد چه معمولی -اینترفیس - آرایه و Enum ها هستند.
هر وقت پارامتر در جاوا از نوع داده اولیه باشه کپیش در اختیار متد قرار میگیره در نتیجه بعد از اجرای متد مقدار متغیری که به عنوان پارامتر به تابع فرستاده شده تغیر نمیکنه!
در مورد انواع مرجع تقریبا روش جاوا کمی گمراه کننده ست! جاوا از طرفی میگه : متغیر های شی رو با مرجعشون میشناسه . ولی وقتی همین مراجع رو به متد ها میفرستیم و انتطار داریم متد مثل یک اشاره گر ازشون برای تغیر مقدار شی مورد نظرمون استفاده کنه و انگار شی با مقدار به متد رد شده! مثل انواع اولیه. واقعیت اینه که اصطلاح pass by Reference در مورد زبانی مثل جاوا برای پارامتر های متد صادق نیست . جاوا همیشه در پارامتر های متد ها pass by value عمل میکنه! در مورد انواع داده اولیه که داستان واضحه .اما در مورد انواع داده Reference چطور؟دراین مورد هم یک کپی از Reference به عنوان پارامتر متد فرستاده میشه .البته خود اسمه متغیر اولیه به شی مورد نظر شما هم یک کپی از Reference به شی مورد نظر هست مثلا
Object o=new Object ()
در این جا یک نمونه جدید در heap برای شی Object ساخته میشه و یک Reference به اسم o برای اشاره به این نمونه جدید اختصاص داده میشه. وقتی این Reference رو یعنی o رو به یک متد رد میکنید جاوا یک کپی از این Reference رو به متد رد میکنه و از اون جایی که هر دو Reference به یک شی در Heap اشاره میکنند هر تغیری در کپی o بی واسطه روی o ثبت میشه. اما چنانچه در بدنه متد از دستوری مثل این استفاده کنید :
Object p=new Object();
p=o;
چه اتفاقی میفته؟ آیا شی o به p اشاره خواهد کرد؟ آیا هر تغیری در p در o منعکس خواهد شد؟
خیر ! در اینجا جاوا در Heap شی از نوع Object با یک Reference به اسم p ایجاد میکند . با انتصاب o به p از حالا به بعد o به جای اشاره به اولین شی Object به شی Object ی که در متد با عنوان p ساخته شده اشاره خواهد کرد! در نتیجه هر تغیری در o با عث تغیر در شی object دوم خواهد شد! به زبان ساده اشاره گر های جاوا آدرس اصلی شی نیستند بلکه صرفا مکان اشاره گر شی را در Heap نگهداری میکنند. یا شاید بتوان گفت اشاره گری به اشاره گر هستند !(o&&)!برای همین امر شما میتوانید از طریق Reference که متد رد شده به اشاره گری به اشاره گر شی در heap دسترسی پیدا کنید و خواص شی را تغیر دهید .اما برای اینکه بتوانید کاری کنید که Reference جدیدی به Reference شی مورد نظر اشاره کند باید به اشاره گر اصلی Reference اولیه دسترسی داشته باشید و نه یک کپی از اشارگری به اشاره گر اصی آن!(اشاره گر تو اشاره گر شد!اینا همش به خاطر اینه که امنیت زیان حفظ شه و از طرفی از نظر معماری کار درستی نیست .و اصول شی گرایی رو زیر پا میگذاره .)
اگر اشتباه نکنم در سوال اولتون اشاره کرده بودین به یک متد با این تعریف :
void get(String a, String b) {
a = this.a;
b = this.b;
}
صرف نظر از اینکه طبق گفته دوستمون این کد از لحاظ مفهومی آدم رو دچار ابهام و گمراهی میکنه (از get استفاده کردین اما انتظار void دارید!).اشیایی که از کلاس String میسازید immutable هستد و بعد از اینکه درست شدند (یعنی به محظ اینکه دو شی از نوع String با Reference های a,b در Heap ساختید دیگه نمیتونید تغیرشون بدین ! در مورد همه اشیاء immutable مثل Integer-Boolean-Byte و غیره وضع به همین منواله.
امیدوارم مفیدبوده باشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.