ورود

View Full Version : OOP در جاوا



biodread
سه شنبه 21 خرداد 1392, 10:20 صبح
سلام
من یک کلاس دارم به اسم A
و کلاس B از کلاس A مشتق شده
حلا من میخوام از کلاس B مقدار یه پروپرتی که در کلاس A به صورت پابلیک هست رو قبل از صدا زدن کانسترکتور کلاس A , تغییر بدم
آیا این کار شدنی هست؟

در جاوا معنی this که به صورت static در هر کلاس هست چیست مثلا :
MyClass.this

ممنونم

cups_of_java
سه شنبه 21 خرداد 1392, 13:26 عصر
۱. چیزی که شما می خوای یه کم عجیبه! قبل از کانستراکتور چیزی وجود نداره که شما بخوای مقدار پراپرتی اون رو تغییر بدی! چی کار می خوای بکنی؟ شاید روش اشتباهی رو داری استفاده می کنی.

۲. من تا حالا همچین چیزی ندیدم! توی جاوا MyClass.class داریم که متغیر استاتیک معرف شی کلاس مرتبط با کلاس شماست. this‌ اصن استاتیک نیست که بخواد به طور استاتیک وجود داشته باشه. this , static مثل کارد و پنیرن! با هم وجود ندارن

biodread
سه شنبه 21 خرداد 1392, 13:41 عصر
در مورد 1
{
ببین دوست من
شما یه کلاس داری که میاد یک شکلی میکشه و از متغییری که داخلش هست برای اندازه استفاده میکنه
حالا شما یکلاس دیگه داری که از همون کلاس قبلی مشتق شده حالا من میخوام بگم اندازه اون متغییر تغیر کنه و بعد کانسترکتور از اون متغیر استفاده کنه
در زبان های هایلول این کار امکان پذیر هست
}

در مورد 2
{
شما الان یه کلاس بساز به اسم A و توش یه متغیر پابلیکبه اسم myvar بساز
حالا یه کلاس دیگه بساز به اسم B و اسم کلاس A رو با اون متغیر بزار
مثلا
A.this.myVar
و دسترسی داری !
}

بهزاد علی محمدزاده
سه شنبه 21 خرداد 1392, 14:11 عصر
سلام . آخه شما میگی Static ! برو همون کلاس رو Static کن و بعد با this بهش اشاره کن ببین میشه .


در جاوا معنی this که به صورت static در هر کلاس هست

همچین چیزی نداریم . واژه استاتیک رو اشتباه به کار می بری .

در مورد 1 . می تونی در Class مشتق شده ، سازنده کلاس پایه رو با دستور super فراخوانی کنی . برو در مورد روش کارش تحقیق کن .

biodread
سه شنبه 21 خرداد 1392, 14:49 عصر
زدم
میگه که قبل از کانستراکتور نمیتونی پروپرتی ست کنی


-----------------
الان this مگه استاتیک نیست که بدونه نمونه سازی میشه بهش دسترسی داشت !

بهزاد علی محمدزاده
سه شنبه 21 خرداد 1392, 15:01 عصر
بعد کانسترکتور از اون متغیر استفاده کنهمشخصه که نمیشه ، سوال رو خوب نمی رسونید . اگر ممکنه کد بذارید .



الان this مگه استاتیک نیست که بدونه نمونه سازی میشه بهش دسترسی داشت ! this‌ کلاس نیست . یه کلمه ی کلیدیه که به کلاس جاری اشاره می کنه .

cups_of_java
سه شنبه 21 خرداد 1392, 17:24 عصر
در مورد 1
{
ببین دوست من
شما یه کلاس داری که میاد یک شکلی میکشه و از متغییری که داخلش هست برای اندازه استفاده میکنه
حالا شما یکلاس دیگه داری که از همون کلاس قبلی مشتق شده حالا من میخوام بگم اندازه اون متغییر تغیر کنه و بعد کانسترکتور از اون متغیر استفاده کنه
در زبان های هایلول این کار امکان پذیر هست
}

در مورد 2
{
شما الان یه کلاس بساز به اسم A و توش یه متغیر پابلیکبه اسم myvar بساز
حالا یه کلاس دیگه بساز به اسم B و اسم کلاس A رو با اون متغیر بزار
مثلا
A.this.myVar
و دسترسی داری !
}

هر جفت سوال های شما بر میگرده به اطلاع نا دقیق شما از شی گرایی. وقتی سوال میپرسید پذیرای جواب باشید یا اینکه بیشتر مطالعه کنید

abbasalim
سه شنبه 21 خرداد 1392, 23:40 عصر
سلام
این کار شدنیه ولی کدش یادم نیس :D

