# فناوری جاوا > برنامه‌نویسی جاوا > Java SE : نگارش استاندارد جاوا >  OOP در جاوا

## biodread

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

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

ممنونم

----------


## cups_of_java

۱. چیزی که شما می خوای یه کم عجیبه! قبل از کانستراکتور چیزی وجود نداره که شما بخوای مقدار پراپرتی اون رو تغییر بدی! چی کار می خوای بکنی؟ شاید روش اشتباهی رو داری استفاده می کنی.

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

----------


## biodread

در مورد 1
{
ببین دوست من
شما یه کلاس داری که میاد یک شکلی میکشه و از متغییری که داخلش هست برای اندازه استفاده میکنه
حالا شما یکلاس دیگه داری که از همون کلاس قبلی مشتق شده حالا من میخوام بگم اندازه اون متغییر تغیر کنه و بعد کانسترکتور از اون متغیر استفاده کنه
در زبان های هایلول این کار امکان پذیر هست
}

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

----------


## بهزاد علی محمدزاده

سلام . آخه شما میگی Static  ! برو همون کلاس رو Static کن و بعد با this بهش اشاره کن ببین میشه .




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


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

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

----------


## biodread

زدم
میگه که قبل از کانستراکتور نمیتونی پروپرتی ست کنی


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

----------


## بهزاد علی محمدزاده

> بعد کانسترکتور از اون متغیر استفاده کنه


مشخصه که نمیشه ، سوال رو خوب نمی رسونید . اگر ممکنه کد بذارید .





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


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

----------


## cups_of_java

> در مورد 1
> {
> ببین دوست من
> شما یه کلاس داری که میاد یک شکلی میکشه و از متغییری که داخلش هست برای اندازه استفاده میکنه
> حالا شما یکلاس دیگه داری که از همون کلاس قبلی مشتق شده حالا من میخوام بگم اندازه اون متغییر تغیر کنه و بعد کانسترکتور از اون متغیر استفاده کنه
> در زبان های هایلول این کار امکان پذیر هست
> }
> 
> در مورد 2
> ...


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

----------


## abbasalim

سلام
این کار شدنیه ولی کدش یادم نیس :D

----------


## biodread

تو زبان های هایلول به راحتی میشه
تو جاوا هم حتما باید بشه
وبه نظر دوستمون من مشکل OOP دارم

----------


## spiderman200700

> سلام
> من یک کلاس دارم به اسم 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/tutori...OO/nested.html
this.x به x مربوط به کلاس FirstLevel اشاره میکنه، و ShadowTest.this.x به x مربوط به کلاس ShadowTest اشاره میکنه. همین :چشمک:

----------


## biodread

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

> spiderman200700
> واقعا ممنونم
> 
> در مورد سوال یک
> من تو کدت یه تغییر کوچک میدم
> حالا بنظر شما کار میکنه ؟
> 
> 176
> 
> ...


 خواهش میکنم
میتونی امتحان کنی خودت. خیلی سریعتر به جواب سوالت میرسی.
ولی نه نمیشه. 
اولا دستور  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

بله امتحان کردم و بابت همین این سوال رو مطرح کردم
در as3 این کار شدنیه
دوست من واقعا لطف کردی
ممنونم ازت

----------

