انقر إذا كنت ترغب في المشروع. مساهماتك هي موضع ترحيب بحرارة.
تعدد الخيوط
المجموعات
اتصال قاعدة بيانات جافا (JDBC)
برامج جافا
طرق سلسلة جافا
صفحات خادم جاكرتا (JSP)
الخدمات
جافا أسئلة الاختيار من متعدد
نمط تصميم جافا
السبات
أساسيات إطار الربيع
مقدمة
هندسة جافا
أنواع بيانات جافا
طرق جافا
البرمجة الوظيفية جافا
تعبيرات جافا لامدا
فئات جافا
جافا البناءون
مصفوفة جافا
سلاسل جافا
انعكاس جافا
تيارات جافا
جافا التعبيرات العادية
التعامل مع ملفات جافا
استثناءات جافا
جافا الميراث
تجاوز طريقة جافا
جافا تعدد الأشكال
تجريد جافا
واجهات جافا
تغليف جافا
جافا الأدوية العامة
متنوع
طرق الواجهة بشكل افتراضي؛
تعبيرات لامدا؛
واجهات وظيفية
إشارات إلى الأساليب والمنشئات.
التعليقات التوضيحية المتكررة
شروح على أنواع البيانات؛
انعكاس لمعلمات الطريقة؛
Stream API للعمل مع المجموعات؛
الفرز الموازي للمصفوفات.
واجهة برمجة تطبيقات جديدة للعمل مع التواريخ والأوقات؛
محرك جافا سكريبت ناشورن الجديد؛
تمت إضافة عدة فئات جديدة للتشغيل الآمن للخيط؛
تمت إضافة واجهة برمجة تطبيقات جديدة Calendar
والإعدادات Locale
؛
تمت إضافة دعم لليونيكود 6.2.0؛
تمت إضافة فئة قياسية للعمل مع Base64؛
تمت إضافة دعم للحسابات غير الموقعة؛
تحسين المنشئ java.lang.String(byte[], *)
وأداء الطريقة java.lang.String.getBytes()
;
تطبيق جديد AccessController.doPrivileged
يسمح لك بتعيين مجموعة فرعية من الامتيازات دون الحاجة إلى التحقق من جميع * مستويات الوصول الأخرى؛
أصبحت الخوارزميات المعتمدة على كلمات المرور أكثر قوة؛
تمت إضافة دعم لإشارة اسم خادم SSL / TLS (NSI) في خادم JSSE؛
تحسين لوحة المفاتيح (KeyStore)؛
تمت إضافة خوارزمية SHA-224؛
تمت إزالة جسر JDBC - ODBC؛
تتم إزالة PermGen، ويتم تغيير طريقة تخزين البيانات الوصفية للفئات؛
القدرة على إنشاء ملفات تعريف لمنصة Java SE، والتي لا تتضمن النظام الأساسي بأكمله، بل جزءًا منه؛
أدوات
تمت إضافة أداة jjs
لاستخدام JavaScript Nashorn؛
يمكن للأمر java
تشغيل تطبيقات JavaFX؛
تمت إضافة أداة jdeps
لتحليل ملفات .class.
↥ العودة إلى الأعلى
Nashorn هو محرك JavaScript تم تطويره في Java بواسطة Oracle. مصمم لتوفير القدرة على تضمين كود JavaScript في تطبيقات Java. بالمقارنة مع Rhino، الذي تدعمه مؤسسة Mozilla، يوفر Nashorn أداء أفضل من 2 إلى 10 مرات، حيث يقوم بتجميع التعليمات البرمجية ونقل الكود الثانوي إلى جهاز Java الظاهري مباشرة في الذاكرة. يمكن لـ Nashorn تجميع كود JavaScript وإنشاء فئات Java التي يتم تحميلها بمحمل خاص. من الممكن أيضًا استدعاء كود Java مباشرةً من JavaScript.
↥ العودة إلى الأعلى
jjs
- هذه أداة مساعدة لسطر الأوامر تتيح لك تنفيذ برامج JavaScript مباشرة في وحدة التحكم.
↥ العودة إلى الأعلى
في Java، هناك ثلاث طرق مختلفة لقراءة المدخلات من المستخدم في بيئة سطر الأوامر (وحدة التحكم).
1. استخدام فئة القارئ المخزن مؤقتًا:
يتم استخدام هذه الطريقة عن طريق تغليف System.in (دفق الإدخال القياسي) في InputStreamReader المغلف في BufferedReader، يمكننا قراءة المدخلات من المستخدم في سطر الأوامر.
/** * فئة القارئ المخزن */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test { public static void main(String[] args) throws IOException { // أدخل البيانات باستخدام BufferReader BufferedReader Reader = new BufferedReader(new InputStreamReader(System.in)); // قراءة البيانات باستخدام readLine String name = Reader.readLine(); // طباعة سطر القراءة System.out.println(name); } }
2. استخدام فئة الماسح الضوئي:
الغرض الرئيسي من فئة الماسح الضوئي هو تحليل الأنواع والسلاسل البدائية باستخدام التعبيرات العادية، ومع ذلك يمكن استخدامه أيضًا لقراءة المدخلات من المستخدم في سطر الأوامر.
/** * فئة الماسح الضوئي */import java.util.Scanner;class GetInputFromUser { public static void main(String args[]) { // استخدام الماسح الضوئي للحصول على الإدخال من المستخدم Scanner in = new Scanner(System.in); String s = in.nextLine(); System.out.println("لقد أدخلت السلسلة" + s); int a = in.nextInt(); System.out.println("لقد أدخلت عددًا صحيحًا" + a); تعويم ب = in.nextFloat(); System.out.println("لقد أدخلت تعويم" + b); } }
3. استخدام فئة وحدة التحكم:
لقد أصبحت الطريقة المفضلة لقراءة مدخلات المستخدم من سطر الأوامر. بالإضافة إلى ذلك، يمكن استخدامه لقراءة المدخلات التي تشبه كلمة المرور دون تكرار الأحرف التي أدخلها المستخدم؛ يمكن أيضًا استخدام صيغة سلسلة التنسيق (مثل System.out.printf() ).
/** * فئة وحدة التحكم */public class Sample { public static void main(String[] args) { // استخدام وحدة التحكم لإدخال البيانات من المستخدم String name = System.console().readLine(); System.out.println(name); } }
↥ العودة إلى الأعلى
يعرض الأمر javap معلومات حول الحقول والمنشئات والأساليب الموجودة في ملف فئة. يقوم الأمر javap (المعروف أيضًا باسم Java Disassembler) بتفكيك ملف فئة واحد أو أكثر.
/** * Java Disassembler */class Simple { public static void main(String args[]) { System.out.println("Hello World"); } }
cmd> javap Simple.class
الإخراج
تم تجميعها من فئة ".java" Simple { بسيط()؛ public static void main(java.lang.String[]); }
↥ العودة إلى الأعلى
System.out::println
؟ يوضح التعبير المحدد تمرير مرجع إلى أسلوب ثابت لفئة println()
System.out
.
↥ العودة إلى الأعلى
يمكن أن تكون التدفقات متسلسلة ومتوازية. يتم تنفيذ العمليات على التدفقات المتسلسلة في مؤشر ترابط معالج واحد، على تدفقات متوازية - باستخدام عدة مؤشرات ترابط للمعالج. تستخدم التدفقات المتوازية الدفق المشترك ForkJoinPool
من خلال طريقة ForkJoinPool.commonPool()
الثابتة. في هذه الحالة، إذا لم تكن البيئة متعددة النواة، فسيتم تنفيذ الدفق بشكل تسلسلي. في الواقع، يقتصر استخدام التدفقات المتوازية على حقيقة أن البيانات الموجودة في التدفقات سيتم تقسيمها إلى أجزاء، تتم معالجة كل جزء على نواة معالج منفصلة، وفي النهاية يتم توصيل هذه الأجزاء، ويتم تنفيذ العمليات النهائية على هم.
يمكنك أيضًا استخدام طريقة الواجهة parallelStream()
لإنشاء دفق متوازي من المجموعة Collection
.
لجعل دفق متسلسل عادي متوازيًا، يجب عليك استدعاء أسلوب Stream
على الكائن parallel()
. تسمح لك الطريقة isParallel()
بمعرفة ما إذا كان الدفق متوازيًا.
باستخدام الطرق parallel()
sequential()
من الممكن تحديد العمليات التي يمكن أن تكون متوازية وأيها متسلسلة فقط. يمكنك أيضًا إنشاء دفق متوازي من أي دفق متسلسل والعكس صحيح:
مجموعة .تدفق () .peek (...) // العملية متسلسلة .موازي () .map (... ) // يمكن إجراء العملية بالتوازي، .متسلسل () .reduce (...) // العملية تسلسلية مرة أخرى
كقاعدة عامة، يتم نقل العناصر إلى الدفق بنفس الترتيب الذي تم تعريفها به في مصدر البيانات. عند العمل مع تيارات متوازية، يحافظ النظام على تسلسل العناصر. الاستثناء هو التابع forEach()
الذي يمكنه إخراج العناصر بترتيب عشوائي. ومن أجل الحفاظ على الترتيب، من الضروري تطبيق الطريقة forEachOrdered()
.
المعايير التي قد تؤثر على الأداء في التدفقات المتوازية:
حجم البيانات - كلما زادت البيانات، زادت صعوبة فصل البيانات أولاً، ثم دمجها.
عدد نوى المعالج . من الناحية النظرية، كلما زاد عدد النوى في جهاز الكمبيوتر، كلما كان البرنامج يعمل بشكل أسرع. إذا كان الجهاز يحتوي على نواة واحدة، فليس من المنطقي استخدام الخيوط المتوازية.
كلما كانت بنية البيانات التي يعمل بها الدفق أبسط، زادت سرعة حدوث العمليات. على سبيل المثال، البيانات من ArrayList
سهلة الاستخدام، نظرًا لأن بنية هذه المجموعة تفترض تسلسلاً من البيانات غير المرتبطة. لكن مجموعة النوع LinkedList
ليست الخيار الأفضل، حيث أن جميع العناصر في القائمة التسلسلية مرتبطة بالسابق / التالي. ومن الصعب موازاة مثل هذه البيانات.
ستكون العمليات مع الأنواع البدائية أسرع من كائنات الفئة.
يوصى بشدة بعدم استخدام التدفقات المتوازية لأي عمليات طويلة (على سبيل المثال، اتصالات الشبكة)، نظرًا لأن جميع التدفقات المتوازية تعمل مع ForkJoinPool
واحد، فإن مثل هذه العمليات الطويلة يمكن أن توقف جميع التدفقات المتوازية في JVM بسبب عدم وجود سلاسل رسائل متاحة في حمام السباحة، وما إلى ذلك. ه. يجب استخدام التدفقات المتوازية فقط للعمليات القصيرة حيث يستمر العد بالمللي ثانية، ولكن ليس للعمليات التي يمكن أن يستمر العد فيها للثواني والدقائق؛
يؤدي حفظ الأمر في تدفقات متوازية إلى زيادة تكاليف التنفيذ، وإذا لم يكن الأمر مهمًا، فمن الممكن تعطيل حفظه وبالتالي زيادة الإنتاجية باستخدام عملية وسيطة unordered()
:
مجموعة.parallelStream () .مرتبة () .غير مرتبة () .collect ( Collectors . toList ());
↥ العودة إلى الأعلى
Java Virtual Machine (JVM) هي إحدى المواصفات التي توفر بيئة وقت تشغيل يمكن من خلالها تنفيذ Java bytecode (ملفات .class). JVM هي المنصة. يعمل JVM كجهاز أو معالج "افتراضي". يتكون استقلال النظام الأساسي لـ Java في الغالب من Java Virtual Machine (JVM). يجعل JVM هذا ممكنًا لأنه يدرك أطوال التعليمات المحددة والخصائص الأخرى للنظام الأساسي (نظام التشغيل).
JVM ليس منصة مستقلة. يوفر Java Virtual Machine (JVM) البيئة اللازمة لتنفيذ ملف java (ملف .Class). لذلك في النهاية يعتمد الأمر على kernel ويختلف kernel من نظام التشغيل (نظام التشغيل) إلى نظام التشغيل. يتم استخدام JVM لترجمة الكود الثانوي إلى لغة الآلة لجهاز كمبيوتر معين وتنفيذ تعليمات لغة الآلة المقابلة أيضًا.
↥ العودة إلى الأعلى
يعد برنامج التحويل البرمجي Just-In-Time (JIT) أحد مكونات بيئة التشغيل التي تعمل على تحسين أداء تطبيقات Java عن طريق تجميع الرموز الثانوية إلى كود الجهاز الأصلي في وقت التشغيل.
تتكون برامج Java من فئات تحتوي على أكواد ثانوية محايدة للنظام الأساسي يمكن تفسيرها بواسطة JVM على العديد من بنيات الكمبيوتر المختلفة. في وقت التشغيل، يقوم JVM بتحميل ملفات الفئة، ويحدد دلالات كل كود ثانوي فردي، ويقوم بإجراء الحساب المناسب. يعني استخدام المعالج والذاكرة الإضافيين أثناء الترجمة الفورية أن تطبيق Java يعمل بشكل أبطأ من التطبيق الأصلي. يساعد برنامج التحويل البرمجي JIT على تحسين أداء برامج Java عن طريق تجميع الرموز الثانوية في كود الجهاز الأصلي في وقت التشغيل. يتم تمكين برنامج التحويل البرمجي JIT بشكل افتراضي. عندما يتم تجميع إحدى الطرق، يقوم JVM باستدعاء التعليمات البرمجية المترجمة لتلك الطريقة مباشرةً بدلاً من تفسيرها.
↥ العودة إلى الأعلى
يعد Java ClassLoader جزءًا من Java Runtime Environment الذي يقوم بتحميل فئات Java ديناميكيًا إلى Java Virtual Machine. يتم تجميع كود Java في ملف فئة بواسطة مترجم javac ويقوم JVM بتنفيذ برنامج Java، عن طريق تنفيذ رموز البايت المكتوبة في ملف الفئة. يعد ClassLoader مسؤولاً عن تحميل ملفات الفئة من نظام الملفات أو الشبكة أو أي مصدر آخر.
أنواع ClassLoader:
1. محمل فئة Bootstrap :
يقوم بتحميل ملفات فئة JDK القياسية من rt.jar والفئات الأساسية الأخرى. يقوم بتحميل ملفات الفئة من jre/lib/rt.jar. على سبيل المثال، فئة الحزمة Java.lang.
2. محمل فئة الملحقات :
يقوم بتحميل الفئات من امتدادات JDK مباشرة عادةً دليل JAVA_HOME/lib/ext
أو أي دليل آخر مثل java.ext.dirs.
3. محمل فئة النظام :
يقوم بتحميل فئات خاصة بالتطبيق من متغير البيئة CLASSPATH. يمكن ضبطه أثناء استدعاء البرنامج باستخدام خيارات سطر الأوامر -cp أو classpath.
↥ العودة إلى الأعلى
1. جدك :
تعد Java Development Kit المكون الأساسي لبيئة Java وتوفر جميع الأدوات والملفات التنفيذية والثنائيات اللازمة لتجميع برنامج Java وتصحيح أخطائه وتنفيذه.
2. جفم :
JVM مسؤول عن تحويل كود البايت إلى الكود الخاص بالجهاز. يعتمد JVM أيضًا على النظام الأساسي ويوفر وظائف Java الأساسية مثل إدارة الذاكرة وجمع البيانات المهملة والأمان وما إلى ذلك. JVM قابل للتخصيص ويمكننا استخدام خيارات Java لتخصيصه، على سبيل المثال تخصيص الحد الأدنى والحد الأقصى من الذاكرة لـ JVM. يُطلق على JVM اسم Virtual لأنه يوفر واجهة لا تعتمد على نظام التشغيل الأساسي وأجهزة الجهاز.
2. جي آر إي :
توفر Java Runtime Environment نظامًا أساسيًا لتنفيذ برامج Java. يتكون JRE من ثنائيات JVM وjava وفئات أخرى لتنفيذ أي برنامج بنجاح.
↥ العودة إلى الأعلى
1. مساحة كومة جافا:
يتم استخدام مساحة Java Heap بواسطة وقت تشغيل Java لتخصيص الذاكرة للكائنات وفئات JRE . عندما نقوم بإنشاء أي كائن، يتم إنشاؤه دائمًا في مساحة الكومة.
يتم تشغيل مجموعة البيانات المهملة على ذاكرة الكومة لتحرير الذاكرة المستخدمة بواسطة الكائنات التي ليس لها أي مرجع. أي كائن تم إنشاؤه في مساحة الكومة لديه وصول عالمي ويمكن الرجوع إليه من أي مكان في التطبيق.
2. ذاكرة جافا المكدسة:
المكدس في جافا هو قسم من الذاكرة يحتوي على الأساليب والمتغيرات المحلية والمتغيرات المرجعية . يتم إنشاء المتغيرات المحلية في المكدس.
تتم الإشارة دائمًا إلى ذاكرة المكدس بترتيب LIFO (Last-In-First-Out). عندما يتم استدعاء أسلوب ما، يتم إنشاء كتلة جديدة في ذاكرة المكدس لكي تحتفظ الطريقة بالقيم الأولية المحلية والإشارة إلى كائنات أخرى في الطريقة.
بمجرد انتهاء الطريقة، تصبح الكتلة غير مستخدمة وتصبح متاحة للطريقة التالية. حجم ذاكرة المكدس أقل جدًا مقارنة بذاكرة الكومة.
اختلاف:
المعلمة | كومة الذاكرة | مساحة الكومة |
---|---|---|
طلب | يتم استخدام المكدس في أجزاء، واحدة تلو الأخرى أثناء تنفيذ الخيط | يستخدم التطبيق بأكمله مساحة الكومة أثناء وقت التشغيل |
مقاس | للمكدس حدود للحجم اعتمادًا على نظام التشغيل وعادةً ما يكون أصغر من الكومة | لا يوجد حد لحجم الكومة |
تخزين | يخزن فقط المتغيرات والمراجع الأولية للكائنات التي تم إنشاؤها في Heap Space | يتم تخزين جميع الكائنات التي تم إنشاؤها حديثًا هنا |
طلب | يتم الوصول إليه باستخدام نظام تخصيص الذاكرة Last-in-Out (LIFO). | يتم الوصول إلى هذه الذاكرة عبر تقنيات إدارة الذاكرة المعقدة التي تشمل الجيل الشاب، والجيل القديم أو الدائم، والجيل الدائم. |
حياة | ذاكرة المكدس موجودة فقط طالما أن الطريقة الحالية قيد التشغيل | مساحة الكومة موجودة طالما أن التطبيق قيد التشغيل |
كفاءة | أسرع نسبيًا في التخصيص مقارنةً بالكومة | أبطأ في التخصيص بالمقارنة مع المكدس |
التخصيص/إلغاء التخصيص | يتم تخصيص هذه الذاكرة وإلغاء تخصيصها تلقائيًا عند استدعاء إحدى الطرق وإعادتها على التوالي | يتم تخصيص مساحة الكومة عند إنشاء كائنات جديدة وإلغاء تخصيصها بواسطة Gargabe Collector عندما لا يتم الرجوع إليها |
↥ العودة إلى الأعلى
JVM هو برنامج يأخذ Java bytecode ويحول رمز البايت (سطرًا بسطر) إلى رمز يمكن فهمه بواسطة الآلة. تقوم JVM بتنفيذ بعض أنواع العمليات المحددة:
تحميل الكود
التحقق من الكود
تنفيذ الكود
أنها توفر بيئة وقت التشغيل للمستخدمين
أنواع مناطق الذاكرة المخصصة بواسطة JVM:
1. Classloader : Classloader هو نظام فرعي لـ JVM يُستخدم لتحميل ملفات الفئة.
2. منطقة الفئة (الطريقة) : تقوم منطقة الفئة (الطريقة) بتخزين الهياكل لكل فئة مثل التجمع الثابت لوقت التشغيل، وبيانات الحقل والطريقة، ورمز الأساليب.
3. الكومة : هي منطقة بيانات وقت التشغيل التي يتم تخصيص الكائنات فيها.
4. المكدس : يقوم Java Stack بتخزين الإطارات. وهو يحمل المتغيرات المحلية والنتائج الجزئية، ويلعب دورًا في استدعاء الطريقة وإرجاعها. يحتوي كل خيط على مكدس JVM خاص، يتم إنشاؤه في نفس وقت إنشاء الخيط.
5. سجل عداد البرنامج : سجل الكمبيوتر (عداد البرنامج). يحتوي على عنوان تعليمات جهاز Java الظاهري الذي يتم تنفيذه حاليًا.
6. Native Method Stack : يحتوي على جميع الطرق الأصلية المستخدمة في التطبيق.
↥ العودة إلى الأعلى
يُعرف التحويل التلقائي لأنواع البيانات البدائية إلى نوع الغلاف المكافئ لها باسم "الملاكمة" وتُعرف العملية المعاكسة باسم "unboxing".
على سبيل المثال: التشغيل التلقائي
/** * Autoboxing */class BoxingExample { public static void main(String args[]) { int a = 50; عدد صحيح a2 = عدد صحيح جديد (أ)؛ // عدد صحيح للملاكمة a3 = 5; // الملاكمة System.out.println(a2 + " " + a3); } }
مثال: فتح الصندوق
/** * Unboxing */class UnboxingExample { public static void main(String args[]) { Integer i = new Integer(50); كثافة العمليات = أنا؛ System.out.println(a); } }
↥ العودة إلى الأعلى
1. عابر:
يخبر المُعدِّل العابر النظام الفرعي لتسلسل كائنات Java باستبعاد الحقل عند إجراء تسلسل لمثيل للفئة. عند إلغاء تسلسل الكائن، ستتم تهيئة الحقل إلى القيمة الافتراضية؛ أي فارغة للنوع المرجعي، وصفر أو خطأ للنوع البدائي.
مثال:
/** * عابر */ public transient int Limit = 55; // لن يستمرpublic int b; // سوف تستمر
2. متقلبة:
يخبر المُعدِّل المتطاير JVM أن الكتابة إلى الحقل يجب أن يتم دائمًا مسحها بشكل متزامن إلى الذاكرة، وأن قراءات الحقل يجب دائمًا قراءتها من الذاكرة. وهذا يعني أنه يمكن الوصول إلى الحقول التي تم وضع علامة عليها كمتقلبة بأمان وتحديثها في تطبيق متعدد الخيوط دون استخدام المزامنة الأصلية أو القياسية المستندة إلى المكتبة.
مثال:
/** * Volatile */public class MyRunnable Implements Runnable { public volatile boolean active; تشغيل الفراغ العام () {نشط = صحيح؛ بينما (نشط) { } } public void stop() { active = false; } }
↥ العودة إلى الأعلى
يسمح التأكيد باختبار صحة أي افتراضات تم إجراؤها في البرنامج. يتم تحقيق التأكيد باستخدام بيان التأكيد في Java.
أثناء تنفيذ التأكيد، يعتقد أنه صحيح. إذا فشل، فسيقوم JVM بإصدار خطأ يُسمى AssertionError
. يتم استخدامه بشكل أساسي لأغراض الاختبار أثناء التطوير.
يتم استخدام عبارة التأكيد مع تعبير منطقي ويمكن كتابتها بطريقتين مختلفتين.
// الطريقة الأولى تأكيد التعبير؛// الطريقة الثانية تأكيد التعبير 1 : Expression2;
مثال:
/** * التأكيدات */public class example { public static void main(String[] args) { int age = 14; تأكيد العمر <= 18 : "لا يمكن التصويت"؛ System.out.println("عمر الناخب هو" + العمر); } }
↥ العودة إلى الأعلى
1. المتغير النهائي:
المتغيرات النهائية ليست سوى ثوابت. لا يمكننا تغيير قيمة المتغير النهائي بمجرد تهيئته.
مثال:
/** * المتغير النهائي */class Demo { Final int MAX_VALUE = 99; باطلة myMethod() { MAX_VALUE = 101; } public static void main(String args[]) { Demo obj = new Demo(); obj.myMethod(); } }
الإخراج
استثناء في مؤشر الترابط "الرئيسي" java.lang.Error: مشكلة الترجمة التي لم يتم حلها: لا يمكن تعيين الحقل النهائي Demo.MAX_VALUE على beginersbook.com.Demo.myMethod(Details.java:6) على beginnersbook.com.Demo.main(Details.java:10)
2. المتغير النهائي الفارغ:
يُعرف المتغير النهائي الذي لم تتم تهيئته في وقت الإعلان بالمتغير النهائي الفارغ. يجب علينا تهيئة المتغير النهائي الفارغ في مُنشئ الفئة وإلا فإنه سيؤدي إلى حدوث خطأ في الترجمة (خطأ: variable MAX_VALUE might not have been initialized
).
مثال:
/** * المتغير النهائي الفارغ */class Demo { // المتغير النهائي الفارغ Final int MAX_VALUE; Demo() { // يجب تهيئته في المُنشئ MAX_VALUE = 100; } void myMethod() { System.out.println(MAX_VALUE); } public static void main(String args[]) { Demo obj = new Demo(); obj.myMethod(); } }
الإخراج
100
3. الطريقة النهائية:
لا يمكن تجاوز الطريقة النهائية. مما يعني أنه على الرغم من أن الفئة الفرعية يمكنها استدعاء الطريقة النهائية للفئة الأصلية دون أي مشكلات، إلا أنها لا تستطيع تجاوزها.
مثال:
/** * الطريقة النهائية */class XYZ { Final void demo() { System.out.println("XYZ Class Method"); } }class ABC يمتد XYZ { void demo() { System.out.println("ABC Class Method"); } public static void main(String args[]) { ABC obj = new ABC(); obj.demo(); } }
↥ العودة إلى الأعلى
إذا تم تعريف نوع أو سلسلة بدائية على أنها ثابتة وكانت القيمة معروفة في وقت الترجمة، فإن المترجم يستبدل اسم الثابت في كل مكان في الكود بقيمته. وهذا ما يسمى ثابت وقت الترجمة.
يجب أن يكون ثابت وقت الترجمة:
أعلن نهائيا
بدائية أو سلسلة
التهيئة ضمن الإعلان
تمت التهيئة بتعبير ثابت
يتم استبدالها بالقيم الفعلية في وقت الترجمة لأن المترجم يعرف قيمتها مقدمًا ويعرف أيضًا أنه لا يمكن تغييرها أثناء وقت التشغيل.
النهائي الخاص x = 10؛
↥ العودة إلى الأعلى
تساعد محددات/معدلات الوصول على تقييد نطاق فئة أو مُنشئ أو متغير أو طريقة أو عضو بيانات.
هناك أربعة أنواع من معدّلات الوصول المتوفرة في Java:
default
- لا توجد كلمة أساسية مطلوبة، عندما يتم الإعلان عن فئة أو مُنشئ أو متغير أو طريقة أو عضو بيانات دون أي محدد وصول، فإنه يكون له نطاق وصول افتراضي، أي يمكن الوصول إليه فقط داخل نفس الحزمة.
private
- عندما يتم إعلانه على أنه خاص، يكون نطاق الوصول محدودًا داخل الفئة المحيطة.
protected
- عندما يتم الإعلان عن أنه محمي، يقتصر نطاق الوصول على إحاطة الفئات والفئات الفرعية من نفس الحزمة بالإضافة إلى الحزم الأخرى.
public
- عندما يتم الإعلان عنه كعام، يمكن الوصول إليه في كل مكان في البرنامج.
... /* متغيرات أعضاء البيانات */ String firstName="Pradeep"; /* النطاق الافتراضي */ protected isValid=true; /* النطاق المحمي */ سلسلة خاصة otp="AB0392"; /* النطاق الخاص */ معرف int العام = 12334; /* النطاق العام */ ... ... /* وظائف عضو البيانات */ String getFirstName(){ return this.firstName; } /* النطاق الافتراضي */ protected boolean getStatus(){this.isValid;} /* نطاق محمي */ Private void generatorOtp(){ /* نطاق خاص */ this.otp = this.hashCode() << 16; }; public int getId(){ return this.id; } /* النطاق العام */ ... .../* الفئات الداخلية */ الفئة أ{} /* النطاق الافتراضي */ الفئة المحمية B{} /* النطاق المحمي */ الفئة الخاصة C{} /* النطاق الخاص */ الفئة العامة D{} /* النطاق العام */ ...
↥ العودة إلى الأعلى
في Java، جميع الطرق غير الثابتة هي بشكل افتراضي وظائف افتراضية . فقط الأساليب المميزة بالكلمة الأساسية final
، والتي لا يمكن تجاوزها، بالإضافة إلى private methods
، غير الموروثة، هي غير افتراضية.
مثال: وظيفة افتراضية مع واجهة
/** * الوظيفة ApplyBrakes () افتراضية لأن * الوظائف في الواجهات مصممة ليتم تجاوزها. **/واجهة دراجة { void ApplyBrakes(); }class ACMEBicycle Implements Bicycle { public void ApplyBrakes() { // هنا نطبق applicationBrakes() System.out.println("تم تطبيق الفرامل"); // وظيفة } }
↥ العودة إلى الأعلى
الطريقة الأصلية هي طريقة Java (إما طريقة مثيل أو طريقة فئة) والتي تتم كتابة تنفيذها أيضًا بلغة برمجة أخرى مثل C/C++. علاوة على ذلك، فإن الطريقة التي تم وضع علامة عليها على أنها أصلية لا يمكن أن تحتوي على نص ويجب أن تنتهي بفاصلة منقوطة:
جافا الرئيسية:
public class Main { public original int intMethod(int i); public static void main(String[] args) { System.loadLibrary("Main"); System.out.println(new Main().intMethod(2)); } }
الرئيسية.ج:
#include <jni.h>#include "Main.h"JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) { return i * i; }
تجميع وتشغيل:
javac Main.javajavah -jni Maingcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Main.cjava -Djava.library.path=. رئيسي
الإخراج
4
↥ العودة إلى الأعلى
إذا تم تعريف الطريقة على أنها ثابتة، فهي عضو في فئة وليست تنتمي إلى كائن الفئة. يمكن استدعاؤه دون إنشاء كائن من الفئة. تتمتع الطريقة الثابتة أيضًا بالقدرة على الوصول إلى البيانات الثابتة لأعضاء الفصل.
هناك بعض القيود المفروضة على الطريقة الثابتة
لا يمكن للطريقة الثابتة استخدام عضو بيانات غير ثابت أو استدعاء طريقة غير ثابتة مباشرة.
لا يمكن استخدام this
و super
في سياق ثابت.
يمكن للطريقة الثابتة الوصول إلى بيانات النوع الثابت فقط (متغير مثيل النوع الثابت).
ليست هناك حاجة لإنشاء كائن من الفئة لاستدعاء الطريقة الثابتة.
لا يمكن تجاوز الطريقة الثابتة في فئة فرعية
مثال:
/** * الطرق الثابتة */class Parent { static void Display() { System.out.println("Super class"); } }مثال للفئة العامة يمتد الأصل { عرض الفراغ () // محاولة تجاوز العرض () { System.out.println("فئة فرعية"); } public static void main(String[] args) { الكائن الأصلي = مثال جديد ()؛ obj.display(); } }
يؤدي هذا إلى إنشاء خطأ في وقت الترجمة. الإخراج هو كما يلي -
example.java:10: خطأ: لا يمكن للعرض () في المثال تجاوز العرض () في عرض Parentvoid () // محاولة تجاوز العرض () ^ الطريقة التي تم تجاوزها هي خطأ ثابت 1
↥ العودة إلى الأعلى
ما هو هيكل وميزات استخدام تعبير لامدا؟ لامدا عبارة عن مجموعة من التعليمات التي يمكن فصلها إلى متغير منفصل ثم استدعاؤها بشكل متكرر في أماكن مختلفة من البرنامج.
أساس تعبير لامدا هو عامل تشغيل لامدا ، الذي يمثل السهم ->
. يقسم هذا العامل تعبير لامدا إلى جزأين: يحتوي الجانب الأيسر على قائمة بمعلمات التعبير، ويمثل الجانب الأيمن في الواقع نص تعبير لامدا، حيث يتم تنفيذ جميع الإجراءات.
لا يتم تنفيذ تعبير لامدا من تلقاء نفسه، ولكنه يشكل تنفيذ الطريقة المحددة في الواجهة الوظيفية. من المهم أن تحتوي الواجهة الوظيفية على طريقة واحدة فقط دون تنفيذ.
واجهة قابلة للتشغيل {int احسب (int x , int y ); }public static void main ( String [] args) { عملية قابلة للتشغيل = (x, y) - > x + y; نتيجة int = العملية. حساب ( 10 , 20 ); System.out.println (نتيجة)؛ // 30 }
في الواقع، تعبيرات لامدا هي بطريقة ما شكل مختصر من الفئات الداخلية المجهولة التي كانت تستخدم سابقًا في Java.
تعبيرات لامدا للتنفيذ المؤجل - يتم تعريفها مرة واحدة في مكان واحد من البرنامج، ويتم استدعاؤها إذا لزم الأمر، لأي عدد من المرات وفي أي مكان من البرنامج.
يجب أن تتوافق معلمات تعبير لامدا من حيث النوع مع معلمات طريقة الواجهة الوظيفية:
العملية = ( int x, int y) - > x + y;// عند كتابة تعبير لامدا نفسه، يُسمح بعدم تحديد نوع المعلمة: (x, y) - > x + y;// إذا كانت الطريقة لا يقبل أي معلمات، ثم تتم كتابة الأقواس الفارغة، على سبيل المثال: () - > 30 + 20 ;// إذا كانت الطريقة تقبل معلمة واحدة فقط، فيمكن حذف الأقواس: n - > n * n;
ليس مطلوبًا من تعبيرات lambda اللاحقة إرجاع أي قيمة.
واجهة قابلة للطباعة {طباعة باطلة (سلسلة s)؛ } public static void main ( String [] args) { الطابعة القابلة للطباعة = s -> System.out.println(s); print.print("مرحبا بالعالم"); }// _ كتلة لامدا - التعبيرات_ محاطة بأقواس متعرجة . يمكن استخدام تعبيرات لامدا المعيارية داخل الكتل المتداخلة، والحلقات، وتصميم عبارة if، وإنشاء المتغيرات، وما إلى ذلك. د. إذا قمت بحظر تعبير lambda - فيجب أن يُرجع قيمة، فإنه يطبق بشكل صريح "بيان إرجاع البيان": عملية قابلة للتشغيل = ( int x, int y) - > { إذا (ص == 0) {إرجاع 0؛ } آخر { العودة س / ص؛ } };
تمرير تعبير لامدا كمعلمة أسلوب
حالة الواجهة {منطقية مناسبة (int n)؛ }مجموع int ثابت خاص (أرقام int []، حالة الشرط) { نتيجة int = 0 ؛ for (int i : number) { if (condition.isAppropriate(i)) { result + = i; } } إرجاع النتيجة؛ }public static void main ( String [] args) { System.out.println(sum ( new int [] { 0 , 1 , 0 , 3 , 0 , 5 , 0 , 7 , 0 , 9 }, (n) - > ن ! = 0 )); }
↥ العودة إلى الأعلى
الوصول إلى متغيرات النطاق الخارجي من تعبير لامدا يشبه إلى حد كبير الوصول من كائنات مجهولة.
متغيرات محلية غير قابلة للتغيير (نهائية فعليًا - لا يتم وضع علامة عليها بالضرورة على أنها نهائية)؛
حقول الطبقة
المتغيرات الثابتة.
لا يُسمح بالوصول إلى الطرق الافتراضية للواجهة الوظيفية المنفذة داخل تعبير لامدا.
↥ العودة إلى الأعلى
إذا كانت الطريقة الموجودة في الفصل تقوم بالفعل بكل ما هو ضروري، فيمكنك استخدام الآلية المرجعية للطريقة (مرجع الطريقة) لتمرير هذه الطريقة مباشرة. ستكون النتيجة هي نفسها تمامًا كما في حالة تحديد تعبير لامدا الذي يستدعي هذه الطريقة.
مثال:
واجهة خاصة قابلة للقياس { public int length(String string); }public static void main ( String [] args) { Measurable a = String::length; System.out.println(a. length("abc")); }
من المحتمل أن تكون مراجع الطريقة أكثر كفاءة من استخدام تعبيرات لامدا. بالإضافة إلى ذلك، فإنها تزود المترجم بمعلومات أفضل حول النوع، وإذا كان بإمكانك الاختيار بين استخدام مرجع إلى طريقة موجودة واستخدام تعبير لامدا، فيجب عليك دائمًا استخدام مرجع الطريقة.
↥ العودة إلى الأعلى
على الطريقة الثابتة.
لكل طريقة المثيل؛
إلى المنشئ.
↥ العودة إلى الأعلى
يمكن للفئة الداخلية المتداخلة الوصول إلى أي متغير مثيل خاص للفئة الخارجية. مثل أي متغير مثيل آخر، يمكننا الحصول على معدل الوصول الخاص والمحمي والعامة والمعدل الافتراضي.
مثال:
/** * الفئة الداخلية */ الفئة الخارجية { الطبقة الداخلية { عرض الفراغ العام () { System.out.println("في طريقة فئة متداخلة"); } } } الطبقة الرئيسية { public static void main(String[] args) { Outer.Inner in = new Outer().new Inner(); in.show(); } }
الفئة الفرعية هي فئة ترث طريقة أو أساليب من فئة فائقة.
مثال:
/** * الفئة الفرعية */class Car { //...} فئة HybridCar تمتد السيارة { //...}
↥ العودة إلى الأعلى
1. تحميل الفئة الثابتة:
يُعرف إنشاء الكائنات والمثيلات باستخدام كلمة رئيسية new
باسم تحميل الفئة الثابتة. يتم استرجاع تعريف الفئة وإنشاء مثيل للكائن في وقت الترجمة.
مثال:
/** * تحميل الفئة الثابتة */class TestClass { public static void main(String args[]) { TestClass tc = new TestClass(); } }
2. تحميل الفئة الديناميكية:
تستخدم الفئات المحملة أسلوب Class.forName()
. يتم تحميل الفئة الديناميكية عندما لا يكون اسم الفئة معروفًا في وقت الترجمة.
مثال:
/** * التحميل الديناميكي للفئة */Class.forName (String className);
↥ العودة إلى الأعلى
1. فئة وقت التشغيل:
فئة java.lang.Runtime هي فئة فرعية من فئة الكائن، وتوفر الوصول إلى نظام وقت تشغيل Java. معلومات وقت التشغيل مثل توفر الذاكرة، واستدعاء أداة تجميع البيانات المهملة، وما إلى ذلك.
مثال:
/** * فئة وقت التشغيل */public class RuntimeTest { static class الرسالة تمتد الموضوع { public void run() { System.out.println("Exit"); } } public static void main(String[] args) { حاول { Runtime.getRuntime().addShutdownHook(new message()); System.out.println("بدأ البرنامج..."); System.out.println("انتظر لمدة 5 ثوان..."); Thread.sleep(5000); System.out.println("انتهى البرنامج..."); } Catch (Exception e) { e.printStackTrace(); } } }
2. فئة النظام:
الغرض من فئة النظام هو توفير الوصول إلى موارد النظام. أنه يحتوي على إمكانية الوصول إلى المدخلات القياسية ، وإخراج Standart ، ودارات إخراج الخطأ ، والوقت الحالي في Millis ، وإنهاء التطبيق ، إلخ.
↥ العودة إلى الأعلى
1. استخدام كلمة رئيسية جديدة:
myobject object = new myobject () ؛
2. باستخدام class.forname ():
myobject object = (myObject) class.forname ("subin.rnd.MyObject"). newinstance () ؛
3. باستخدام clone ():
myObject OtherObject = new myObject () ؛ myobject object = (myObject) otheroBject.clone () ؛
4. استخدام هجر الكائن:
ObjectInputStream instream = new ObjectInputStream (aninputStream) ؛ myobject object = (myObject) instream.ReadObject () ؛
↥ العودة إلى الأعلى
الكائنات غير القابلة للتغيير هي كائنات لا تتغير. يجب أن يكون جافا غير قابل للتغيير أن يكون جميع حقوله الداخلية ، الحقول النهائية الخاصة. يجب ألا تنفذ أي مستوطنين. يحتاج إلى مُنشئ يأخذ قيمة لكل حقل.
إنشاء كائن ثابت:
لا تضيف أي طريقة setter
أعلن جميع الحقول النهائية والخاصة
إذا كان الحقل هو كائن قابل للتغيير ، قم بإنشاء نسخ دفاعية منه لطرق getter
إذا تم تخصيص كائن قابل للتغيير إلى المُنشئ إلى حقل ، قم بإنشاء نسخة دفاعية منه
لا تسمح للفئات الفرعية بتجاوز الأساليب.
/** * كائن ثابت */فئة عامة DateContainer {تاريخ التاريخ النهائي الخاص ؛ DateContainer () {this.date = new Date () ؛ } التاريخ العام getDate () {return new Date (date.getTime ()) ؛ } }
↥ العودة إلى الأعلى
تعني الفئة غير القابلة للتغيير أنه بمجرد إنشاء كائن ، لا يمكننا تغيير محتواه. في Java ، فإن جميع فئات الغلاف (مثل عدد صحيح ، Boolean ، Byte ، Short) وفئة السلسلة غير قابلة للتغيير.
قواعد لإنشاء فصول ثابتة:
يجب إعلان الفصل كنهائي
يجب الإعلان عن أعضاء البيانات في الفصل على أنه نهائي
مُنشئ المعلمة
طريقة getter لجميع المتغيرات فيه
لا مستوطنات
/** * فئة غير قابلة للتغيير */موظف الفئة النهائية العامة {Final String PancardNumber ؛ الموظف العام (سلسلة pancardNumber) {this.pancardNumber = pancardNumber ؛ } السلسلة العامة getPancardNumber () {return pancardNumber ؛ } }
↥ العودة إلى الأعلى
Bootstrap classloader هو مسؤول لتحميل ملفات فصول JDK القياسية من RT.JAR وهو الوالد لجميع اللوادر الفئة في Java. هناك ثلاثة أنواع من صناديق الفصل المدمجة في جافا:
1.
2. loader فئة الامتدادات: يقوم بتحميل الفئات من دليل Extensions JDK ، وعادة ما يكون $ Java_home/lib/ext.
3. محمل فئة النظام: يقوم بتحميل الفئات من ClassPath الحالية التي يمكن تعيينها أثناء استدعاء برنامج باستخدام خيارات سطر الأوامر -CP أو -ClassPath.
/** * classloader */import java.util.logging.level ؛ import java.util.logging.logger ؛ public classloadertest {public static void main (String args []) .out.println ("classLoader:" + classLoaderTest.class.getClassLoader ()) ؛ // في محاولة لتحميل هذه الفئة بشكل صريح باستخدام فئة الامتداد class.forname ("صريح تحميل فئة" ، صحيح ، classLoaderTest.class.getClassloader (). getParent ()) ؛ } catch (classnotfoundException ex) {logger.getLogger (classLoaderTest.class.getName ()). log (level.severe ، null ، ex) ؛ } } }
↥ العودة إلى الأعلى
طرق مختلفة لإنشاء كائن في جافا
باستخدام كلمة رئيسية جديدة:
كائن الفئة ObjectCreationExample {string owner ؛ } الفئة العامة mainclass {public static void main (string [] args) {// هنا نقوم بإنشاء كائن من JBT باستخدام new wordrofjectcreationexample obj = new ObjectCreationExample () ؛ } }
باستخدام مثيل جديد (انعكاس)
class createObjectClass {static int j = 10 ؛ createObjectClass () {i = j ++ ؛ } int i ؛ OverRidepublic String ToString () {return "قيمة i:" + i ؛ } } class mainclass {public static void main (string [] args) {try {class cls = class.forname ("createObjectClass") ؛ createObjectClass obj = (createObjectClass) cls.newinstance () ؛ createObjectClass obj1 = (createObjectClass) cls.newinstance () ؛ system.out.println (obj) ؛ system.out.println (OBJ1) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ } catch (InstantiationException e) {e.printStackTrace () ؛ } catch (alfictAccessException e) {e.printStackTrace () ؛ } } }
باستخدام استنساخ:
class createObjectWithClone تنفذ clone {OverRideProtected Object Clone () clonenotsupportedException {return super.clone () ؛ } int i ؛ static int j = 10 ؛ createObjectWithClone () {i = j ++ ؛ } Overridepublic String ToString () {return "قيمة i:" + i ؛ } } class mainclass {public static void main (string [] args) {createObjectWithClone OBJ1 = جديد createObjectWithClone () ؛ system.out.println (obj1) ؛ حاول {createObjectWithClone obj2 = (createObjectWithClone) obj1.clone () ؛ system.out. println (OBJ2) ؛ } catch (clonenotsupportedException e) {E.PrintStackTrace () ؛ } } }
باستخدام classloader
class createObjectWithClassLoader {static int j = 10 ؛ createObjectWithClassLoader () {i = j ++ ؛ } int i ؛ OverRidepublic String ToString () {return "قيمة i:" + i ؛ } } الفئة العامة mainclass {public static void main (string [] args) {createObjectWithClassLoader obj = null ؛ try {obj = (createObjectWithClassLoader) new MainClass (). getClass () .getClassLoader (). loadClass ("createObjectWithClassLoader"). newinstance () ؛ // يجب استخدام اسم className المؤهل بالكامل. } catch (InstantiationException e) {e.printStackTrace () ؛ } catch (alfictAccessException e) {e.printStackTrace () ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ } system.out.println (OBJ) ؛ } }
↥ العودة إلى الأعلى
فئة الكائن هي الفئة الأصل لجميع الفئات في Java افتراضيًا.
طريقة | وصف |
---|---|
الفصل النهائي العام getClass () | إرجاع كائن الفئة من هذا الكائن. يمكن استخدام الفصل الدراسي أيضًا للحصول على بيانات تعريف هذه الفئة. |
Hashcode int العام () | إرجاع رقم Hashcode لهذا الكائن. |
منطقية عامة متساوية (كائن OBJ) | يقارن الكائن المعطى بهذا الكائن. |
استنساخ الكائن المحمي () يلقي clonenotsupportedException | ينشئ وإرجاع النسخة الدقيقة (استنساخ) لهذا الكائن. |
السلسلة العامة tostring () | إرجاع تمثيل السلسلة لهذا الكائن. |
الفراغ النهائي العام الإخطار () | يستيقظ مؤشر ترابط واحد ، في انتظار شاشة هذا الكائن. |
الفراغ النهائي العام الإخطار () | يستيقظ جميع المواضيع ، في انتظار شاشة هذا الكائن. |
الفراغ النهائي العام Wait (arg timeout) رميات المقاطعات | يؤدي إلى انتظار مؤشر الترابط الحالي للمللي ثانية المحددة ، حتى يخطر مؤشر ترابط آخر (يستدعي طريقة الإخطار () أو الإخطار ()). |
الفراغ النهائي العام Wait (timeout ، int nanos) يلقي مقاطعات | يتسبب في انتظار الخيط الحالي للمللي ثانية المحددة والنيانو ثانية ، حتى يخطر موضوع آخر (يستدعي طريقة الإخطار () أو الإخطار ()). |
رميات الفراغ النهائي النهائي () رميات المقاطعات | يؤدي إلى انتظار مؤشر الترابط الحالي ، حتى يتم إخطار مؤشر ترابط آخر (يستدعي طريقة الإخطار () أو الإخطار ()). |
اللمسات الأخيرة المحمية باطلة الفراغ () رمي رمي | يتم استدعاؤه من قبل جامع القمامة قبل أن يتم جمع القمامة. |
↥ العودة إلى الأعلى
القيمة Optional
هي حاوية لكائن قد يحتوي أو لا يحتوي على قيمة null
. مثل هذا الغلاف وسيلة مريحة للوقاية