biodread
چهارشنبه 22 خرداد 1392, 08:15 صبح
تو زبان های هایلول به راحتی میشه
تو جاوا هم حتما باید بشه
وبه نظر دوستمون من مشکل OOP دارم

spiderman200700
چهارشنبه 22 خرداد 1392, 12:58 عصر
سلام
من یک کلاس دارم به اسم A
و کلاس B از کلاس A مشتق شده
حلا من میخوام از کلاس B مقدار یه پروپرتی که در کلاس A به صورت پابلیک هست رو قبل از صدا زدن کانسترکتور کلاس A , تغییر بدم
آیا این کار شدنی هست؟


من دقیقا متوجه نشدم شما چی میخوای ولی با این کد میتونی پراپرتی های کلاس پدر رو قبل از هز کاری تغییر بدی:
class A {

public int x;
public int y;

public A(int x, int y) {
this.x = x;
this.y = y;
}
}

class B extends A {

public int z;

public B(int x, int y, int z) {
super(x, y);
this.z = z;
}
}



در جاوا معنی this که به صورت static در هر کلاس هست چیست مثلا :
MyClass.this


درسته که سینتکس رو در اینجور استفاده کردن از this به صورت استاتیک میبینیم، ولی استاتیک نیست در اصل.
این طرز استفاده در کلاس های تو در تو مورد استفاده قرار میگیره.اینو ببین:
class ShadowTest {

public int x = 0;

class FirstLevel {

public int x = 1;

void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}

public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
this.x به x مربوط به کلاس FirstLevel اشاره میکنه، و ShadowTest.this.x به x مربوط به کلاس ShadowTest اشاره میکنه. همین:چشمک:

biodread
چهارشنبه 22 خرداد 1392, 15:26 عصر
spiderman200700
واقعا ممنونم
سوال دو رو کامل متوجه شدم
بسیار بسیار ممنون
پس من نمیتونم کلاس ShadowTest رو در کلاس دیگری که کلا در یک پکیج دیگه هست بدین صورت استفاده کنم
ShadowTest.this.x = 40
طبق منطق من باید error بده چون نمونه ای ازش ساخته نشده و متغییر هم از نوع استاتیک نیست

در مورد سوال یک
من تو کدت یه تغییر کوچک میدم
حالا بنظر شما کار میکنه ؟

176


class A {

public int x;
public int y;

public A(int x, int y) {
this.x = x;
this.y = y;
}
}

class B extends A {

public int z;

public B(int x, int y, int z) {
super.x = super.y = 88;
super(x, y);
this.z = z;
}
}

قبل از اجرای super(x,y) من پروپرتی ها رو ست کردم

spiderman200700
پنج شنبه 23 خرداد 1392, 11:32 صبح
spiderman200700
واقعا ممنونم

در مورد سوال یک
من تو کدت یه تغییر کوچک میدم
حالا بنظر شما کار میکنه ؟

176


class A {

public int x;
public int y;

public A(int x, int y) {
this.x = x;
this.y = y;
}
}

class B extends A {

public int z;

public B(int x, int y, int z) {
super.x = super.y = 88;
super(x, y);
this.z = z;
}
}

قبل از اجرای super(x,y) من پروپرتی ها رو ست کردم
خواهش میکنم
میتونی امتحان کنی خودت. خیلی سریعتر به جواب سوالت میرسی.
ولی نه نمیشه.
اولا دستور super(x, y); همیشه باید اولین دستور در کانسترکتور باشه.
دوما وقتی کانسترکتور کلاس پدر آرگومان های ورودی ای رو میگیره ، در کانستراکتور کلاس فرزند ، حتما باید با استفاده از مثلا super(x,y) ، کانسترکتور کلاس پدر رو صدا بزنی که مقدار دهی بشه.
حالا شما اگه خواستی میتونی بعد از این کار از دستور super.x = super.y = 88; استفاده کنی.
اینم در نظر داشته باش که وقتی دستور super(x, y); اجرا بشه ، قبل از هر کار دیگه ای مقادیر کلاس پدر ست میشن. دقیقا همون چیزی که شما میخوای.
مثلا اگه میخوای x و y مقدار 88 رو بگیرن باید اینجوری بنویسی.
class A {

public int x;
public int y;

public A(int x, int y) {
this.x = x;
this.y = y;
}
}

class B extends A {

public int z;

public B( int z) {
super(88, 88);
this.z = z;
}
}

biodread
پنج شنبه 23 خرداد 1392, 11:55 صبح
بله امتحان کردم و بابت همین این سوال رو مطرح کردم
در as3 این کار شدنیه
دوست من واقعا لطف کردی
ممنونم ازت