رفتن به مطلب
بیسیک فور ایکس

Recommended Posts

جلسه اول : شی گرایی و مفاهیم                                        

مقدمه :

زبان برنامه نویسی جاوا دارای ساختار syntax و شی گرا object oriented langugae می باشد . ما در این زبان برنامه نویسی با اشیایی سروکار داریم که حاوی داده هستن.

شی گرائی چیست ؟

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

مفاهیم شی گرایی ؟ هر نمونه ایی از کلاس ( class )  رو میگیم شی ، به مثال زیر توجه کنید :

 

تلفن همراه رو در نظر بگیرید . (به این تلفن همراه میگن کلاس ( class )) . با تلفن همراه میتونید تماس بگیرید( که این تماس گرفتن میشه رفتار behavior) هر تلفن همراهی باتری داره ( که این باتری میشه صفت (Attribute)) .

کلاس  (class ) چیه  : کلاس ها شامل خصوصیات ها (variable ) و رفتارها (method ) هستند

 

 variable  ها:

Variable خودش به سه بخش تقسیم میشه:

1-     Class Variable

متغیرهایی که فقط مربوط به اون کلاس هستند. یعنی من یک متغیری بنام آنتن میسازم در کلاس تلفن. حالا از این متغیر آنتن فقط میتونم در کلاس تلفن استفاده کنم.

public class Phone {

    private static int antenna =1; //class variable

}

static  در تکه کد بالا یعنی اینکه شما نیاز ندارید که نمونه ایی از آنتن بگیرید . به طور مستقیم می تونید از متغیر

آنتن استفاده کنید.

static   رو شما هر کجا دیدید بدونید که دیگه  مربوط به یک Object خاص نیست و برای همه Object   ها معنی میده.

این ویژگی static    رو هم خصوصیات variable ( class – object ) و هم رفتار یا متدها ( class – object )   ها می تونن داشته باشند.

بعنوان مثال من از هرگوشی فرقی نمی کنه میتونم بپرسم ظرفیت  باتریتون چند آمپر هستش ؟ این سوال رو میتونم از هر گوشی بپرسم و یک سوال خصوصی نیستش.

2-     Local Variable

متغیری که در داخل یکی از رفتارهای کلاس تعریف میشه.

public class Phone {

    private void samsung(){

        boolean nfc = false;  //local variable

    }
}

3-     Instance Variable - Field

متغیری از یک نمونه کلاس را Variable Instance  میگویند.این متغیر می تونه مقادیری مختلفی از هر نمونه ایی از کلاس بگیره. شما فرض کنید موبایل سامسونگ رو از یک نمونه آن می توانیم یک پردازنده 4 گیگ  بگیریم از یک نمونه دیگه پردازنده 2 گیگ بگیریم. این پردازنده از هر نمونه ایی می تونه متفاوت باشه.یا مثلا شما تلفن همراه رو درنظربگیرید یک تلفن ممکنه اسمش سامسونگ باشه یکی دیگه اپل که هر کدوم میتونن حافظه های مختلفی داشته باشند... حالا برای تعریف این مدل متغیرها مثل متغیر پردازنده یا حافظه و... میایم از Variable Instance  استفاده میکنیم. خلاصه اینکه برای هر نمونه ایی از کلاس می تونه مقادیر مختلفی بگیره


 

 


public class Phone {

        private int processor = 2;  // instance variable
 
}

 

 

یک چی در مورد public و private عرض کنم. از اسمشون مشخصه private  یعنی اینکه خصوصیه اقا جان  . شما فقط میتونی توی همون کلاس ازش استفاده کنی. Public  هم که خدا خیرش بده مثل وای فای خونه میمونه که همه میتونن ازش استفاده کنند. عید که میشه معنی Public   رو قشنگ حس میکنید.جلوتر توی کدنویسی بیشتر با این حضرات سروکله میزنیم که متوجه منظورم خواهید شد.

متدConstructor  

در کلاس مهمترین بخش آن  متدConstructor  آن هستش. این Constructor  چیه ؟ (متد سازندس)

همین تلفن همراه رو در نظر بگیرید ، به صورت دیفالت(پیشفرض) یکسری خصوصیاتی دارند که توصیف این خصوصیات دیفالت رو میگن Constructor  یا سازنده های کلاس. اگه واسه کلاس این متد رو بکار نبریم خود کامپایلر این کار رو میکنه. زمانی که میخواید شی جدیدی از کلاس بسازید متد Constructor   فراخوانی میشه. حالا چه شما براش چیزی ست کرده باشید چه نکرده باشید.

Constructor  متدی هستند که دقیقا همنام نام کلاس است و هیچ داده ایی را نمی تواند return  کند. این متد می تواند بدون پارامتر یا بیش از یک پارامتر باشند

