ورود

View Full Version : مبتدی: کمک به درک this



#root#
شنبه 12 بهمن 1392, 11:55 صبح
سلام

داشتم آموزش جاوا رو میدیم (New Booston) که عنوان فیلم toString بود ، این کدهاش :

public class MyObject {

private int a;
private int b;
private int c;

public MyObject(int aa, int bb, int cc) {
a = aa;
b = bb;
c = cc;
System.out.printf("The constractur for this is %s\n", this);
}

public String toString() {
return String.format("%d/%d/%d", a, b, c);
}

}

public class Main {

public static void main(String[] args) {

MyObject myObject = new MyObject(1, 2, 3);

}

}


خروجی : The constractur for this is 1/2/3

حالا مشکلم اینه که نمیتونم درک کنم در متد سازنده کلاس MyObject وقتی خروجی رو چاپ میکنه با نوشتن this چجوری متد toString اونجا اجرا میشه؟

پیشاپیش ممنونم ،برای تاپیکهم عنوان بهتر از این نتونستم سرهم کنم.

cups_of_java
شنبه 12 بهمن 1392, 12:10 عصر
این چاپ شدن کار this‌ نیست و ربطی به خود اون نداره اصن. This واسه اشاره کردن به شی جاری شماست که حتمن اینو میدونی.
حالا وقتی شما یک شی رو با عملگر + با یه String‌دیگه میچسبونی اون شی باید string‌شه تا بتونه با یه string دیگه بچسبه دیگه بنابراین اتوماتیک متد toStringاش صدا میشه:

MyClass c = new MyClass();
String sample = "Salaaam " + c;

cups_of_java
شنبه 12 بهمن 1392, 12:11 عصر
عین همین واسه printf‌ هم هست. که باید متغیر هایی که بهش میدین رو string کنه برابراین روشون متد toString رو صدا میزنه

#root#
شنبه 12 بهمن 1392, 12:35 عصر
پس که این طور ، لطف کردید :قلب: ، وقتی اسم متد toString رو عوض کردم جواب دیگه ای داد
The constractur for this is MyObject@60991f

safir187
شنبه 12 بهمن 1392, 15:17 عصر
اینجا که this وجود نداره عزیز جان.

احتمالا سوالت اینه که چطوری toString خودکار اجرا شده.

این کار System.out.print هست. که اگر بهش String بدی خروجی میده. اگر primitive بدی میاد ازش String میسازه بعد خروجی میده. و هر Object ی که بدی (توی جاوا غیر پریمیتوها همه چیز Object ه) خودش متد toString رو صدا میکنه و خروجی میگیره.
اینو توی دوره آموزش جاوا توضیح داده بودم.

cups_of_java
شنبه 12 بهمن 1392, 20:25 عصر
پس که این طور ، لطف کردید :قلب: ، وقتی اسم متد toString رو عوض کردم جواب دیگه ای داد
The constractur for this is MyObject@60991f

بخاطر اینکه toString متد کلاس پدرشه (کلاس Object) که همه کلاس ها از اون به طور اتوماتیک به ارث میبرن. و به طور پیش فرض کارش این هست که آدرس حافظه شی رو چاپ میکنه.
پس اون متد toString در واقع override متد toString کلاس Object هست که وقتی اسمش رو عوض کردی دیگه فراخوانی نمیشه و همون toString کلاس Object صدا زده میشه.