Java Access Modifier Types
هناك نوعان من الـ access modifiers في Java:
- معدِّلات الوصول access modifiers
- معدِّلات عدم الوصول non-access modifiers
تحدد الـ access modifiers في Java إمكانية الوصول لـ field أو method أو constructors أو class.
يمكننا تغيير مستوى للـ field أو method أو constructors أو class من خلال تطبيق الـ access modifier عليه.
مثال:
public class ClassName {
}
private boolean myTotal;
static final double price = 9.5;
protected static final int Height = 42;
public static void main(String[] arguments) {
// body of method
}
Access modifier types
هناك أربعة أنواع من الـ access modifier فى Java:
- Default: مستوى الوصول للـ default modifier يكون داخل الحزمة (package) فقط ولا يمكن الوصول إليه من خارجها، إذا لم تحدد أي مستوى للوصول ، فسيكون هو المستوى الافتراضي.
- Public: مستوى الوصول للـ Public modifier في كل مكان، يمكن الوصول إليه من داخل أو خارج الـ class أو الـ package.
- Private: مستوى الوصول للـ private modifier من داخل الـ class فقط، ولا يمكن الوصول إليه من خارج الـ class.
- Protected: يقع مستوى الوصول للـ Protected modifier داخل أو خارج الـ package من خلال الـ child class.
أمثلة للتوضيح
1) Default
مستوى الوصول للـ default modifier يكون داخل الحزمة (package) فقط.
في هذا المثال ، قمنا بإنشاء حزمتين (test و testing)، نحن ندخل إلى class الـ A من خارج مجموعتها ، لأن الـ class ليست public ، لذا لا يمكن الوصول إليها من خارج الـ package.
A.java:
package test;
class A {
void sayHello(){
System.out.println("Hello");
}
}
B.java
package testing;
import test.*;
class B {
public static void main(String args[]){
A my_obj = new A();
my_obj.sayHello();
}
}
2) Public
مستوى الوصول للـ Public modifier في كل مكان.
مثال بسيط شبيه بالمثال السابق الخاص بالـ Default:
A.java
package test;
public class A {
public void sayHello(){
System.out.println("Hello");
}
}
B.java
package testing;
import test.*;
class B {
public static void main(String args[]){
A my_obj = new A();
my_obj.sayHello();
}
}
3) Private
مستوى الوصول للـ private modifier من داخل الـ class فقط.
في هذا المثال ، أنشأنا فصلين بإسم واحد x، الـ class يحتوي على متغير بيانات private وmethod أيضًا private:
class X{
private int data = 40;
private void sayHello(){
System.out.println("Hello Member!");
}
}
public class Test {
public static void main(String args[]){
x my_obj = new x();
System.out.println(my_obj.data); // Compile Time Error
my_obj.sayHello(); // Compile Time Error
}
}
إذا جعلت أي class constructor خاصًا private، فلا يمكنك إنشاء مثيل لتلك الـ class من خارج الـ class:
class X {
private X(){ //private constructor
}
void sayHello(){
System.out.println("Hello Member");
}
}
public class Simple {
public static void main(String args[]){
X my_obj = new X();//Compile Time Error
}
}
4) Protected
مستوى الوصول للـ Protected modifier داخل أو خارج الـ package من خلال الـ child class.
يمكن تطبيق الـ protected access modifier على الـ variables و الـ method والـ constructor، ولا يمكن تطبيقه على الـ class.
مثال للتوضيح:
في هذا المثال: قمنا بإنشاء حزمتي test و mytest، و class الـ test عام (public) ، لذلك يمكن الوصول إليه من خارج الـ package.
ولكن تم تعريف method الـ sayHello لهذه الـ package على أنها محمية (protected) ، لذلك يمكن الوصول إليها من خارج الـ class فقط عن طريق التوريث Inherits.
A.java
package test;
public class A {
protected void sayHello(){
System.out.println("Hello");
}
}
B.java
package mytest;
import test.*;
class B extends A {
public static void main(String args[]){
B my_obj = new B();
my_obj.sayHello();
}
}
Non-Access Modifiers types
توفر Java عددًا من Non-Access Modifiers لتحقيق العديد من الوظائف، وهم:
- final: هذا الـ Modifier لوضع اللمسات الأخيرة على تطبيقات الـ class و الـ methods و الـ variables.
- static: هذا الـ Modifier لإنشاء methods و variables للـ class.
- abstract: هذا الـ Modifier لإنشاء classes و methods مجردة.
- synchronized: يتحكم هذا الـ Modifier في وصول مؤشر الترابط إلى block أو method.
Final Modifier
Final Variables
يمكن تهيئة المتغير final بشكل صريح مرة واحدة فقط، لا يمكن مطلقًا إعادة تعيين متغير مُرجع تم الإعلان عنه نهائيًا للإشارة إلى كائن مختلف.
ومع ذلك ، يمكن تغيير البيانات الموجودة داخل الكائن.
مع المتغيرات ، غالبًا ما يتم استخدام الـ final modifier مع static لجعل الـ constant متغير class.
مثال:
public class Test {
final int value = 10;
// Declaring constants:
public static final int BOXHEIGHT = 100;
static final String TITLE = "Albashmoparmeg";
public void changeValue() {
value = 12; // will give an error
}
}
Final Methods
لا يمكن لأي method فرعية تجاوز method الـ final.
مثال:
public class Test {
public final void sayHello() {
// body of method
}
}
Final Classes
الغرض الرئيسي من استخدام class يتم الإعلان عنه كـ final هو منع الـ class من التصنيف الفرعي.
إذا تم وضع علامة على الـ class على أنه final، فلا يمكن لأي class أن يرث أي ميزة من الـ class الأخير.
مثال:
public final class Test {
// body of class
}
abstract Modifier
Abstract Class
لا يمكن أبدًا إنشاء class الـ abstract،إذا تم الإعلان عن class على أنه abstract، فإن الغرض الوحيد هو تمديد الـ class.
لا يمكن أن تكون class الـ abstract والـ final (حيث لا يمكن تمديد الـ class)، إذا كان الـ class يحتوي على abstract methods ، فيجب الإعلان عن abstract class، خلاف ذلك سيتم طرح خطأ من الـ compiler.
مثال:
abstract class user {
private String name;
private int age;
public abstract void sayHello(); // an abstract method
}
Abstract Methods
abstract method هي طريقة معلنة بدون أي تطبيق، يتم توفير جسم الـ methods بواسطة الـ class الفرعي، لا يمكن أن تكون methods الـ abstract نهائية(final) أو صارمة(strict).
إذا كانت الـ class تحتوي على method الـ abstract أو أكثر ، فيجب تعريف الـ class بأنها abstract.
💡 لا تحتاج الـ class الـ abstract إلى احتواء الـ methods الـ abstract|، وتنتهي method الـ abstract بفاصلة منقوطة.
مثال:
public abstract class SuperClass {
abstract void x(); // abstract method
}
class SubClass extends SuperClass {
// implements the abstract method
void x() {
// .........
}
}
Synchronized Modifier
تستخدم الكلمة Synchronized للإشارة إلى أنه يمكن الوصول إلى الـ method من خلال مؤشر ترابط واحد فقط في كل مرة.
يمكن تطبيق synchronized modifier مع أي من modifiers مستوى الوصول الأربعة.
مثال:
public synchronized void test() {
}
Transient Modifier
يتم تمييز متغير transient للإشارة إلى JVM لتخطي المتغير المحدد عند إجراء تسلسل للكائن الذي يحتوي عليه.
يتم تضمين هذا transient في العبارة التي تنشئ المتغير ، الذي يسبق الـ class أو نوع البيانات للمتغير.
مثال:
public transient int age = 40;
public int x;
Volatile Modifier
يتم استخدام الـ volatile modifier للسماح لـ JVM بمعرفة أن مؤشر الترابط الذي يصل إلى المتغير يجب أن يقوم دائمًا بدمج نسخته الخاصة من المتغير مع النسخة الرئيسية في الذاكرة.
يقوم الوصول إلى متغير بمزامنة جميع ذاكرة التخزين المؤقت التي تم نسخها من المتغيرات في الذاكرة الرئيسية.
مثال:
public class users implements user {
private volatile boolean active;
public void run() {
active = true;
while (active) {
// some code here
}
}
public void stop() {
active = false;
}
}
الإبلاغ عن خطأ
×إذا وجد خطأ وتريد الإبلاغ عن هذا الخطأ، أو إذا كنت تريد تقديم اقتراح على شىء معين، فلا تتردد في إرسال بريد إلكتروني إلينا:
info@albashmoparmeg.com
شكرًا لك على مساعدتك لنا!