مثلا شما میخواین از کلاس موبایل یک نمونه بگیری اون موقع این متدConstructor  این حضرت آقا باید فراخوانی میشه. فکر کنید یک تابع دارید که این تابع قراره برای هرمدل از گوشی های سامسونگ یک ورژنی یا اسمی یا لیبلی بزنه بره. که در این صورت ما باید در متد سازنده ذکر کنیم که حتما یک اسم یا لیبل بگیر  ...

public class Phone {

    public Phone(String name){  // <--------- Constructor


    }

}

حالا چطوری یک نمونه بسازیم.

Phone phone=new Phone("Samsung");

 

Phone اولی واسه اینه که بگی چه متغیری میخوایم

Phone دومی خوب اسمشه میتونه هرچی باشه و new هم بخاطره اینه که ما یک نمونه جدید میخوایم دیگه ..

Phone سومی اسم اون کلاسی که داریم ازش نمونه میگیریم که داخلش هم پارامترهایی رو میدیم که توی همون کلاس از ما خواسته بود.

public Phone(String name){  // <--------- Constructor

}

 توی مثال بالا پارامتر name  وارد شده. پس زمانی که یک نمونه میسازیم پارامترهای داخلش وارد میکنیم. این شکلی.

Phone phone=new Phone("Samsung");

 

 

ارث بری  Inheritance

            خب تعریف مشخصی داره مثلا شما فرض کنید چشمای من آبیه خوب یک قانونی میگه من اینو از پدر یا مادرم به ارث بردم. یا مثلا دماغ من چاقه خوب از شانس خوبم این مورد از پدرم و پدرم از مادرش به ارث برده ،جالب اینکه عمه هم همینطوره. کلیتش اینه که کلاس ها میتونن خاصیت ارث بری هم داشته باشند و یک سری خصوصیات رو از والد خود بگیره در عین حال خصوصیات جدیدی هم داشته باشند. که این ارث بری فرزند (subclass) رو با extends ربط میدن به والد ( superclass )

public class Samsung extends Phone{

}

یک کلید واژه ایی هست توی این ارث بری که خیلی دیکتاتوره . این کلید واژه رو چه موقع استفاده کنیم ؟مثلا اگه به عمد بخوایم ویژگی های والد رو بر روی فرزند پیاده کنیم . اسم این کلید واژه چیه ؟ Super

خوب یک مثال بزنم : سه تا کلاس ساختم .

1-     Phone  بعنوان کلاس پدر

2-     Sumsung بعنوان کلاس فرزند

3-     Pr  بعنوان کلاس اجرای پروژه

حالا میخوام خصوصیت processor  پدر به فرزند به اجبار اعمال بشه و از طریق کلاس Pr فراخوانی بشن و روی مانیتور به نمایش در بیان.

برای کلاس Phone   نوشتم :

public class Phone 

    int processor = 10;  // instance variable

   public Phone(){  // <--------- Constructor


    }

}

برای کلاس Sumsung

public class Sumsung extends Phone{

    int processor = 80;

    public void pro(){

        System.out.println("pro is "+super.processor);

    }


}

به نحوه استفاده این super توجه کنید .

 

 

برای کلاس Pr

 


public class Pr {

    public static void main(String[] args) {

        Sumsung sumsung=new Sumsung();

        sumsung.pro();

    }

}

 

 

 

حالا خروجی رو ببینید : با اینکه من توی فرزند int processor = 80; رو اعمال کرده بودم اما بخاطر کلمه super خصوصیت پدر یعنی    int processor = 10;   چاپ شد .برای تست کدها می تونید از لینک زیر استفاده کنید و کد ها رو به صورت آنلاین کامپایل کنید :

https://goo.gl/m3YZSP

Overriding

Overriding  ما میتونیم اون چیزی که فرزند از پدر به ارث برده رو بر اساس اون چیزی که دلخواه ماست تغییر بدیم. یا اینکه اگه بخواهیم یک سری خصوصیات رو فرزند از پدر به ارث نبره اون خصوصیات رو باید Overriding  (رونویسی) کرد.

یکسری قوانینی داره این overriding  که باید بهشون توجه کنید. که حالا در ادامه  به اون ها اشاره میکنم.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

 

نقل قول

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

 

Overriding

Overriding  ما میتونیم اون چیزی که فرزند از پدر به ارث برده رو بر اساس اون چیزی که دلخواه ماست تغییر بدیم. یا اینکه اگه بخواهیم یک سری خصوصیات رو فرزند از پدر به ارث نبره اون خصوصیات رو باید Overriding  (رونویسی) کرد.

