counterexample



تو این پست، یه سری نکات مربوط به مفاهیم شی گرایی از منابع مختلف جمع آوری شدن:


وراثت:

وراثت در جاوا مکانیزمی است که توسط آن آبجکتی تمامی ویژگی (property) و قابلیت ها (behavior) آبجکت پدر را کسب کرده و در اصطلاح به ارث می برد.

برای ارث بری از کلمه کلیدی extends استفاده می‌شود و همانطور که می‌دانید حتی کلاس MainActivity پروژه اندروید نیز خود extends شده از کلاسی دیگر است. این کلاس را مشاهده کنید:


public class MainActivity extends AppCompatActivity {

}


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


انواع وراثت:

inheritence0

inheritence1


 مثالی از وراثت سطحی (Multilevel Inheritance):


class Animal{
void eat(){System.out.println("eating.");} } class Dog extends Animal{ void bark(){System.out.println("barking.");} } class BabyDog extends Dog{ void weep(){System.out.println("weeping.");} } class TestInheritance2{ public static void main(String args[]){ BabyDog d=new BabyDog(); d.weep(); d.bark(); d.eat(); } }

انواع دسترسی ها در زبان c++:
oop


abstract:

یک کلاس که با کلیدواژه ی abstract اعلان شده باشد، به عنوان کلاس abstract/انتزاعی شناخته می شود. کلاس abstract می تواند متدهای abstract یا بدون بدنه و متدهای با بدنه (nonabstract) داشته باشد.

متد abstract:
متدی که با کلیدواژه ی abstract نشانه گذاری شده و دارای بدنه یا پیاده سازی نباشد


abstract void printStatus();//no body and abstract


وقتی از abstract استفاده می‌کنیم که بدانیم چه کارهایی را باید انجام بدهیم ولی مراحل عمل را حین ایجاد کردن شی جدید تعریف کنیم.
مثال زیر را ببینید:

public abstract class AbstractCar {
public abstract void brake();
public abstract void stop();
public int max_speed(){
return 0;
}
}
در کلاس MainActivity به محض تایپ کردن AbstractCar car = new  و زدن کلیدهای ترکیبی Alt + Enter اولین گزینه همه کارها را به صورت خودکار برای شما انجام می‌دهد، و نتیجه را مانند زیر می‌بینید:

    AbstractCar car = new AbstractCar() {
            @Override
            public void brake() {
            }
            @Override
            public void stop() {
            }
    };

Overload: اگر آرگومانها متفاوت باشند.
Override: اگر تمام موارد(آرگومانها) یکسان باشد!

interface:
 این ساختار دارای ثوابت static و متدهای بدون بدنه (abstract) می باشد. در واقع کلاسی از نوع abstract است که هیچ تابع غیر abstract‌ای ندارد و در تعریف آن از کلمه کلیدی class استفاده نمی‌شود. مثال:

public interface InterfaceCar {
abstract void speed();
}

سه دلیل اصلی برای استفاده interface به شرح زیر می باشند:
- پیاده سازی مفهوم abstraction در نوشتن برنامه
- پیاده سازی قابلیت وراثت چندگانه یا multiple inheritance در جاوا
- پیاده سازی مفهوم loose coupling و کاستن وابستگی آبجکت ها به هم در اپلیکیشن

* چرا وراثت چندگانه از طریق interface قابل پیاده سازی بوده، اما از طریق کلاس قابل پیاده سازی نمی باشد؟
همان طور که قبلا در مبحث وراثت تشریح شد، در جاوا امکان پیاده سازی وراثت چندگانه از طریق کلاس به دلیل رخداد ابهام وجود ندارد. 
اما درمورد interface، از آنجایی که کلاس ارث برنده از interface مورد نظر پیاده سازی را ارائه می دهد، دیگر ابهامی در کد رخ نمی دهد. مثال:

interface Printable{ void print(); } interface Showable{ void print(); } class TestInterface3 implements Printable, Showable{ public void print(){System.out.println("Hello");} public static void main(String args[]){ TestInterface3 obj = new TestInterface3(); obj.print(); } }

خروجی:
Hello

همان طور که در مثال بالا می بینید، دو اینترفیس Printable و Showable تعدادی متد دارند که کلاس TestTnterface1 آن ها را پیاده سازی می کند. به همین جهت هیچ گونه ابهامی در کد رخ نمی دهد.


