محلی برای یادگیری جاوا

Constructor یا سازنده

همه برنامه نویسان با مفهوم Constructor یا سازنده آشنا هستند. Constructor ها متدهایی بدون خروجی و هم نام با کلاس هستند که زمان ساخت شی ی از کلاس invoke می شوند:

public class Person {
String name;
int age;

public Person() {
...
}
public Person(String name, int age) {
...
}
}

اگر برنامه نویس Constructor ی برای کلاس ننویسد کامپایلر جاوا (javac) یک Constructor پیش فرض برای آن ها تولید می کند. 

برای یک کلاس همانطور که در بالا دیده می شود می توان چندین Constructor نوشت. به این عمل Constructor overloading گفته می شود. که مشابه همان مفهوم Overloading در جاواست.

نکته1: در یک کلاس می توان چندین متد همنام داشت که پارامتر های ورودی آنها متفاوت است به این عمل Overloading گفته می شود.

نکته2: به constructor بدون ورودی اصطلاحا default constructor گفته می شود.

۰۵ مهر ۹۴ ، ۱۶:۳۳ ۰ نظر موافقین ۱ مخالفین ۰
پریسا

Static

در این پست توضیحاتی در مورد Static داده می شود که بیانگر تاثیر این modifier روی متدها و متغییر هاست:

Static method:

فرض می کنیم یک کلاس به نام Person داریم و Person های ما شامل مرد و زن می شوند:

class Person{

String gender;

public Person(String gender){
this.gender=gender;
}
public chooseSet(){
....;
}

public static sleep() {
....;
}
}

 حال فرض کنیم یک متد به نام ()chooseSet در این کلاس داریم. کار این متد انتخاب یک لباس مناسب برای Person است. عمل انتخاب لباس عملی ست که به جنسیت Person ربط دارد پس این متد را روی شی ی که برنامه نویس ساخته (developer object)و جنسیت آن مشخص است صدا میزنیم. به این شکل:

public static void main(){
Person man=new Person("male");
man.chooseSet();
}

حال فرض کنیم یک متد به نام sleep نیز داریم. کار متد sleep دادن اطلاعاتی درمورد خواب انسان است و این موضوع به اشیا ساخته شده توسط برنامه نویس ربطی ندارد. در همین مثال بین خوابیدن زن و مرد تفاوتی وجود ندارد پس بدون ساخت شی توسط برنامه نویس و صرفا با داشتن کلاس Person می توان متد Sleep را صدا زد. در این وضعیت از static استقاده می کنیم. 

public static void main(){
Person.sleep();
}

همانطور که مشاهده می کنید دیگر نیازی به ساخت شی از Person نبود. 

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

Static variable:

مفهوم static برای variable ها هم بسیار مشابه method هاست. فرض کنیم میخوایم تعداد افراد را بشماریم. و در کلاس Person یک متغییر تعریف می کنیم به نام numberOfPerson که بعد از ساخت هر شی از این کلاس یک عدد آن را اضافه می کنیم:

class Person{
int numberOfPerson ;

public Person(String gender){
this.gender=gender;
}
...

}

 در این وضعیت با هر بار ساخت یک شی از Person این متغییر مقدار 0 را به خود می گیرد. و هر مقداری که در آن بریزیم برای instance بعدی هیچ فرقی ندارد، چون همانطور که برای متدها گفته شد در متغیرها هم یک متغیر غیر استاتیک متعلق به نمونه ساخته شده از کلاس است اما یک متغیر استاتیک متعلق یه کلاس است:

    public static void main(){

Person man=new Person("male");
man.numberOfPerson ++; مقدار 1

Person woman=new Person("female");
woman.numberOfPerson ++; مقدار 1

Person boy=new Person("male");
boy.numberOfPerson ++; مقدار 1

Person girl=new Person("female");
girl.numberOfPerson ++; مقدار 1

}

همانطور که در کد بالا دیده می شود هر numberOfPerson مربوط به یک نمونه خاص است در نتیجه با ساخت یک شی جدید نمیتوان انتظار داشت که متغیر numberOfPerson مقدارش در نمونه قبلی را در خود داشته باشد. راه حل این موضوع این است که کاری کنیم که متغیر numberOfPerson به جای اینکه در هر شی مخصوص آن شی باشد بین تمام اشیا بصورت مشترک باشد و در واقع به کلاس متعلق باشد نه به نمونه های کلاس. اینکار با static کردن این متغیر امکان پذیر است. پس تغییرات به شکل زیر خواهد بود:

class Person{
static int numberOfPerson ;

public Person(String gender){
this.gender=gender;
}

...
}
public static void main(){

Person man=new Person("male");
man.numberOfPerson ++; مقدار 1

Person woman=new Person("female");
woman.numberOfPerson ++; مقدار 2

Person boy=new Person("male");
boy.numberOfPerson ++; مقدار 3

Person girl=new Person("female");

girl.numberOfPerson ++; مقدار 4
int i=Person.numberOfPerson; مقدار 4
}

همانطور که مشاهده می کنید چهار شی داریم و مقدار numberOfPerson نیز 4 است. همانطور که در کد بالا دیده می شود زمانی که numberOfPerson استاتیک است با نام کلاس نیز می توانیم به آن دسترسی پیدا کنیم یعنی Person.numberOfPerson. برای فهم بهتر تفاوت به مثال زیر توجه کنید:

با فرض nonstatic بودن numberOfPerson:

public static void main(){
Person man=new Person("male");
man.numberOfPerson =4;

Person woman=new Person("female");
woman.numberOfPerson=40;

Person boy=new Person("male");

boy.numberOfPerson=14;
Print(man.numberOfPerson); نتیجه 4
Print(woman.numberOfPerson); نتیجه 40
Print(boy.numberOfPerson); نتیجه 14
}

با فرض static بودن numberOfPerson:

public static void main(){

Person man=new Person("male");

man.numberOfPerson =4;

Print(man.numberOfPerson); نتیجه 4
Print(Person.numberOfPerson); نتیجه 4


Person woman=new Person("female");
woman.numberOfPerson=40;

Print(man.numberOfPerson); نتیجه 40
Print(woman.numberOfPerson); نتیجه 40
Print(Person.numberOfPerson); نتیجه 40


Person boy=new Person("male");
boy.numberOfPerson=14;

Print(man.numberOfPerson); 1نتیجه 4
Print(woman.numberOfPerson); 1نتیجه 4
Print(boy.numberOfPerson); نتیجه 14
Print(Person.numberOfPerson); نتیجه 14
}

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

۳۰ شهریور ۹۴ ، ۱۲:۰۸ ۲ نظر موافقین ۲ مخالفین ۰
پریسا

شی گرایی

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

برنامه های نوشته شده با این پارادایم، برنامه های ساختار یافته ای هستند که فواید زیر را دارند:
  • خوانایی بالا
  • تست و اصلاح ساده تر
  • سرعت تولید بیشتر
  • پیچیدگی کمتر
  • اعمال ساده تر تغییر
  • دارا بودن قابلیت استفاده مجدد
هر شی، مطابق دنیای واقعی دارای ویژگی (Property یا Attribute) و رفتار (Behavior) است. برای مثال اگر یک اتومبیل را به عنوان شی در نظر بگیریم شامل یکسری ویژگی مانند رنگ، تعداد در، سال ساخت و ... است همچنین یک اتومبیل یکسری رفتارها از خود نشان می دهد مانند: گاز دادن، ترمز کردن و ...
در برنامه نویسی برای داشتن یک شی نیازمند class هستیم و در کلاس مورد نظر معادل ویژگی variable، و معادل رفتار method را داریم.

مفاهیم مهم در شی گرایی:

وراثت(Inheritance):
همانطور که از نام آن مشخص است، به این معناست که یک شی می تواند ویژگی ها و رفتار شی دیگر را به ارث ببرد.

inheritance

به عنوان مثال در یک ماشین یک سری صفات و رفتار ها مشترک است مانند رنگ و رانندگی. می توانیم این صفات را به عنوان یک کلاس پدر تعریف کرده و انواع اتومبیل های دیگر از ان ارث ببرند.

مخفی سازی (Encapsulation)
به این معناست که یکسری از پیچیدگی ها و جزییات را از دید دیگران پنهان کرد.

مخفی سازی

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

چند ریختی (Polymorphism):
به طور ساده می توان چند ریختی را اینگونه تعبیر کرد: یک شی بتواند شکل های مختلفی به خود بگیرد. به طور دقیقتر اینکه یک متد رفتار های مختلفی از خود نشان دهد.

چند ریختی در شی گرایی

همانطور که در شکل پیداست متد speak می تواند به شکل های مختلف اجرا شود.

۲۳ شهریور ۹۴ ، ۱۷:۴۳ ۰ نظر موافقین ۱ مخالفین ۰
پریسا

Reflection

در پست های قبل به Reflection Oriented بودن جاوا اشاره شده بود.


Reflection: توانایی اصلاح ساختار و رفتار برنامه در زمان اجرا.(زمانی که برنامه در JVM در حال اجراست)