یکسری قوانینی داره این overriding  که باید بهشون توجه کنید. که حالا در طول آموزش به اون ها اشاره میکنم.

اول یک مثال راجب overriding   بزنیم.

من یک سوپرکلاس superclass  میسازم(منظورم همون کلاس پدر ) به اسم Phone که داخلش یک متدی گذاشتم به اسم OverPhone که قراره یک دستوری رو چاپ کنه.

 

public class Phone {

   public void OverPhone(){

        System.out.println("Class phone");
    }
}

 

حالا یک ساب کلاس  subclass میسازم ( منظورم همون کلاس فرزند) به اسم سامسونگ که داخلش همون متد باباشو قرار رونویسی کنم . متد باباش OverPhone بود . با این تفاوت که باباش Class phone   رو چاپ میکرد حالا بچش حال کرده Class Sumsung رو چاپ کنه.

 

public class Sumsung extends Phone{

    public void OverPhone(){

        System.out.println("Class Sumsung");
    }


}

 

 

 

حالا به همین کار کپی & پیست ما با کمی تغییر میگن Overriding. خوب البته جا داره همینجا از پشت همین تریبون بگم شروط  Overriding اینه که نام متدها ، ورودی و خروجی متدها باید یکسان باشد و اینکه باید این رونویسی یا Overriding در دو کلاس متفاوت باشد.

حالا یک کلاس دیگه ایی برای اجرا میسازم به اسم Pr . که داخلش از پدر و پسر نمونه میسازم و از متدشون استفاده میکنم

 

public class Pr {
    public static void main(String[] args) {
        Sumsung sumsung=new Sumsung();
        Phone phone=new Phone();

        phone.OverPhone();
        sumsung.OverPhone();
    }
}

 

که خروجی همه اینایی که گفتیم میشه :

 

Class Phone
Class Sumsung

به این نکات توجه کنید : ( قوانین Overriding )

1.    1 -  متدهای سازنده (Constructor) قابل Overriding شدن نیستن . اگه یادتون باشه متد Constructor رو گفتیم متدی هستش که همنام کلاس سازنده است و هیچ داده ایی رو برنمی گردونه یا return  نمی کنه.

2.    2-  Modifier   ها باید یکسان باشند . Modifier   چیه باز ؟ الان با مثال زیر توضیح میدم

سوپر کلاس زیر رو در نظر بگیرید :

public class Phone {

   public void OverPhone(){

        System.out.println("Class phone");
    }
}

حالا ساب کلاس زیر رو در نظر بگیرید

public class Sumsung extends Phone{

    void OverPhone(){

        System.out.println("Class Sumsung");
    }


}

خوب حالا در سوپر کلاس می بینید متد  <- OverPhone modifier  اش را public قرار دادیم اما در ساب کلاس فقط void استفاده کردیم . خوب این کار Overriding رو نقض میکنه. همونطور که گفتم باید modifier   یکسان باشه . اگه از public استفاده کردم در ساب کلاس هم از public  استفاده کنم

.   3-     تمام آرگومان های ورودی و خروجی متدها باید در کلاس والد و فرزند یکسان باشد .

2. 4-      از قوانین  Overriding استفاده از کلمه کلیدی super  هم هستش. یعنی اینکه هر وقت خواستید از فرزند دست به ارثیه پدر ببرید لازمه از این کلمه کلیدی استفاده کنید.

جهت مطالعه بیشتر :

https://www.tutorialspoint.com/java/java_overriding.htm
http://www.javatpoint.com/method-overriding-in-java

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

andriod-1.pdf

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

متد Overloading

متد Overloading برای خواناتر شدن کدها و فهم راحت تر کدها استفاده میشود.   overloading برای ایجاد دو یا چند متد هم نام اما با پارامترهای متفاوت،معرفی شده اند.

لیست آرگومان هایی که می تواند متفاوت باشه در :

1-     تعداد پارامتر ها

2-     پارامترهای Data type

3-     ترتیب Data type های پارامترها

خوب بریم مثال بزنیم تا این موضوع رو بهتر درک کنیم :

 (1- تعداد پارامتر ها)

class DisplayOverloading{

    public void disp(char c) {
         System.out.println(c);
    }

    public void disp(char c, int num)     {
         System.out.println(c + " "+num);
    }
}

class Sample{
   public static void main(String args[])   {
       DisplayOverloading obj = new DisplayOverloading();
       obj.disp('a');
       obj.disp('a',10);
   }
}

در مثال بالا (برگرفته از سایت بگینربوک ) می بینید که از یک متد دوبار استفاده شده که در متد اولی از یک پارامتر char c و در متد دومی از دو پارامتر char c, int num استفاده شده . که با اجرای کد بالا خروجی بصورت زیر میشه :