** کلاس abstract و interface هر دو غیر قابل نمونه سازی هستند و به عبارت ساده تر نمی توان مانند کلاس از روی آن ها آّبجکت ساخت.

رابطه ی بین interface و class:
interface,class

کلیدواژه ی Static:
کلیدواژه ی static در زبان Java غالبا برای مدیریت حافظه بکار می رود. می توان این کلیدواژه را به متغیر، متد، قطعه کد و کلاس های تودرتو (کلاس هایی که داخل کلاس دیگری تعریف شده اند) اعمال کرد. کلیدواژه ی نام برده به خود کلاس (برای مثال متغیر موجود در کلاس کلی) اعمال می شود نه نمونه یا نمونه هایی که از روی کلاس مورد نظر ساخته شده اند. 

- متغیرstatic:
 زمانی که شما متغیری را به صورت static تعریف کرده و آن را با کلیدواژه ی static علامت گذاری می کنید، در حقیقت آن متغیر را بین تمامی نمونه های کلاس مورد نظر مشترک و مستقل از آن ها اعلان می نمایید. برای دسترسی به این نوع متغیر نیازی به ساخت آبجکت از روی کلاس نیست. در اینصورت در استفاده از حافظه صرفه جویی می شود.

-  متد static:
یک متد static به کل کلاس میزبان تعلق دارد و مستقل از نمونه های ساخته شده از روی کلاس می باشد.
یک متد static می تواند بدون نیاز به ایجاد نمونه از روی کلاس فراخوانی شود.
یک متد static می تواند به عضوهای داده ای static دسترسی داشته و مقدار آن ها را دستکاری کند.

مثال کاربردی از متد static:

