مقدمة
في Java ، يجب تهيئة كائن بشكل صحيح قبل استخدامه ، والتي يتم تنصاؤها بواسطة مواصفات Java.
التهيئة التلقائية (الافتراضي)
سيتم تهيئة جميع أعضاء البيانات الأساسية في الفصل. قم بتشغيل المثال التالي لعرض هذه القيم الافتراضية:
الفئة الافتراضية {boolean t ؛ شار ج. بايت ب ؛ قصيرة S ؛ int أنا ؛ طويل ل ؛ تعويم و ؛ مزدوج د. public void show () {system.out.println ("قيمة تهيئة النوع الأساسية/n" + "boolean <----->" + t + "/n" + "char <------>" + c + "/n" + "byte <------->" + b + "/n" + "قصيرة <------>" + s + "/" + " l + "/n" + "float <------>" + f + "/n" + "double <----->" + d + "/n") ؛ }} الفئة العامة initvalue {public static void main (string [] args) {default d = new default () ؛ D.Show () ؛ }}نتائج التشغيل】:
قيمة تهيئة النوع الأساسي
منطقية <-----> كاذبة
شار <----->
بايت <-----> 0
قصير <-----> 0
int <-----> 0
طويل <-----> 0
تعويم <-----> 0.0
مزدوج <-----> 0.0
حيث ، القيمة الافتراضية لنوع char فارغة.
بالنسبة لأنواع البيانات غير المحددة ، تتم تهيئة مقبض الكائن أيضًا:
الفئة شخص {اسم السلسلة الخاصة ؛ // setter} class default {person p ؛ show public void show () {system.out.println ("person <---->" + p) ؛ }} الفئة العامة initvalue {public static void main (string [] args) {default d = new default () ؛ D.Show () ؛ }}نتائج التشغيل】:
شخص <-----> فارغ
يمكن ملاحظة أن قيمة تهيئة المقبض خالية. هذا يعني أنه إذا تم استدعاء طريقة مشابهة لـ p.setName دون تحديد قيمة التهيئة لـ P ، فسيحدث استثناء.
تهيئة اللوائح
إذا كنت بحاجة إلى تعيين قيمة أولية لمتغير بنفسك ، فيمكنك تعيين قيمة أثناء تحديد المتغير.
الفئة الافتراضية {boolean t = true ؛ char c = 'a' ؛ البايت ب = 47 ؛ قصيرة s = 0xff ؛ int i = 24 ؛ Long L = 999 ؛ تعويم f = 1.2f ؛ Double D = 1.732 ؛ show public void show () {system.out.println ("boolean <----->" + t + "/n" + "char <------>" + c + "/n" + "byte <------>" + b + "/n" + "Short <------>" + s + "/n "float <------>" + f + "/n" + "double <------>" + d + "/n") ؛ }} الفئة العامة initvalue {public static void main (string [] args) {default d = new default () ؛ D.Show () ؛ }}يمكن تهيئته بطريقة واحدة ؛
شخص الفئة {int i = set () ؛ // ...}يمكن أن تستخدم هذه الطرق أيضًا متغيرات مستقلة:
شخص فئة {int i ؛ int j = set (i) ؛ // ...} تهيئة البناء
ميزة تهيئة البناء هي أنه يمكن تحديد قيمة التهيئة أثناء وقت التشغيل. على سبيل المثال:
فئة الشخص {int age ؛ person () {Age = 89 ؛ }}سيتم تهيئة العمر أولاً إلى 0 ثم يصبح 89. هذا صحيح لجميع الأنواع الأساسية وكذلك المقابض للكائنات.
أمر التهيئة
في الفصل ، يتم تحديد ترتيب التهيئة بالترتيب الذي يتم به تعريف المتغيرات داخل الفصل. حتى إذا كانت التعريفات المتغيرة تنتشر إلى حد كبير عبر منتصف تعريف الطريقة ، فسيظل المتغير تهيئة قبل استدعاء أي طريقة (بما في ذلك المُنشئ). على سبيل المثال:
class pet {pet (int age) {system.out.println ("pet (" + age + ")") ؛ }} class person {pet t1 = new pet (1) ؛ person () {system.out.println ("--- person () ---") ؛ T3 = حيوان أليف جديد (33) ؛ } PET T2 = حيوان أليف جديد (2) ؛ void show () {system.out.println ("show ----- Running") ؛ } pet t3 = new pet (3) ؛} orderofinitialization {public static void main (string [] args) {person p = new person () ؛ P.Show () ؛ }}نتائج التشغيل】:
حيوان أليف (1)
حيوان أليف (2)
حيوان أليف (3)
--شخص()---
حيوان أليف (33) <br/>
عرض ----- الجري
في المثال أعلاه ، على الرغم من أن تعريفات T1 و T2 و T3 هي في جميع أنحاء الفصل ، يتم تحديد ترتيب التهيئة حسب ترتيب تعريف T1 و T2 و T3 (تغيير T1 و T2 و T3 من قبل نفسك لرؤية النتيجة) ، وتأخذ التهيئة الأسبقية على تنفيذ البناء. عندما يتم استدعاء منشئ الشخص ، يتم إعادة صياغة T3.
تهيئة البيانات الثابتة
إذا كانت البيانات ثابتة ، فسيتم تنفيذ نفس العملية. إذا كان نوعًا بدائيًا ولم يتم تهيئته ، فسيحصل تلقائيًا على القيمة الأولية لنوعها البدائية ؛ إذا كان مقبضًا لكائن ، فسوف يحصل على قيمة فارغة ما لم يتم إنشاء كائن وتوصيله به. إذا تم تهيئتها في وقت التعريف ، فإن الطريقة التي يتم التقاطها تختلف عن القيمة غير المنتظمة ، لأن الثابتة تحتوي فقط على مساحة تخزين واحدة. على سبيل المثال:
Class Bowl {Bowl (int marker) {system.out.println ("Bowl (" + marker + ")") ؛ } void f (int marker) {system.out.println ("f (" + marker + ")") ؛ }} جدول الفئة {Static Bowl B1 = New Bowl (1) ؛ table () {system.out.println ("table ()") ؛ b2.f (1) ؛ } void f2 (int marker) {system.out.println ("f2 (" + marker + ")") ؛ } وعاء ثابت B2 = وعاء جديد (2) ؛} فئة الخزانة {Bowl B3 = New Bowl (3) ؛ وعاء ثابت B4 = وعاء جديد (4) ؛ cupboard () {system.out.println ("cupboard ()") ؛ B4.F (2) ؛ } void f3 (int marker) {system.out.println ("f3 (" + marker + ")") ؛ } صحن ثابت B5 = New Bowl (5) ؛} staticinitialization {public static void main (string [] args) {system.out.println ("إنشاء خزانة جديدة () في الرئيسية") ؛ خزانة جديدة () ؛ System.out.println ("إنشاء خزانة جديدة () في الرئيسية") ؛ خزانة جديدة () ؛ T2.f2 (1) ؛ T3.f3 (1) ؛ } جدول ثابت T2 = جدول جديد () ؛ خزانة ثابتة T3 = خزانة جديدة () ؛}نتائج التشغيل】:
وعاء (1)
وعاء (2)
طاولة()
F (1)
وعاء (4)
وعاء (5)
وعاء (3)
خزانة()
F (2)
إنشاء خزانة جديدة () بشكل رئيسي
وعاء (3)
خزانة()
F (2)
إنشاء خزانة جديدة () بشكل رئيسي
وعاء (3)
خزانة()
F (2)
F2 (1)
F3 (1)
كتل الرمز الثابت
يسمح Java بتقسيم أعمال التهيئة الثابتة الأخرى إلى كتلة رمز خاصة في الفصل. كتلة الرمز هذه في شكل كلمة رئيسية ثابتة تليها هيئة طريقة ، تسمى كتلة رمز ثابت. يتم تنفيذ كتلة رمز ثابت فقط عندما يتم إنشاء كائن تلك الفئة لأول مرة أو يتم الوصول إلى العضو الثابت الذي ينتمي إلى تلك الفئة لأول مرة. على سبيل المثال:
class person {person (int age) {system.out.println ("person (" + age + ")") ؛ } void f (int age) {system.out.println ("f (" + age + ")") ؛ }} class persons {static person p1 ؛ شخص ثابت p2 ؛ ثابت {p1 = شخص جديد (1) ؛ p2 = شخص جديد (2) ؛ } persons () {system.out.println ("persons ()") ؛ }} الفئة العامة ExplicitStatic {public static void main (string [] args) {system.out.println ("Inside Main ()") ؛ persons.p1.f (18) ؛ // 1} الأشخاص الثابتون x = الأشخاص الجدد () ؛ // 2 أشخاص ثابتون y = أشخاص جدد () ؛ // 2}عند الوصول إلى كائن ثابت P1 في سطر تم وضع علامة 1 ، أو إذا تم التعليق على السطر 1 ولم يتم التعليق على السطر 2 ، فسيتم تشغيل وحدة التهيئة الثابتة للأشخاص. إذا تم التعليق على كل من 1 و 2 ، فلن يتم تنفيذ كتلة الكود الثابت المستخدمة للأشخاص.
ترتيب الخصائص الثابتة وتنفيذ كتلة الرمز الثابت
class person {person (int age) {system.out.println ("person ("+age+")") ؛ }} class persons {static person p = new شخص (2) ؛ // 1 ثابت {p = شخص جديد (3) ؛ } الشخص الثابت p = شخص جديد (2) ؛ // 2} الفئة العامة compstaticinit {public static void main (string [] args) {} static persons x = new Persons () ؛}وفقًا لتحليل نتائج التعليق التوضيحي 1 الاحتفاظ 2 والشرح 2 الاحتفاظ 1 ، يمكن ملاحظة أن ترتيب تنفيذ الخصائص الثابتة وكتل الرمز الثابت يعتمد على ترتيب الترميز. سيتم تنفيذ كل من هو في المقدمة أولاً.
تهيئة الخصائص غير الستراتية
Class Animal {Animal (int Age) {system.out.println ("Animal (" + Age + ")") ؛ } void f (int age) {system.out.println ("f (" + age + ")") ؛ }} الفئة العامة notstaticinit {Animal A1 ؛ حيوان A2 ؛ {A1 = New Animal (1) ؛ A2 = حيوان جديد (2) ؛ System.out.println ("A1 & A2 تهيئة") ؛ } notstaticinit () {system.out.println ("notstaticinit") ؛ } public static void main (string [] args) {system.out.println ("inside main ()") ؛ notstaticinit x = new notstaticinit () ؛ }}على غرار كتل التعليمات البرمجية الثابتة ، يعتمد ترتيب التهيئة للكود المجهول مع الخصائص غير القائمة على ترتيب الترميز .
عملية تهيئة الكائن الموروثة
حشرة الفئة {int i = 1 ؛ int j ؛ insect () {prt ("i =" + i + "، j =" + j) ؛ J = 2 ؛ } static int x1 = prt ("static insect.x1 تهيئة") ؛ static int prt (string s) {system.out.println (s) ؛ العودة 3 ؛ }} Public Class Beetle يمتد الحشرات {int k = prt ("beeklt.k تهيئة") ؛ Beetle () {prt ("k =" + k) ؛ prt ("j =" + j) ؛ } static int x2 = prt ("static bootle.x2 تهيئة") ؛ static int prt (string s) {system.out.println (s) ؛ العودة 4 ؛ } public static void main (string [] args) {prt ("Beetle Constructor") ؛ Beetle B = New Beetle () ؛ }}نتائج التشغيل】:
حشرة ثابتة. x1 تهيئة
static bootle.x2 تهيئة
مُنشئ الخنفساء
i = 1 ، j = 0
BEEKLT.K تهيئة
ك = 4
J = 2
أول ما يحدث عند تشغيل Java على Beetle هو المحمل للعثور على تلك الفئة في الخارج. أثناء عملية التحميل ، يكتشف المحمل فئة أساسية ، بحيث يتم تحميله وفقًا لذلك. سيتم تنفيذ هذه العملية بغض النظر عما إذا تم إنشاء كائن الفئة الأساسية أم لا. إذا كانت الفئة الأساسية تحتوي على فئة أساسية أخرى ، فسيتم تحميل فئة أساسية أخرى ، وما إلى ذلك. بعد ذلك ، قم بإجراء تهيئة ثابتة في فئة قاعدة الجذر ، ثم تنفذ في الفئة المشتقة التالية ، وهلم جرا. وذلك لأن تهيئة الفئة المشتقة قد تعتمد على تهيئة أعضاء الفصل الأساسي.
عند تحميل جميع الفئات ، يمكن إنشاء الكائنات. أولاً ، يتم تعيين جميع أنواع البيانات الأساسية في هذا الكائن على قيمها الافتراضية ويتم تعيين مقبض الكائن على NULL. ثم تنفيذ منشئ الفئة الأساسية. يتم تنفيذ هذا الموقف تلقائيًا ( super(), ويمكن أيضًا تحديد منشئ الفئة الأساسية من خلال Super). بعد اكتمال منشئ الفئة الأساسية ، سيتم تهيئة متغيرات مثيل الفئة المشتقة في ترتيبها الأصلي ، وسيتم تنفيذ أجزاء الجسم المتبقية من المنشئ.
لخص عملية إنشاء الكائن:
يتم تنفيذ التنفيذ الثابت فقط عند تحميل الفصل ومرة واحدة فقط ؛
لا يتم تنفيذ غير متطابق إلا عند إنشاء مثيله ، ويتم تنفيذه في كل مرة يتم فيها إنشاء كائن ؛
يتم تنفيذ التنفيذ الثابت قبل عدم استغلال ، ويسبق الفئة الثابتة التنفيذ الثابت على الطبقات المشتقة ؛
تعتمد خصائص التنفيذ للخصائص الثابتة وكتل الرموز الثابتة على موقعها في الفصل ، ومن ينفذها أولاً ؛
يعتمد ترتيب التنفيذ للخصائص غير المنتظمة وكتل المنشئ على موقعها في الفصل ومن ينفذها.
لخص
من خلال المقدمة أعلاه ، لدينا فهم لعدة طرق لتهيئة الكائنات في Java وكيفية تنفيذ رمز التهيئة ، وكذلك تقديم المواقف التي قد نستخدم المتغيرات غير المعروفة. بعد الحصول على فهم مفصل لهذه القضايا ، يمكنك تجنب بعض المخاطر في الترميز لضمان تهيئة كائن تمامًا قبل أن يصبح مرئيًا.