a

a 10

 

 

(2- پارامترهای Data type)

class DisplayOverloading2{
    public void disp(char c)    {
        System.out.println(c);
    }

    public void disp(int c)    {
       System.out.println(c );
    }
}

class Sample2{
    public static void main(String args[])    {
        DisplayOverloading2 obj = new DisplayOverloading2();
        obj.disp('a');
        obj.disp(5);
    }
}

در مثال بالا متد اول disp پارامتر c از (Data type) جنس " char " میباشد و در ادامه همان متد پارامتر  c  جنسش int شده است   .

خروجی این کد :

a

5

 

(3-ترتیب در Data type )

class DisplayOverloading3{
   public void disp(char c, int num)   {
       System.out.println("I’m the first definition of method disp");
   }
   public void disp(int num, char c)   {
       System.out.println("I’m the second definition of method disp" );
   }
}

class Sample3{
   public static void main(String args[])   {
       DisplayOverloading3 obj = new DisplayOverloading3();
       obj.disp('x', 51 );
       obj.disp(52, 'y');
   }
}

 

در متد اول پارامتر c از جنس char و پارامتر num از جنس int بوده است که در متد دوم فقط جای جنس پارامترها یا همان Data type پارامترها عوض شده است .

که خروجی این کد :

Im the first definition of method disp

Im the second definition of method disp

 

خوب بریم سراغ چند متد دیگه و بررسی کنیم متدهایی که اورلودینگ در آنها آیا رعایت شده اند یا خیر و بعبارتی معتبر هستند یا غیرمعتبر.

 

 

مثال اول :

int mymethod(int a, int b, float c)

int mymethod(int var1, int var2, float var3)

 

این مثال نا معتبر است و کامپایل آن با خطا روبرو خواهد بود . به این خاطر که دیتا تایپ و ترتیب دیتاتایپ در هردو متد دقیقا همان هستند و  و تعداد پارامترها در هر دو متد به یک اندازه هستند .

 

 

مثال دو :

int mymethod(int a, int b)

int mymethod(float var1, float var2)

 

این مثال معتبر است به این خاطر که دیتا تایپ در هر متد متفاوت است . در اولی int و دومی float

مثال سه :

int mymethod(int a, int b)

int mymethod(int num)

 

این مثال معتبر است به این خاطر که از لحاظ تعداد پارامترها در متدها متفاوت است.

مثال چهار :

float mymethod(int a, float b)

float mymethod(float var1, int var2)

 

