الوراثة في جافا هي العلاقة بين الفئة المتفوقة و الفئة الفرعية التابعة لها. هذا يعني أنه يمكن استخدام كائن من الفئة فرعية "subclass" مثلما تستخدم اي كائن من الطبقة المتفوقة "superclass". آلية توريث الفئة في جافا تستخدم لبناء فئات جديدة من الفئات الموجودة. العلاقة الوراثية هي إنتقالية : إذا كانت الفئة x تمتد من الفئة y، فإن الفئة z الممتدة من الفئة x سوف ترث أيضا من الفئة y.
على سبيل المثال يمكن لفئة سيارة "car" ان ترث بعض الخصائص من الفئة العامة لوسيلة نقل "vehicle". هنا نجد أن الفئة الأساسية هي الفئة وسيلة نقل "vehicle" و الفئة الفرعية هي سيارة "car" التي هي أكثر تحديدا. يجب على الفئة الفرعية استخدام المصطلح "extends" للإشتقاق من الفئة فائقة التي يجب أن يكون مكتوب في الرأسية الخاصة بتعريف الفئة الفرعية. ترث الفئة فرعية أعضاء من الفئة المتفوقة و هذا يعزز بالتالي إعادة استخدام التعليمات البرمجية. ويمكن للفئة الفرعية نفسها إضافة خصائص و تصرفات خاص بها. الفئة java.lang.Object دائما تكون في أعلى هرم الميراث لأي فئة .
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
65
66
67
68
69
70
71
72
73class Box {
double width;
double height;
double depth;
Box() {
}
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
void getVolume() {
System.out.println("Volume is : " + width * height * depth);
}
}
public class MatchBox extends Box {
double weight;
MatchBox() {
}
MatchBox(double w, double h, double d, double m) {
super(w, h, d);
weight = m;
}
public static void main(String args[]) {
MatchBox mb1 = new MatchBox(10, 10, 10, 10);
mb1.getVolume();
System.out.println("width of MatchBox 1 is " + mb1.width);
System.out.println("height of MatchBox 1 is " + mb1.height);
System.out.println("depth of MatchBox 1 is " + mb1.depth);
System.out.println("weight of MatchBox 1 is " + mb1.weight);
}
}
Outputما هو الغير ممكن عند استخدام توريث الفئة لجافا؟
Volume is : 1000.0
width of MatchBox 1 is 10.0height of MatchBox 1 is 10.0depth of MatchBox 1 is 10.0weight of MatchBox 1 is 10.0
1. الأعضاء الخاصين "Private members" للطبقة المتفوقة ليسوا قابلين للتوريث من قبل الفئة الفرعية، و لا يمكن الوصول إليهم إلا بشكل غير مباشر.
2. الأعضاء الذين لهم إمكانية الوصول الافتراضي في الفئة المتفوقة هم أيضا ليسوا قابلين للتوريث من قبل الفئات الفرعية لواجهات اخرى ، وهؤلاء الأعضاء لا يمكن الوصول إليهم إلا بأسمائهم البسيطة في الفئات الفرعية ضمن نفس الواجهة و نفس الفئة المتفوقة.
3. بما ان المنشؤون "constructors" وكتل المهيئ "initializer blocks" ليسوا أعضاء في الفئة ، فهم غير قابلين للتوريث من قبل الفئة الفرعية.
4. فئة فرعية يمكنها فقط تمديد فئة فائقة واحدة
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111class Vehicle {
// Instance fields
int noOfTyres; // no of tyres
private boolean accessories; // check if accessorees present or not
protected String brand; // Brand of the car
// Static fields
private static int counter; // No of Vehicle objects created
// Constructor
Vehicle() {
System.out.println("Constructor of the Super class called");
noOfTyres = 5;
accessories = true;
brand = "X";
counter++;
}
// Instance methods
public void switchOn() {
accessories = true;
}
public void switchOff() {
accessories = false;
}
public boolean isPresent() {
return accessories;
}
private void getBrand() {
System.out.println("Vehicle Brand: " + brand);
}
// Static methods
public static void getNoOfVehicles() {
System.out.println("Number of Vehicles: " + counter);
}
}
class Car extends Vehicle {
private int carNo = 10;
public void printCarInfo() {
System.out.println("Car number: " + carNo);
System.out.println("No of Tyres: " + noOfTyres); // Inherited.
// System.out.println("accessories: " + accessories); // Not Inherited.
System.out.println("accessories: " + isPresent()); // Inherited.
// System.out.println("Brand: " + getBrand()); // Not Inherited.
System.out.println("Brand: " + brand); // Inherited.
// System.out.println("Counter: " + counter); // Not Inherited.
getNoOfVehicles(); // Inherited.
}
}
public class VehicleDetails { // (3)
public static void main(String[] args) {
new Car().printCarInfo();
}
}
Output
الكلمات "this" و "super"
Constructor of the Super class called
Car number: 10No of Tyres: 5accessories: trueBrand: XNumber of Vehicles: 1
هاذين الكلمتين الأساسيتين ، "this" و "super" سيقومان بمساعدتك في اسم الحقل أو اسم المنهج الذي تريده. وباستخدام "this" و "super" لديك السيطرة الكاملة على امكانية استدعاء الحقل أو المنهج الموجود في نفس الفئة أو لإستدعائه من الفئة المتفوقة مباشرتا. يتم استخدام الكلمة "this" كمرجع للكائن الحالي الذي هو مثيل للفئة الحالية. و تستخدم الكلمة "super" أيضا كمراجع للكائن الحالي، ولكن كما مثيل للفئة الفائقة للفئة الحالية.
المرجع "this" للكائن الحالي هو مفيد في الحالات التي يكون فيها المتغير المحلي أخفى أو ظلل حقل بنفس الاسم. إذا كان المنهج يحتاج إلى تمرير الكائن الحالي إلى منهج آخر ، يمكن له أن يفعل ذلك باستخدام هذا المرجع. ملاحظة أن المرجع "this" لا يمكن أن يكون قد تم استخدامه في سياق ثابت ، كما لم يتم تنفيذ التعليمات البرمجية ثابتة في سياق أي كائن.
?
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
37class Counter {
int i = 0;
Counter increment() {
i++;
return this;
}
void print() {
System.out.println("i = " + i);
}
}
public class CounterDemo extends Counter {
public static void main(String[] args) {
Counter x = new Counter();
x.increment().increment().increment().print();
}
}
Output
Volume is : 1000.0
width of MatchBox 1 is 10.0height of MatchBox 1 is 10.0depth of MatchBox 1 is 10.0weight of MatchBox 1 is 10.0