فئات وكائنات جافا
مقدمة لفئات جافا Java Classes
الفئة "class" ليست سوى مخطط أو قالب لإنشاء كائنات "objects" مختلفة و التي تحدد الخصائص والسلوكيات للكائنات. كائنات الفئة لجافا تحمل الخصائص والسلوكيات التي تحددها فئة. تحتوي الفئة على حقول "fields" و مناهج "methods" لوصف سلوك الكائن "object".
المناهج "Methods" ليسوا سوى أعضاء في الفئة التي توفر خدمة لكائن أو تنفيذ بعض الأعمال. حقول جافا "Java fields" و أسماء أعضاء الوظائف "member functions names" يمثلون حالة حساسة. حالات كائن الفئة الحالية يتم تخزينها في متغيرات مثيل الكائن "object’s instance variables". المناهج "Methods" تحدد العمليات التي يمكن القيام بها في مجال برمجة جافا.
الفئة لديها هذا التركيب "syntax" العامة التالي :
?
1
2
3
4
5
6
7
8
9
10
11
12
13<class modifiers>class
<extends clause> <implements clause>{
// Dealing with Classes (Class body)
<field declarations (Static and Non-Static)>
<method declarations (Static and Non-Static)>
<inner class declarations>
<nested interface declarations>
<constructor declarations>
<static initializer blocks>
}
أدناه هو مثال يوضح كائنات وفئات من الفئة Cube التي تُعرف 3 حقول "fields" وهي length و breadth و height. و تحتوي الفئة أيضا على الوظيفة getVolum.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Cube {
int length;
int breadth;
int height;
public int getVolume() {
return (length * breadth * height);
}
}
كيف يمكنك الإشارة لبيانات عضو و لبيانات الوظيفة؟
ويتم إنجاز هذا بذكر اسم مرجع الكائن "object reference" ، يليه نقطة ، يليه اسم العضو "member" داخل الكائن.
?
1 objectReference.member
يمكنك استدعاء منهج "method" لكائن إبتداء بإسم الكائن ، يليه نقطة ، يليه اسم المنهج و قائمة الوسائط "argument list"، مثل هذا :
?
1 objectName.methodName(arg1, arg2, arg3)
على سبيل المثال :
?
1
2
3
4
5
6
7cubeObject.length = 4;
cubeObject.breadth = 4;
cubeObject.height = 4;
cubeObject.getvolume()
متغيرات الفئة -- حقول ثابت Class Variables – Static Fields
نستخدم متغيرات الفئة "class variables" او ما تسمى أيضا بالحقول الثابتة "Static fields" عندما نريد أن نشارك الخصائص لجميع الكائنات ضمن فئة. عندما نقوم بتعريف حقل ليكون ثابت "static" ، فيتم إنشاء مثيل واحدة فقط من المتغير "variable" لمشاركة كافة الكائنات من تلك الفئة. وبالتالي عندما يغيركائن واحد قيمة متغير الفئة "class variable" ، فإنه يؤثر على كل كائنات الفئة. يمكننا الوصول إلى متغير فئة باستخدام اسم الفئة ، وليس بالضرورة استخدام مرجع الكائن داخل الفئة. يمكن الوصول إلى متغيرات ثابتة "Static variables" حتى ولو لم يكن هناك كائن من تلك الفئة. يتم تعريف باستخدام الكلمة الأساسية static.
مناهج الفئة -- المناهج الثابتة Class Methods – Static Methods
مناهج الفئة "Class methods" الثابتة مثلها مثل متغيّرات الفئة "Class variables" يمكن استدعائها دون أن يكون لها مثيل من الفئة. مناهج الفئة "Class methods"غالبا ما تستخدم لتوفير الوظيفة العالمة "global functions" لبرامج جافا. على سبيل المثال، المناهج الموجودة في الحزمة java.lang.Math هم مناهج الفئة "class methods". لا يمكنك استدعاء المناهج الغير ثابتة "non-static methods" من داخل منهج ثابت "static method".
متغيرات المثيل
المتغيرات المثيلة "Instance variables" تقوم بتخزين حالة الكائن. يجب ان يكون لكل فئة نسختها من المتغير"variable". كل كائن له حالة "state" التي يتم تحديدها من قبل قيمة مخزنة في الكائن. الكائن يغير حالته عندما يتم تغير واحد أو أكثر من قيمة البيانات المخزنة في الكائن. عندما يستجيب الكائن للرسالة، فإنه عادة ما يكون أدى عمل ، أو غيّير حالته الخ الكائن الذي لديه القدرة على تخزين القيم "values" كثيرا ما يقال أنه ثبات.
لننظر في هذا البرنامج البسيط الذي يظهر استخدام الحقول الثابتة "static fields" و المناهج الثابتة "static methods"
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45class Cube {
int length = 10;
int breadth = 10;
int height = 10;
public static int numOfCubes = 0; // static variable
public static int getNoOfCubes( ) { //static method
return numOfCubes;
}
public Cube() {
numOfCubes++; //
}
}
public class CubeStaticTest {
public static void main (String args[]) {
System.out.println("Number of Cube objects = " + Cube.numOfCubes);
System.out.println("Number of Cube objects = " + Cube.getNoOfCubes());
}
}
Output
Number of Cube objects = 0
Number of Cube objects = 0
المتغير و المناهج و الفئات النهائية
في جافا يمكن أن نسجل الحقول و المناهج و الفئات على اساس نهائي. و إذا ما وضعة علامة النهائي ، فلا يمكن تغير هذه العناصر.
المتغيرات المعرفة في واجهة ليست ضمنا نهائية. لا يمكنك تغيير قيمة المتغير النهائي (ثابت). الفئة النهائية لا يمكنها أن تمتد . الفئة النهائية لا يمكنها ان تكون فئة فرعية. يتم ذلك لأسباب أمنية مع الطبقات الأساسية مثل String و Integer. كما يسمح للمحول البرمجي أن يقوم ببعض التحسينات، ويجعل تحقيق مسئلة السلامة أسهل قليلا . و لا يمكن تجاوز المنهج النهائي عندما يتم توريث فئتها. فإن أي محاولة لتجاوز أو إخفاء المنهج النهائي ينتج عنه خطأ في عملية التحويل البرمجي.
مقدمة لكائنات جافا
فئة Object هي الفئة المتفوقة لجميع الفئات في جافا.
هذه بعض مناهج الفئة object
?
1
2
3
4
5
6
7equals
toString()
wait()
notify()
notifyAll()
hashcode()
clone()
الكائن هو مثيل لفئة تم إنشاؤها باستخدام المشغل "new". المشغل new يقوم بإرجاع مرجع لمثيل الفئة. هذا المرجع يمكن تعيينه إلى مرجع المتغير للفئة. وتسمى عملية خلق الكائنات من الفئة "instantiation". الكائن يقوم بتغليف الحالة "state" والسلوك "behavior".
مرجع الكائن يوفر مؤشر إلى الكائن الذي تم إنشاؤه وتخزينه في الذاكرة. في جافا، لا يمكن معالجة الكائنات إلا عن طريق المراجع "references" ، والتي يمكن تخزينها في المتغيرات "variables".
خلق المتغيرات "variables" لنوع الفئة الخاصة بك مشابه لخلق متغيرات أنواع البيانات البدائية "primitive data types" ، مثل عدد صحيح "integer" أو عشري "float". في كل مرة عندما تقوم بإنشاء كائن ، مجموعة جديدة من المتغيرات المثيلة "instance variables"تضهر و التي تحدد خصائص هذا الكائن. إذا كنت ترغب في إنشاء كائن لفئة ولها مرجعية متغير "reference variable" مرتبطة بهذا الكائن ، فيجب عليك تخصيص ذاكرة للكائن باستخدام المشغل "new". وهذا ما يسمى عملية instantiating الكائن أو إنشاء مثيل للكائن.
عند إنشاء كائن جديد، فأنت تستخدم المشغل new لإنشاء مثيل "instantiate" للكائن. المشغل الجديد يقوم بإرجاع موقع الكائن الذي قمت بتعيين نوع المرجع له.
أدناه هو مثال يوضح إنشاء كائنات Cube باستخدام المشغل new.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public class Cube {
int length = 10;
int breadth = 10;
int height = 10;
public int getVolume( ) {
return ( length * breadth * height );
}
public static void main(String[] args) {
Cube cubeObj; //Creates a Cube Reference
cubeObj = new Cube(); //Creates an Object of Cube
System.out.println("Volume of Cube is : "+cubeObj.getVolume());
}
}
المنهج المهيمن
هيمنة المنهج "Method overloading" تقع عند وجود اثنين أو أكثر من المناهج في نفس الفئة لهم نفس الاسم ولكن المعلمات "parameters" مختلفة. المناهج ذات نفس الاسم يجب أن تختلف في أنواعها أو عدد معلماتها. هذا يسمح للمحول البرمجي مطابقة المعايير واختيار الأسلوب الصحيح عندما يكون لديه عدد من الخيارات. تغيير نوع الإرجاع فقط ليست كافيا لتجاوز المنهج ، وسوف يكون هناك خطأ في الوقت التحويل البرمجي. فيجب أن يكون له توقيع مختلف. عندما لا يتم العثور على أي منهج مطابق لمعلمات الإدخال، فالمحول البرمجي يحاول تحويل معلمات الإدخال إلى أنواع مع قدر أكبر من الدقة. فقد نجد تطابق دون خطأ في وقت التحويل البرمجي ، التنفيذ السليم يتم اختياره استنادا إلى توقيع نداء المنهج.
أدناه هو مثال على فئة يُظهر المنهج المهيمن
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65public class MethodOverloadDemo {
void sumOfParams() { // First Version
System.out.println("No parameters");
}
void sumOfParams(int a) { // Second Version
System.out.println("One parameter: " + a);
}
int sumOfParams(int a, int b) { // Third Version
System.out.println("Two parameters: " + a + " , " + b);
return a + b;
}
double sumOfParams( double a, double b) { // Fourth Version
System.out.println("Two double parameters: " + a + " , " + b);
return a + b;
}
public static void main(String args[]) {
MethodOverloadDemo moDemo = new MethodOverloadDemo();
int intResult;
double doubleResult;
moDemo.sumOfParams();
System.out.println();
moDemo.sumOfParams(2);
System.out.println();
intResult = moDemo.sumOfParams(10, 20);
System.out.println("Sum is " + intResult);
System.out.println();
doubleResult = moDemo.sumOfParams(1.1, 2.2);
System.out.println("Sum is " + doubleResult);
System.out.println();
}
}
Output
No parameters
One parameter: 2
Two parameters: 10 , 20
Sum is 30
Two double parameters: 1.1 , 2.2
Sum is 3.3000000000000003
يوجد أدناه مقتطف التعليمات البرمجية يبين الواجهات التي تطبقها الفئة :
?
1
2
3
4
5
6
7
8
9
10
11Class cls = java.lang.String.class;
Class[] intfs = cls.getInterfaces();
// [java.lang.Comparable, java.lang.CharSequence, java.io.Serializable]
// The interfaces for a primitive type is an empty array
cls = int.class;
intfs = cls.getInterfaces(); // []
يوجد أدناه مقتطف التعليمات البرمجية يبين متى الفئة Object تمثل فئة أو واجهة:
?
1
2
3
4
5
6
7Class cls = java.lang.String.class;
boolean isClass = !cls.isInterface(); // true
cls = java.lang.Cloneable.class;
isClass = !cls.isInterface(); // false