این مثال معتبر است به خاطر اینکه ترتیب در دیتاتایپ ها رعایت شده است . در اولی )int, float( و دومی )float, int(.

 

 

دوستانی که علاقه مند هستند بیشتر در این خصوص مطالعه کنند :

http://www.javatpoint.com/method-overloading-in-java

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

 

کپسوله سازی ( Encapsulation )

یک کپسول آموکسی سیلین رو در نظربگیرید ، دارای یک روکشی هست که باعث میشه اون پودر های داخلش از محیط بیرون ایزوله باشند و از طرفی هم خدا بیامرز باعث میشه تا تلخی اون پودر ها رو نفهمیم.اصلا فلسفه کپسول اینه که یک سری دیتا ها رو از دید بقیه مخفی کنه به همین دلیل data hiding  هم بهش میگن . از اونجایی که این کپسول میاد یک فضای خصوصی برای خودش تعریف میکنه توی برنامه نویسی ما هم متغیر های کلاس یا همون variable  هامون رو خصوصی Private  تعریف میکنیم.این کپسول آموکسی سیلین رو دیدید از دوتا روکش استفاده کرده که داخل هم میره و این پودر ها داخلشون قرار میگیره . حالا برای اینکه به اون پودرها دسترسی داشته باشیم فقط لازمه که این دوتا پوشش رو از دوطرف بکشیم و بهشون دسترسی داشته باشیم. ما توی برنامه نویسی برای اینکه دسترسی داشته باشیم به variable  های کپسولمون باید از getter  و setter  استفاده می کنیم . خوب این getter  و  setter  بدرد این میخورن که ما بعضی از کلاس هامون رو فقط خواندنی و یا فقط نوشتنی بکنیم. که این بعدا در اندروید نویسی خیلی بدردمون میخوره .

خوب بریم یک مثال بزنیم: توی این مثال میخوام در تابع اصلی که اسمش HelloWorld هستش بیام نمونه بسازم از کلاس هایی که کپسوله سازی شدن و باset  و get   هم برای دسترسی به این کلاس ها کار کنم.

ابتدا کلاسی با نام AndroidTutorial  درست میکنم و متغیر android  رو از جنسString با مدیفایر private  درست میکنم.  و در نهایت setter & getter  رو براش تعریف میکنم.

public class AndroidTutorial{
    private String android;
    public void setAndroid(String android){    
       this.android=android;
    } 
    public String getAndroid(){
     return android;   
      }
}

خوب کلاس دیگه ایی هم با نام BasicForX  با روال قبل میسازم.

public class BasicForX{
private String basic;
public String getBasic(){
    return basic;
}
 public void setBasic(String basic){
     this.basic=basic;
 }    
}

حالا کلاس جدید به نام HelloWorld درست می کنم که main  اصلی برنامه هستش . در این کلاس دو نمونه از دو کلاس بالا میسازیم و توسط دستور set  دیتایی روی آن ها ذخیره میکنیم و توسط get  این دیتا ها را فراخوانی میکنیم.

public class HelloWorld{
     public static void main(String []args){
        BasicForX basic=new BasicForX();
        AndroidTutorial android=new AndroidTutorial();
        basic.setBasic("basic4x.ir");
        android.setAndroid ("androidtutorial.ir");
        System.out.println("visit "+basic.getBasic()+ " " + android.getAndroid());
     }
}

این کپسوله سازی یا Encapsulation  میتونه خیلی بهمون کمک کنه همونطور که قبلا اشاره شد می تونیم بگیم که کلاس ما Read Only  باشه یا اینکه Write Only  . میتونیم بگیم چه دیتایی روی متغیرش ذخیره بشه . توی مثال بالا ما در دو کلاس اول گفتیم متغیری از جنس String  باشه و این می تونست از هر جنس دیگه ایی مثل int یا ... باشه.

مثالی که در این بخش گفته شد می تونید از لینک زیر اجرا کنید و خودتون تغییراتی رو اعمال کنید :

https://goo.gl/jBW4d9

واسه مطالعه بیشتر هم میتونید سری به سایت های زیر بزنید:

http://beginnersbook.com/2013/05/encapsulation-in-java/

https://www.tutorialspoint.com/java/java_encapsulation.htm

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

متد و کلاس Abstract

Abstract   یعنی خلاصه یا چکیده. فارغ از جزئیات. اقا من به شما میگم برام یک برنامه اندروید بنویس که یک متنی رو چاپ کنه . اصلا برام مهم نیست که شما چطور میخوای اینکارو رو با چندتا متد و تابع انجام بدی. من میخوام در نهایت اون متن رو ببینم.

وقتی مامانت میگه ظرفا رو بشور براش مهم نیست که چطور میخوای بشوری بریزی توی ماشین ظرف شویی ، با فرچه بشوری یا با اسکاچ .... بلاخره باید انجامش بدی چون انجامش ندی خودت و ظرفا رو باهم میشوره .

توی Abstract هم نیازی به جزئیات نداره . فقط میشینه یک گوشه میگه اینکارو بکن و اون کارو بکن . Abstract کلاس رو با کلمه کلیدی Abstract میشه شناخت . یک کلاس abstract میتونه متد abstract رو داشته باشه میتونه نداشته باشه و داخلش از متد concrete (غیر abstract) استفاده شده باشه . اما به این نکته توجه کنید که شما از متد abstract تنها در کلاس Abstract میتونید استفاده کنید و غیر از این معنایی نداره . کلاس abstract غیرقابل استفاده است تا زمانی که آن ها را در کلاس های دیگری extend  کرده باشیم

بریم یک مثال بزنیم :

// Declaration using abstract keyword
abstract class AbstractDemo{
   // Concrete method: body and braces
   public void myMethod(){
      //Statements here
   }
   // Abstract method: without body and braces 
   abstract public void anotherMethod();
}

توی مثال بالا متد abstract  رو ببینید که بدون بدنه و براکت هستش و متد Concrete دارای بدنه و براکته.

چرا ما به کلاس Abstract  نیاز داریم ؟

 

تابحال شده یک ایده  برنامه نویسی به ذهنتون برسه و بدونید باید چیکار کنید و روال رو میدونید اما نمی دونید چطور اینکار رو بکنید ... اینجاس که میایم از کلاس Abstract استفاده میکنیم.یک مثال دیگه باهم ببینیم :

abstract public class AbstractDemo{
   public void myMethod(){
      System.out.println("Hello");
   }
   abstract public void anotherMethod();
}
public class ConcreteDemo{

   public void anotherMethod() { 
        System.out.print("Abstract method"); 
   }
   public static void main(String args[])
   { 
      //Can't create object of abstract class - error!
      AbstractDemo obj = new AbstractDemo();
      obj.display();
   }
}

بنظرتون خروجی چی میتونه باشه ؟!!

یک مرور کنیم کد های بالا رو : اول اومدیم یک کلاس AbstractDemo  ساختیم که داخلش از دو متد abstract  و concrete استفاده کردیم . و در ادامه یک کلاس ConcreteDemo  ساختیم و داخلش فقط متد Concrete ساختیم . و در کلاس اصلی main اومدیم یک نمونه جدید از کلاس AbstractDemo  ساختیم  . سوال پیش میاد؟؟ خوب الان از چه متدی نمونه ساخته میشه ؟!!! اینجاست که برنامه به ما اخطار میده و میگه : آهای خوشگله ، تو نمی تونی از چیزی که کلیات رو تعریف کرده نمونه بسازی . منظورش اینه که از کلاس های abstract  فقط میتونی extend  کنی نه اینکه نمونه بسازی.

حالا اگه نمونه لازم داشتیم چه کنیم ؟

خیلی سادس از قانون ارث بری استفاده میکنیم . میایم یک بچه میسازیم ( subclass ) و extend اش میکنیم از باباش .

به مثال زیر توجه کنید :

abstract class Demo1{
   public void disp1(){
     System.out.println("Concrete method of abstract class");
   }
   abstract public void disp2();
}

class Demo2 extends Demo1{
   /* I have given the body to abstract method of Demo1 class
   It is must if you don't declare abstract method of super class
   compiler would throw an error*/  
   public void disp2()
   {
       System.out.println("I'm overriding abstract method");
   }
   public static void main(String args[]){
       Demo2 obj = new Demo2();
       obj.disp2();
   }
}

توی مثال بالا اول یک کلاس abstract  ساختیم با اسم Demo1  که داخلش دوتا متد وجود داره که اولین متد Concrete  ( همه چیزش واضحه ) و دومین متد abstract  . در ادامه اومدیم یک subclass  ساختیم یعنی Demo2  و ارث بری کردیم از superclass  یعنی Demo1 و حالا در اینجا اومدیم متد   abstract (یا همون متد disp2 )  رو بکار کشیدیم یا بازنویسی یا Overriding کردیم که برامون یک متنی رو چاپ کنه.

حالا در کلاس اصلی  main  ، یک نمونه از Demo2  ساختیم . چون در Demo2 همه چیز مشخصه پس خطایی از ما نخواهد گرفت و درنهایت هم گفتیم که نمونه ایی رو که ساختیم نمایش بده.

مثال های بیشتر رو میتونید در لینک زیر مشاهده کنید :

http://beginnersbook.com/2014/01/abstract-method-with-examples-in-java

 

دوتا قانون رو الان بگم نگید نگفتی :

1-     هر وقت شما داخل یک کلاسی متد Abstract  و concrete داشتی از کلاس abstract  استفاده میکنید

2-     هر وقت شما کلاس abstract داشتی که فقط متد abstract  داشت اونوقت باید از کلاس interface  استفاده کنی

 

 

کلاس Interface

این کلاس فقط دارای abstract متد هستش. دیگه این کلاس رو نمیشه extend  کردش و در اینجاس که با بزرگواری همچون implement آشنا میشیم . implement  یعنی اینکه  پیاده سازی کن. پس اگه بخواییم از کلاس Interface  یک نمونه بسازیم باید یک کلاس دیگه ایی ایجاد کنیم و حرکت implements  رو روش بزنیم.فقط در یک حالت میشه کلاس Interface رو extend  کرد اونم در حالیه که کلاسی که قرار اکستند کنه خودش هم Interface  باشه.

 

قبلا راجب متد سازنده یعنی Constructor صحبت کردیم . توی مصاحبه های استخدامی بعضا سوال میشه که آیا کلاس Interface میتونه دارای متد Constructor   باشه . جواب نه هستش. بخاطر اینکه کلاس Interface دارای متدهای abstract هستش و باید implement بشه و اینکه تمام متدهای interface بدنه ( body ) ندارند.بنابراین بدون نیاز به فراخوانی متد در رابط خودش وجود دارد. برای فراخوانی هر متد ما احتیاج داریم به یک شی (Object) که متد Interface نیازی به داشتن شی ندارد . در حالی که متد Constructor فراخوانی میشه در طول ساخت یک شی .

یک مثال رو ببینیم :

public interface SumInterface{
    public int mymethod(int num1, int num2);
}
public class SumClass implements SumInterface{
    public int mymethod(int num1, int num2){
           int op= num1+num2;
           return op;
    }
    public static void main(Sring args[])
    {
           SumClass obj= new SumClass();
           System.out.println(obj.mymethod(2, 3));
}

 

برای مطالعه بیشتر هم میتونید به لینک زیر مراجعه کنید :

https://www.tutorialspoint.com/java/java_interfaces.htm

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

IS-A در جاوا

Is-a  رابطه بین جنس پارامترهای یک کلاس یا اینترفیس با جنس دیگر پارامتر ها که از کلوز های extend  و implement گرفته میشوند.پس از این به بعد اگه گفتیم is-a  منظورمون رابطه بین جنس پارامترهای یک کلاس یا اینترفیس با جنس دیگر پارامتر هاست.

مثال معروف :

 

ArrayList<E> implements List<E>, and List<E> extends Collection<E>. So ArrayList<String> is a subtype of List<String>

 

List<E>   پیاده سازی شده درList <E>Arrayو باز List<E>  اومده از Collection<E>   اکستند شده.بنابراین Arrylist<string> هستش یک سابتایپ از ( فرزند جنس پارامتره) List<String>  .

اگه بخوام یک نمونه مثال عامیانه بزنم. اینه که فرض کنید شما یک قلمه گل محمدی توی حیاطتتون میکارید و آب و کودش میدید و بلاخره گل میده . حالا فرض کنید که زنبور میاد شهد گل محمدی رو میگیره میبره میریزه تو کندو در نهایت عسلی که شما از این زنبور میگیرید عسل گل محمدی هستش.اگه شما گل بابونه بکاری پس جنس عسل شما هم میشه بابونه مسلما. پس جنس عسل ما ربط داره که زنبور از چه گلی بگیره و اینکه چه گلی ما بکاریم.

Polymorphism پلی مورفیسم چندریختی

همینطور که از اسمش پیداست چند تا ریخت داره . تا بحال شده مامانت عصبانی باشه بهت بگه نمیخوام ریختتو ببینم . بعد بگی کدوم ریختمو ؟ بعد بگه ریخت خودتو باباتو عمتو K . این یعنی اینکه تو چندتا ریخت داری که از بابا به ارث بردی . چیزی که مسلمه بابات از تو چیزی به ارث نبرده.

پلی مورفیسم یعنی توانایی یک Object که می تونه اشکال و فرم های مختلفی بخودش بگیره. رایج ترین حالتی که از پلی مورفیسم در برنامه های شی گرایی استفاده میکنند زمانی اتفاق میفته که یک شئ از کلاس پدر ایجاد کنیم ولی آن را با کلاس های فرزندان مقداردهی نماییم. یادتونه وقتی میخواستیم یک نمونه بسازیم میومدیم میگفتیم :

Phone obj=new phone();

 که

Phone اولی واسه اینه که بگی از چه متغیری میخوایم

obj خوب اسمشه میتونه هرچی باشه و new هم بخاطره اینه که ما یک نمونه جدید میخوایم دیگه ..

Phone دومی اسم اون کلاسی که داریم ازش نمونه میگیریم.  حالا اگه بجای این Phone  بیایم (یک کلاس فرزند تعریف کنیم و از پدر ارث بری کنیم و)  اسم کلاس فرزند رو بنویسیم ما در واقع Polymorphism  رو بکار بردیم .

به این صورت :

Phone obj=new Samsung();

نتیجه اینکه Reference variable ( متغیر مرجع)  ما  Phone  هستش که شی جدیدی که ساخته شده توسط کلاس Samsung  مقدار دهی میشه .اینم بدونید بد نیست هر شئ جاوا که از کلاسی ساخته شده باشد به گونه ای که آن کلاس حد اقل دو کلاس فرزند داشته باشد که با کلاس پدر رابطه IS-A داشته باشد قابلیت چندریختی را می تواند داشته باشد .

یک مثال عامیانه بزنم : فرض کنید پدر من یک چغندر فروشی داره . و یک شعبه دیگه ایی در نقطه ایی دیگه از شهر زده با این تفاوت که قند دار و اون شعبه رو سپرده به من که بچرخونمش و  من شعبه دیگری در منطقه دیگه ایی زدم اما توی این شعبه شکر دارم که سپردم دست داداشم علی و داداشم شعبه دیگری زده  که  شیرینی فروشیه  که باز اون سپرده دست داداش حسن و ... آموزش تصویری این مثال رو توی آپارات آپلود کردم میتونید ببینید .

http://www.aparat.com/v/JcAl4

به مثال زیر هم توجه کنید .

 

class P{
 public void m1() {}
 }
 
class C extends P{
 public void m2() {}
 }
 
class Test{

 public static void main (String [] args)
 {
 
//case 1
P  p = new P();
p.m1();   // کامپایل میشه
p.m2();  // کامپایلر نمی تونه این آبجکت رو پیدا کنه

//case 2
C c = new C();
c.m1();   // کامپایل میشه
c.m2();  // کامپایل میشه
//case 3
P  p = new C();
p.m1();   // کامپایل میشه
p.m2();  // کامپایلر نمی تونه این آبجکت رو پیدا کنه
 
//case 4
C c = new P(); // کامپایلر میگه چنین تایپی ( جنسی ) ناسازگاره
}
 }

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

  • مطالب مشابه

    • توسط H@mid.RS
      با سلامو درود دوستان
      سورس کد همراه با فایل های php سمت سرور برای اندروید استودیو می باشد.
      الیته در صورت نیاز به بیسیک فور اندروید اگه وقت داشتم تبدیل می کنم
      قابلیت ها :
      هشتگ
      لایک
      نظرات
      ارسال دوباره تابع
      ویرایش/حذف پست
      پشتیبانی از Emoji در نظرات، پیام های خصوصی و پست ها
      جستجو کاربران
      دنبال کنندگان/دنبال کردن
      اشتراک گذاری محل سکونت در پست
      نمایش پست برای همه و یا تنها برای دنبال کنندگان
      فهرست مسدود شده ها
      اطلاعیه شخصی خود
      پیام های مستقیم با تصاویر / عکس
      ارسال تیکت حمایت از برنامه
      گزارش تخلف به پست کاربران
      ورود با فیسبوک/ ثبت نام/اتصال/قطع
      تصاویر و عکس ها در پست
      عکس نمایه
      پروفایل تایید شده
      ارسال اطلاعیه در مورد نظرات جدید، دنبال کنندگان، پیام ها
      تبلیغات
      و موارد بیشتر …
      ویژگی های وب سایت:
      همان قابلیت های نرم افزار
      وب سایت چند زبانه
      اضافه کردن آسان زبان های جدید
      هشتگ جستجو
      جستجو دوستان از فیسبوک
      ویژگی های پنل مدیریت:
      آمار
      بخش پست ها (مشاهده و حذف)
      بخش پیغام ها (مشاهده و حذف)
      نمایش گزارش تخلف برای ارسال کاربران
      بخش پشتیبانی
      مشخصات کاربران بلاک شده
      مشاهده مکالمات شخصی کاربر
      on/off کردن تبلیغات برای همه کاربران یا برای فرد مشخصی
      مشاهده پیام های اخیر ارسال شده (GCM)
      ارسال طلاعیه (GCM) برای تمام کاربران یا فرد مشخصی (همون پوش که توسط سایت خودتون ارسال میشه)
       
      لینک خرید و دانلود :
       
      androidtutorial.ir
       
      سوالی بود در خدمتم
    • توسط H@mid.RS
      درود دوستان
      همون طور که در بخش اندروید استودیو گفته بودم ، اندروید استودیو یک محیط برنامه نویسی برای پلتفرم اندروید است. این برنامه در 16 می 2014 توسط مدیران گوگل در کنفرانس گوگل آی/او معرفی شد. از ماه جوئن 2014 نسخه پیش نمایش این برنامه (به صورت رایگان) برای امتحان در دسترس توسعه دهنده‌ها قرار گرفت. این محیط بر اساس نرم‌افزار محبوب جت برینز طراحی شده است، این استودیو بطور اختصاصی برای اندروید طراحی شده. هم اکنون این استودیو برای دانلود بر روی ویندوز، مک و لینوکس در دسترس می‌باشد.
      چندین ویژگی جدید در این نرم‌افزار برای کاربران می‌باشد:
      چیدمان زنده: ویرایشگر WYSIWYG – کدنویسی زنده – رندر هم زمان برنامه کنسول توسعه دهنده: راهنمای بهینه سازی – کمک برای ترجمه – ردیابی ارجاع – طریقه استفاده پشتیبانی از ساخت مبتنی بر Gradle رفع و عیب یابی مخصوص اندروید ابزار لینت برای گرفتن عملکرد، قابلیت استفاده، نسخه سازگار با مشکلات دیگر قابلیت Proguard و امضای برنامه مبتنی بر الگوی wizard برای ایجاد طرح اندروید و اجزای مشترک ویرایشگر طرح بندی غنی که به شما اجازه کشیدن و رها کردن UI کامنت‌ها را می‌دهند. گزینه‌ای برای تنظیمات پیش نمایش طرح بندی در صفحه نمایش چندگانه  
      دانلود نسخه Windows با لينك مستقيم
      دانلود نسخه Windows ( لینک کمکی )

      دانلود نسخه Linux
      دانلود نسخه Mac OS X
       
      به زودی اموزش نصب اندروید استودیو رو براتون قرار میدم
×