چندی پیش، طی اتفاقی، متوجه شدم از آنچه در ذهنم ادعا می کنم به صورت تخصصی در آن مشغول به فعالیت هستم (یعنی جاوا و طراحی نرم افزار)، واقعا چیزهای زیادی نمیدانم!

این باعث شد شروع به خواندن کتابها، و مشاهده برخی ویدئو های آموزشی کنم، در این بین کتاب های OCA و OCP و همینطور ویدئو های آقای علی اکبری از مجموعه جاواکاپ، بسیار مفید واقع شد، در این بین خبر برگزاری آزمون جاواکاپ را نیز دیدم و ثبت نام در آن، بهانه خوبی شد برای آنکه عمیق تر وارد مفاهیم جاوا شوم.

این مفاهیم را کم کم با شما نیز به اشتراک خواهم گذاشت.

اول بهتر است تعریفی از برنامه نویسی شیء گرا داشته باشیم، دو کارکشته در زمینه برنامه نویسی شیء گرا، یعنی Allen key و Bloch تعاریف زیر را از برنامه نویسی شیء گرا ارائه داده اند:

اَلن کِی؛ گفته:

1- هر چیز یک شیء است

2- یک برنامه مجموعه ای از اشیاء است که با ارسال پیام با هم ارتباط برقرار می کنند.

3- هر شیء حافضه مخصوص به خود را دارد (حالت شیء)

4- هر شیء دارای یک نوع است

5- همه اشیاء همنوع، رفتارهای مشابهی دارند.

آقای بلوچ هم گفته: یک شیء متشکل از وضعیت (state)، رفتار (behavior) و هویت (identity) است.

یعنی دو شیء حتی اگر وضعیت یکسانی هم داشته باشند، آدرسهای متفاوتی دارند و هویت متفاوتی دارند، بنابراین از هم جدا هستند.

 

حافظه Stack و Heap و تفاوتشان.

فراخوانی متد ها و همچنین متغیر های لوکال مربوط به آنها در پشته (Stack) قرار می گیرد.

اما خود اشیاء در حافظه ای به اسم Heap  قرار می گیرند.

این دو حافظه با دستوراتی قابل افزایش هستند، این دستورات عبارتند از:

-xms —> حداقل اندازه Heap

-xmx —> حداکثر اندازه Heap

-xss —> حداکثر اندازه Stack

فراخوانی یک سازنده از سازنده دیگر

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

public Class A{ 
public A(){ }
 public A(int a){
 this(); 
} 
public A(int a, int b){
 this(A); 
} 
}

 

ولی کد زیر درست نیست (اینکه چرا درست نیست را خودتان کشف کنید 🙂 )

public Class A{
public A(){
this(2);
}
public A(int a){
System.out.println("Hi");
this();
}
public A(int a, int b){
this(A);
}
}
روش های مقدار دهی اولیه به متغیر های استاتیک و غیر استاتیک

برای مقدار دهی اولیه سه روش کلی وجود دارد:

1- inline initialization

2- initialization block

3- constructor

1- مقداردهی برخط (inline initialization): هنگامی که متغیر ها را در همان زمانِ تعریف مقدار دهی می کنیم، میگوییم مقداردهیِ برخط شده است:

public Class Test{
int a =2;
static int t = 3;
public Test(){
}
}

2- بلاک مقداردهی (initialization Block): از تعریفِ آن مشخص است که داخل گیومه نوشته می شود، نکته مهم در این مقدار دهی این است که داخل بلاک می توانید عبارات منطقی نیز اضافه کنید. یعنی دستورات شرطی، یا حلقه های تکرار در بلاک ها مجاز هستند. برای مقدار دهی به متغیر های استاتیک از بلاک استاتیک ( که واژه static قبل از بلاک آورده می شود) و برای سایر متغیر ها از بلاک بدون عنوان استفاده می شود. قطعه کد زیر همه چیز را روشن می کند:

public Class Test{
int a;
int c = 5;
static int t;
static string S = "Alireza Pir";
{
for(int i = 0; i< c ; i++){
a = a +c;
}
static{
t = S.length();
}
}

 

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

 

با این حال نکته بسیار مهمی در روند اجرای این دو مقدار دهیِ گفته شده وجود دارد، متغیر ها و توابع استاتیک، متعلق به کلاس هستند و نه متعلق به شیء، این یعنی مقدار دهی های استاتیک فقط یک بار در طول اجرای برنامه (و آن هم زمان لود شدنِ کلاس برای اولین بار که بعدا درباره آن صحبت می کنم) اتفاق می افتند.

یعنی در بالا، بلاک های استاتیک و مقداردهی های برخط استاتیک فقط یک بار اتفاق می افتد ولی سایر بخش ها با تولیدِ شیء هربار انجام می شوند.

ترتیب اجرا هم به این شرح است: دستورات برخطِ استاتیک، دستورات بلاک استاتیک، دستورات برخط غیر استاتیک، دستورات بلاک غیر استاتیک، تابع سازنده.

 

و دو نکته فهرست وار برای پایان این قسمت:

  • به متد های Getter ، accesor  نیز می گویند، و به متد های setter، mutator نیز گفته می شود.
  • یک فایل جاوا میتواند کلاس پابلیک نداشته باشد، اما اگر داشته باشد، دقیقا یک عدد و نیز همنامِ با نامِ فایل باید باشد.

 

قسمت بعد