یکی از موارد استفاده از reflection، زمانیست که می خواهیم از یک object متد خاصی را  در صورت وجود صدا بزنیم اما تایپ این object را نمیدانیم. جاوای استاتیک چنین اجازه ای به ما نمی دهد اما با reflection این کار ممکن است.


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

۱۱ شهریور ۹۴ ، ۱۰:۴۰ ۰ نظر موافقین ۰ مخالفین ۰
پریسا

JDK , JVM , JRE

مفاهیم JDK, JRE, JVM برای افرادی که جاوا را به تازگی شروع کرده اند کمی گیج کننده است. به صورت سلسله مراتبی تعاریف به این شکل هستند:


JDK: سرآمد Java Development Kit است به معنی "بسته ی توسعه جاوا". در واقع یک بسته است شامل آن چه که برای برنامه نویسی و توسعه به زبان جاوا لازم است. مانند:

  • javac: کامپایلر جاوا که کدهای جاوا را به بایت کد ترجمه می کند.
  • JRE: در ادامه توضیح داده خواهد شد.
  • java: لودر برای برنامه های جاواست. در واقع یک مفسر است که با استفاده از javac می تواند فایلهای class. را تولید و اجرا کند.
  • JDB: خطایاب جاوا.
  • ...

JRE: سرآمد Java Runtime Enviroment است به معنی "محیط زمان اجرای جاواست". مجموعه ای ست که برای اجرای برنامه های جاوا به آن نیازمندیم. JDK ابزارهایی در خود داشت که برای کامپایل و به طور کلی برنامه نویسی جاوا بود. پس اگر روی سیستمی تنها قصد اجرای برنامه های جاوایی و نه توسعه ی آنها را داشتیم نصب JRE کافیست.

JVM: سرآمد Java Virtual Machine است به معنی "ماشین مجازی جاوا". یک مجموعه است که اجرای یک برنامه جاوایی را برای کامپیوتر ممکن می کند. در واقع JVM بایت کدها را تفسیر و اجرا می کند.
JVM مهمترین جز JRE است. ساختار JVM استکی است

برای اینکه بدانید نسبت این سه ابزار به چه شکل است به تصویر زیر دقت کنید:
JDK



۰۹ شهریور ۹۴ ، ۱۷:۱۷ ۰ نظر موافقین ۱ مخالفین ۰
پریسا

جاوا مستقل از سیستم عامل است

در مورد جاوا همیشه مواردی به گوش می رسد مانند اینکه:

  • شی گراست (object-oriented) 
  • مستقل از سیستم عامل است (platform independent)
  • توانایی reflection دارد (reflection-oriented)
  • ...
برنامه نویسان با تعریف شی گرایی آشنا هستند. در این پست به مفهوم platform independency می پردازیم.

جاوا مستقل از سیستم عامل است: زبان های برنامه نویسی به طور عمده به دو دسته تقسیم می شوند:
  • زبان های کامپایلری (compiled language) مانند ada, خانواده C , ...
  • زبان های مفسری (interpreted language) مانند php, ruby, ...
در زبان های کامپایلری نحوه کامپایل شدن برنامه به شکل زیر است:

Source code ---> Compiler --->Machine code ---> OS

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

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

Source code ---> Interpreter ---> OS

کد به مفسر داده می شود اما مفسر کدی تولید نمیکند (بر عکس کامپایلر) و کدها را خط به خط اجرا می کند.

اما برای جاوا موضوع متفاوت است:
Source code ---> javac compiler---> Byte code ---> JRE(JVM+ lib) ---> OS 

کدها توسط  javac compiler کامپایل شده و خروجی Byte code داده می شود. بایت کدها توسط مفسر جاوا، تفسیر و خط به خط اجرا می شوند. 
در سیستمی که JVM روی آن نصب شده است دیگر نگرانی برای اجرای برنامه وجود ندارد چون JVM وظیفه دارد که برنامه را با محیطی که قرار است روی آن اجرا شود تطبیق دهد.

jvm

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



۰۷ شهریور ۹۴ ، ۲۲:۳۷ ۰ نظر موافقین ۱ مخالفین ۰
پریسا

پست آغازین

من از تیر ماه سال 94، یادگیری پلتفرم جاوا رو شروع کردم. با توجه به اینکه در زمینه جاوا مطالب به زبان فارسی بسیار کمه تصمیم گرفتم تو این وبلاگ چیزایی رو که یاد میگیرم به اشتراک بذارم تا هم بقیه در صورت سودمند بودن استفاده کنن و هم برای خودم یه باز بینی باشه.
۰۷ شهریور ۹۴ ، ۱۱:۱۲ ۰ نظر موافقین ۰ مخالفین ۰
پریسا