//Program of changing the common property of all objects(static field).
class Student9{ int rollno; String name; static String college = "ITS"; static void change(){ college = "BBDIT"; } Student9(int r, String n){ rollno = r; name = n; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(String args[]){ Student9.change(); Student9 s1 = new Student9 (111,"Karan"); Student9 s2 = new Student9 (222,"Aryan"); s1.display(); s2.display(); } }
خروجی:
111 Karan BBDIT
222 Aryan BBDIT

مثالی از c++:
static func

polymorphism :
در جاوا دو نوع polymorphism وجود دارد: 1. polymorphism در زمان کامپایل 2. polymorphism در زمان اجرا. در زبان جاوا با فراخوانی متدی یکسان با پارامترهای مختلف (overloading) و بازنویسی بدنه ی متد (overriding) در کلاس فرزند، می توان مفهوم polymorphism را به آسانی پیاده سازی کرد.

1. polymorphism در زمان کامپایل:
 اگر توسعه دهنده متدی static را با پارامترهای مختلف صدا بزند/overload کند، در واقع polymorphism زمان کامپایل را پیاده سازی کرده است.

2. polymorphism در زمان اجرا:
در مثال پیشرو دو کلاس به نام های Bike و Splendar ایجاد می کنیم. Splendar از کلاس Bike ارث بری کرده و متد run() آن را داخل خود بازنویسی (override) می کند. متغیر b از جنس کلاس پدر (Bike) نمونه ای از کلاس Splender را در خود نگه داشته( Upcasting : انتساب آبجکت فرزند به آبجکت پدر )
 و متد run() داخل کلاس فرزند (Splender) بازنویسی شده است، متد کلاس فرزند در زمان اجرای برنامه فراخوانی می شود.
class Bike{  
void run(){System.out.println("running");} } class Splender extends Bike{ void run(){System.out.println("running safely with 60km");} public static void main(String args[]){ Bike b = new Splender();//upcasting b.run(); } }
خروجی:
running safely with 60km.

به این خاطر که jvm (دستگاه مجاری جاوا که بستر اجرای برنامه را فراهم می کند) فراخوانی متدها را انجام می دهد، نه کامپایلر، به این نوع پیاده سازی runtime polymorphism گویند.

یک مثال دیگر:

class Animal{
void eat(){System.out.println("animal is eating.");} } class Dog extends Animal{ void eat(){System.out.println("dog is eating.");} }
class BabyDog1 extends Dog{ public static void main(String args[]){ Animal a=new BabyDog1(); a.eat(); }}
خروجی:

Dog is eating

* runtime polymorphism با اعضای داده ای کلاس یا همان فیلدها قابل پیاده سازی نمی باشد. مثال زیر را ببینید:

class Bike{
int speedlimit=90; } class Honda3 extends Bike{ int speedlimit=150; public static void main(String args[]){ Bike obj=new Honda3(); System.out.println(obj.speedlimit);//90 }

اتصال زودهنگام و زمان کامپایل کد/static binding
زمانی که نوع آبجکت در زمان کامپایل برنامه مشخص می شود، به آن static binding یا اتصال زودهنگام کد گویند.

در صورت وجود هر گونه متد با سطح دسترسی private، final و static در کلاس، static binding رخ می دهد.

مثال کاربردی از static binding:

class Dog{   private void eat(){System.out.println("dog is eating.");}   public static void main(String args[]){    Dog d1=new Dog();    d1.eat();   }  } 


اتصال دیرهنگام و زمان اجرای کد/Dynamic binding
زمانی که نوع آبجکت در زمان اجرای برنامه مشخص می شود (توسط کامپایلر)، به آن dynamic binding گویند.

مثال کاربردی از اتصال کد در زمان اجرا (Dynamic binding)

class Animal{ 
 void eat(){System.out.println("animal is eating.");}  } class Dog extends Animal{   void eat(){System.out.println("dog is eating.");}    public static void main(String args[]){    Animal a=new Dog();    a.eat();   }  } 

خروجی:
dog is eating.

در مثال بالا همان طور که می بینید، نوع آبجکت برای کامپایلر مشخص نیست چرا که متغیر a که آبجکتی از کلاس Dog را در خود نگه داشته، از جنس کلاس Animal می باشد. به عبارت دیگر نمونه ی کلاس Dog همچنین آبجکتی از جنس کلاس Animal می باشد و به همین دلیل، کامپایلر نمی تواند نوع دقیق آن را تشخیص دهد بلکه صرفا نوع پایه (base type) آن را در زمان کامپایل کد، می شناسد.


مثالی از زبان c++ برای حالت استاتیک:
static binding

و همین مثال از زبان c++ برای حالت داینامیک:
dynamic binding

کلیدواژه ی final در زبان جاوا:
- اگر همراه متغیر بکار رود، یعنی مقدار اولیه ی آن متغیر نهایی و ثابت بوده و دیگر تغییر نخواهد کرد، 
- اگر در خط تعریف متد قید شود، بدین معنی است که آن متد قابل بازنویسی (override) و ویرایش در کلاس فرزند نخواهد بود و رفتار متد برای همیشه ثابت می باشد. 
- چنانچه این کلیدواژه را در تعریف کلاس بکار ببرید، آن کلاس قابلیت وراثت را از دست داده و دیگر امکان ایجاد کلاس فرزند (subclass) از آن وجود نخواهد داشت.

* متغیری که با کلیدواژه ی final علامت گذاری شده ولی مقداری به آن اختصاص نیافته است، در اصطلاح متغیر تهی غیرقابل مقداردهی/blank final variable گویند. این متغیر تنها در بدنه ی تابع سازنده (constructor) قابل مقداردهی می باشد.

* یک متغیر که با دو کلیدواژه ی (با مقداری غیر قابل تغییر) final و (مشترک بین تمامی نمونه های ساخته شده از کلاس و متعلق به کلاس کلی) static نشانه گذاری شده و در زمان تعریف مقداری به آن اختصاص داده نشده باشد را در اصطلاح static blank final variable می گویند. این نوع متغیر تنها در قطعه کد static قابل مقداردهی می باشد

 کپسوله سازی/Encapsulation:
در جاوا می توان با تعریف تمامی اعضای آن کلاس به صورت private، یک کلاس کاملا کپسوله سازی شده ساخت.
اعضای یک کلاس کپسوله سازی شده با استفاده از متدهای (بازگرداننده ی مقدار) getter و (متد تنظیم کننده ی مقدار متغیر private) setter به راحتی قابل دسترسی هستند.
encapsulation

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

ادامه مطلب

- تهیه نسخه پشتیبان اطلاعات و بازیابی اون اطلاعات

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

ادامه مطلب

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

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

تبلیغات

آخرین ارسال ها

آخرین جستجو ها

مرجع فارسی بازی RUST ساخت کباب پز تابشی dojeldi سعید احمدی املاک منطقه ۲۲ املاک دریاچه چیتگر املاک چیتگر نوین موزیک | دانلود همه چی آهنگ آموزش زبان PTE soheil telegram اکباتان اسپرت