آموزش جامع برنامه نویسی جاوا به زبان ساده – بخش پنجم: اعلان کلاس
برای تعریف یک شیء در زبان جاوا باید یک کلاس را اعلان کنید. کلاس را میتوان به عنوان یک قالب برای یک شیء مانند یک قالب برای کیک در نظر گرفت.
اعلان کلاس
در قطعه کد 1 در بخش چهارم، این اعلان کلاس وجود دارد:
accessSpecifier class ClassName {
accessSpecifier dataType variableName [= initialValue];
accessSpecifier ClassName([argumentList]) {
constructorStatement(s)
}
accessSpecifier returnType methodName([argumentList]) {
methodStatement(s)
}
}
accessSpecifier کلاس میتواند چند مقدار داشته باشد اما معمولاً public است. در ادامه مقادیر دیگر accessSpecifier معرفی میشوند.
میتوان کلاس را به هر وضعیتی که ترجیح داده میشود نامگذاری کرد ولی روش معمول روش شتری نام دارد. در این روش نام کلاس با یک حرف بزرگ شروع میشود و حرف اول هرکدام از واژههای ادامه نیز بزرگ نوشته میشود. باقی حروف بهصورت کوچک نوشته میشوند. نام کلاس تنها میتواند شامل حرف و عدد باشد. استفاده از این روش باعث میشود که کد برای توسعهدهندگان دیگر که از همین روش استفاده میکنند خوانا باشد.
متغیرها و متدها
کلاسها میتوانند دو عضو داشته باشند: متغیر و متد.
متغیرها
مقادیر متغیرهای کلاس هر وهله از آن کلاس را از وهلههای دیگر متمایز میکند و حالت آن را تعریف میکند. این مقادیر اغلب به نام متغیرهای وهلهای نامیده میشوند. یک متغیر موارد زیر را در خود دارد:
- accessSpecifier (تعریف سطح دسترسی)
- datatype
- variableName (نام متغیر)
- initialValue (مقدار اولیه که اختیاری است)
مقادیر ممکن برای سطح دسترسی بهصورت زیر هستند:
- public (عمومی): هر شیء در هر پکیج میتواند این متغیر را ببیند. (هرگز از این مقدار استفاده نکنید. در ادامه در این خصوص بیشتر توضیح داده شده است.)
- Protected (حفاظتشده): هر شیء که در همان پکیج یا کلاس فرعی آن (در هر پکیجی که تعریفشده باشد) تعریفشده باشد میتواند این متغیر را ببیند.
- بدون تعریف سطح دسترسی (که معمولاً دوستانه یا دسترسی خصوصی پکیج نیز نامیده میشود.) تنها اشیائی که کلاسهایشان در همان پکیج است میتوانند متغیر را ببینند.
- Private (خصوصی): تنها درون کلاس متغیر دیده میشود.
چرا نباید از متغیرهای عمومی استفاده کنیم؟
استفاده از متغیرهای عمومی هرگز ایده خوبی محسوب نمیشود، اما ممکن است در موارد بسیار حادی ضروری باشند. به همین دلیل این گزینه وجود دارد. پلتفرم جاوا موارد استفاده شما را بررسی نمیکند و بنابراین باید در مورد استفاده از روشهای کد نویسی صحیح متعهد باشید، حتی اگر وسوسه شوید که خلاف آن عمل کنید.
نوع داده یک متغیر به آن چیزی که متغیر برای آن تعریفشده است بستگی دارد. این نوع میتواند یک نوع ابتدایی یا نوعی از کلاس دیگر باشد (این مورد را در ادامه توضیح میدهیم.)
انتخاب نام متغیر بر عهده برنامهنویس است اما معمولاً نامگذاری متغیرها از روش شتری تبعیت میکند بهجز آنها که با حرف کوچک شروع میشوند (این روش معمولاً روش شتری کوچک نامیده میشود.)
فعلاً در مورد مقدار اولیه نباید نگران باشید. فقط بدانید که میتوان برای متغیر در زمان تعریف کردن مقداری تعیین کرد (در غیر این صورت کامپایلر یک مقدار پیشفرض در زمان ایجاد کلاس تعیین میکند.)
مثال: تعریف کلاس برای Person. در ادامه مثالی ارائه کردیم که در آن هر آنچه را تاکنون آموزش دیدهایم خلاصه کردهایم و قطعه کد زیر یک تعریف کلاس برای شیء شخص است.
قطعه کد 2- تعریف کلاس پایه برای person
public class Person {
private String name;
private int age;
private int height;
private int weight;
private String eyeColor;
private String gender;
}
تعریف کلاس پایه برای شخص در این نقطه مفید نیست زیرا تنها خصوصیات شخص را تعریف میکند. برای اینکه تعریف کلاس کامل شود باید کلاس person رفتار داشته باشد و این به معنی متدهای کلاس است.
متدها
متدهای یک کلاس رفتار آن را تعریف میکند. متدها به دو دسته عمده تقسیم میشوند: سازندهها (constructors) و متدهای دیگر که انواع مختلفی دارند. یک متد سازنده تنها برای ایجاد یک وهله از کلاس استفاده میشوند. دیگر انواع متدها میتوانند برای هر رفتار برنامه استفاده شوند.
تعریف کلاس که در قطعه کد 1 ارائه کردیم روش تعریف ساختار روش را نشان میدهد و شامل اجزای زیر است:
- accessSpecifier (سطح دسترسی)
- returnType (نوع بازگشتی)
- methodName (نام متد)
- argumentList (فهرست آرگومانها)
ترکیب این اجزای ساختاری در تعریف متد به نام امضای متد شناخته میشود. اینک نگاهی دقیقتر به دو دسته متد میاندازیم و نخست از متدهای سازنده آغاز میکنیم.
از متدهای سازنده برای تعیین نحوه ایجاد وهلهای از یک کلاس استفاده میکنیم. قطعه کد 1 دستورزبان سازنده را به شکل abstract (مجرد) نشان میدهد که در ادامه آوردهایم:
accessSpecifier ClassName([argumentList]) {
constructorStatement(s)
}
سطح دسترسی سازنده همان سطح دسترسی متغیر است. نام سازنده باید با نام کلاس یکی باشد. بنابراین اگر نام کلاس Person باشد باید نام متد سازنده هم Person باشد.
هر سازندهای بهجز سازنده پیشفرض (سازندهها اختیاری هستند و در ادامه توضیح دادهایم) یک فهرست از آرگومانها باید در اختیارش قرار گیرد:
argumentType argumentName
آرگومانها فهرستی از argumentList هستند که به وسیله کاما از هم جدا شدهاند و هیچ دو آرگومانی نام یکسانی ندارند. نوع آرگومان یا از نوع ابتدایی است و یا نوع کلاس دیگر (همانند انواع متغیرها).
سازندهها اختیاری هستند
اگر از یک سازنده استفاده نکنید، کامپایلر یک سازنده برای شما میسازد که سازنده پیشفرض نام دارد. اگر از یک سازنده بهجز سازنده پیشفرض استفاده کنید، کامپایلر این سازنده را بهصورت خودکار برای شما نمیسازد.
تعریف کلاس با یک سازنده
اینک ببینیم وقتی قابلیت ایجاد یک شخص را به دو روش مختلف یعنی با استفاده از سازنده پیشفرض no-arg یا از طریق مقداردهی فهرست جزئی خصوصیات اضافه میکنیم چه اتفاقی میافتد.
قطعه کد 3 نحوه ایجاد سازندهها و همچنین چگونگی استفاده از فهرست آرگومانها را نشان میدهد:
قطعه کد 3- تعریف کلاس Person با یک سازنده
package com.makotojava.intro;
public class Person {
private String name;
private int age;
private int height;
private int weight;
private String eyeColor;
private String gender;
public Person() {
// Nothing to do...
}
public Person(String name, int age, int height, int weight String eyeColor, String gender) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
this.eyeColor = eyeColor;
this.gender = gender;
}
}
توجه کنید که کلیدواژه this برای ایجاد انتسابهای متغیر در قطعه کد فوق استفاده شده است. کلیدواژه this یک اختصار جاوا برای عبارت «this project» است و زمانی باید از آن استفاده کرد که بخواهیم به دو متغیر با نام یکسان ارجاع دهیم. در این مورد age هم یک پارامتر سازنده است و هم یک متغیر کلاس بنابراین کلیدواژه this کمک میکند که کامپایلر بفهمد کدام آنها مورد نظر هستند.
شیء person جالبتر شد اما باید رفتار بیشتری داشته باشد. و به این منظور باید متدهای بیشتری تعریف شود.
متدهای دیگر
سازنده نوع خاصی از متد است که کاربرد ویژهای دارد. بهطور مشابهی بسیاری دیگر از انواع متدها کارکردهای خاص خود را در برنامههای جاوا انجام میدهند. بررسی انواع دیگر متدها که در این بخش از آموزش آغاز شده است در بخشهای دیگر ادامه مییابد.
در قطعه کد 1 دیدیم که چگونه میتوانیم یک متد را اعلان کنیم:
accessSpecifier returnType methodName ([argumentList]) {
methodStatement(s)
}
متدهای دیگر بهجز چند استثنا کاملاً شبیه سازندهها هستند. نخست این که میتوان متدهای دیگر را به هر نام دلخواه نامگذاری کرد (البته قواعدی وجود دارند). قواعد معمول به این صورت هستند:
- آغاز با حرف کوچک
- اجتناب از اعداد مگر اینکه واقعاً ضروری باشند.
- استفاده صرف از کاراکترهای حرفی یا عددی
استثنای دوم اینکه برخلاف سازندهها، در متدهای دیگر نوع بازگشتی اختیاری است.
متدهای دیگر کلاس person
با این اطلاعات اولیه میتوانید ببینید که در قطعه کد 4 وقتی چند متد دیگر به شیء person اضافه میشوند چه اتفاقی میافتد (سازندهها عامدانه نادیده گرفته شدهاند.)
قطعه کد 4- کلاس شخص با چند متد جدید
package com.makotojava.intro;
public class Person {
private String name;
private int age;
private int height;
private int weight;
private String eyeColor;
private String gender;
public String getName() { return name; }
public void setName(String value) { name = value; }
// Other getter/setter combinations...
}
به توضیح قطعه کد 4 در مورد «ترکیب getter/setter» دقت کنید. در ادامه در مورد getter و setter بیشتر توضیح خواهیم داد. فعلاً کافی است بدانید که getter متدی است که مقادیر را از یک خصوصیت دریافت میکند و setter متدی است که این مقدار را تغییر میدهد. قطعه کد 4 تنها ترکیب getter/setter را (برای خصوصیت نام) نشان میدهد اما میتوان به روش مشابهی موارد دیگر را هم تعریف کرد.
در قطعه کد 4 توجه کنید که یک متد میتواند هیچ مقدار بازگشتی نداشته باشد. با تعریف کردن نوع بازگشتی به void در امضای متد باید به کامپایلر بگوییم که این متد مقدار بازگشتی ندارد.
متدهای استاتیک و وهلهای
بهطور کلی دو نوع متد (غیر سازنده) وجود دارند: متدهای وهله (instance) و متدهای استاتیک. متدهای وهله به حالت وهلهی خاصی از یک شیء برای رفتارش بستگی دارند. متدهای استاتیک گاهی اوقات متدهای کلاس نیز نامیده میشوند زیرا رفتار آنها به هیچیک از حالتهای شیء بستگی ندارد. رفتار یک متد استاتیک در سطح کلاس رخ میدهد. متدهای استاتیک بهطور گسترده در موارد مختلف استفاده میشوند. میتوان آنها را متدهای سراسری دانست در حالی که کد متد در کلاسی که آن را تعریف میکند نگهداری میشود.
برای نمونه در سراسر این آموزش از کلاس Logger JDK برای خروج اطلاعات در کنسول استفاده شده است. برای ایجاد یک وهله از کلاس Logger، یک وهله از کلاس Logger ایجاد نمیشود بلکه یک متد استاتیک به نام ()GetLogger فراخوانی میشود.
دستورزبان فراخوانی یک متد استاتیک از دستورزبان مورد استفاده برای فراخوانی متد یک شیء متفاوت است. در حالت اول از نام کلاسی که شامل متد استاتیک است نیز استفاده میشود برای مثال:
Logger l = Logger.getLogger("NewLogger");
در این مثال، Logger نام کلاس است و ()GetLogger نام متد است. بنابراین برای فراخوانی متد استاتیک نیازی به ایجاد وهلهای از یک شیء نیست، کافی است که نام کلاس استفاده شود.
در بخش ششم، شروع به نوشتن اولین کلاس با زبان جاوا خواهیم کرد.
با عرض سلام و خسته نباشید . این جمله که در این صفحه نوشتین : “استثنای دوم اینکه برخلاف سازندهها، در متدهای دیگر نوع بازگشتی اختیاری است.” ، به جای اختیاری باید نوشته بشه ” اجباری “.