سؤال

ما هو الفرق الرئيسي بين الطبقة الداخلية و ثابت متداخلة الدرجة في جافا ؟ لا تصميم / تنفيذ تلعب دورا في اختيار واحدة من هذه ؟

هل كانت مفيدة؟

المحلول

من جافا البرنامج التعليمي:

الطبقات المتداخلة تنقسم إلى فئتين:ثابتة وغير ثابتة.الطبقات المتداخلة التي أعلن ثابتة تسمى ببساطة ثابت الطبقات المتداخلة.غير ثابت الطبقات المتداخلة تسمى الطبقات الداخلية.

ثابت الطبقات المتداخلة يتم الوصول إليها باستخدام أرفق اسم الفئة:

OuterClass.StaticNestedClass

على سبيل المثال ، إنشاء كائن ثابت متداخلة الدرجة استخدم بناء الجملة التالي:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

الكائنات الحالات التي هي من فئة الداخلية موجودة داخل مثيل من الطبقة الخارجية.النظر في الفئات التالية:

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

مثيل InnerClass يمكن أن توجد إلا داخل مثيل OuterClass والوصول المباشر إلى أساليب ومجالات عملها أرفق سبيل المثال.

إنشاء مثيل فئة الداخلية ، يجب عليك أولا إنشاء مثيل فئة الخارجي.ثم إنشاء الكائن الداخلي داخل الكائن الخارجي مع هذه الجملة:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

انظر: جافا البرنامج التعليمي - الطبقات المتداخلة

للتأكد من اكتمالها ملاحظة أن هناك أيضا شيء من هذا القبيل الطبقة الداخلية دون وهو أرفق سبيل المثال:

class A {
  int t() { return 1; }
  static A a =  new A() { int t() { return 2; } };
}

هنا ، new A() { ... } هو الطبقة الداخلية تعريفه في سياق ثابت ولا يكون أرفق سبيل المثال.

نصائح أخرى

على جافا البرنامج التعليمي يقول:

المصطلحات:تداخل الطبقات تقسيمها إلى فئتين:ثابت و غير ثابت.الطبقات المتداخلة التي وأعلن ثابتة تسمى ببساطة ثابت الطبقات المتداخلة.غير ثابت متداخلة تسمى الفصول الدراسية الداخلية فصول.

في لغة مشتركة ، حيث "متداخلة" و "الداخلية" تستخدم بالتبادل من قبل معظم المبرمجين, ولكن سوف استخدام المصطلح الصحيح "متداخلة فئة" الذي يغطي الداخلية والخارجية على حد سواء ثابتة.

الطبقات يمكن أن تكون متداخلة بلا نهاية, مثلافئة يمكن أن تحتوي الفئة B والتي تحتوي على فئة C الذي يحتوي على الفئة D ، إلخ.بيد أن أكثر من مستوى واحد من فئة التعشيش نادرة ، كما هو عادة سيئة التصميم.

هناك ثلاثة أسباب قد خلق فئة متداخلة:

  • المنظمة:في بعض الأحيان يبدو الأكثر منطقية إلى نوع الطبقة إلى مساحة من فئة أخرى ، وخصوصا عندما لا تستخدم في أي سياق
  • الوصول:الطبقات المتداخلة خاصة الوصول إلى المتغيرات/مجالات تشمل الطبقات (على وجه التحديد والتي المتغيرات/حقول يعتمد على نوع متداخلة الدرجة ، سواء الداخلية أو ثابت).
  • الراحة:الحاجة إلى إنشاء ملف جديد لكل نوع جديد هو مزعج ، مرة أخرى ، وخصوصا عندما اكتب لن تستخدم إلا في سياق واحد

هناك أربعة أنواع متداخلة الدرجة في جافا.باختصار هم:

  • ثابت الدرجة:كما أعلن عضو ثابت من فئة أخرى
  • الطبقة الداخلية:أعلن مثيل الأعضاء من فئة أخرى
  • الطبقة الداخلية المحلية:وأعلن داخل أسلوب مثيل من فئة أخرى
  • الطبقة الداخلية من مجهول:مثل الطبقة الداخلية المحلية ، ولكن كما هو مكتوب التعبير الذي يعود لمرة واحدة الكائن

اسمحوا لي أن أوضح في مزيد من التفاصيل.


فئات ثابتة

ثابت الطبقات أسهل نوع لفهم لأنها لا علاقة لها مثيلات تحتوي الطبقة.

فئة ثابتة هي فئة كما أعلن عضو ثابت من فئة أخرى.تماما مثل غيرها من أعضاء ثابتة, هذه الفئة هي في الحقيقة مجرد شماعات على أن يستخدم تحتوي الطبقة كما في مساحة الاسم ، على سبيل المثال الطبقة الماعز كما أعلن عضو ثابت من الدرجة وحيد القرن في الحزمة البيتزا ومن المعروف من قبل باسم البيتزا.وحيد القرن.الماعز.

package pizza;

public class Rhino {

    ...

    public static class Goat {
        ...
    }
}

بصراحة ثابت دروس جميلة لا قيمة لها ميزة لأن الطبقات هي بالفعل مقسمة إلى مساحات من الحزم.فقط تصور حقيقي يدعو إلى إنشاء فئة ثابتة هو أن هذه الطبقة إلى الطبقة التي تحتوي على الخاص أعضاء ثابتة ، ولكن أجد هذا أن تكون جميلة عرجاء مبرر ثابت الدرجة ميزة موجودة.


الطبقات الداخلية

وهي الطبقة الداخلية هي فئة أعلن بأنه غير ثابت عضو فئة أخرى:

package pizza;

public class Rhino {

    public class Goat {
        ...
    }

    private void jerry() {
        Goat g = new Goat();
    }
}

مثل مع فئة ثابتة ، الطبقة الداخلية كما هو معروف المؤهلين من قبل الطبقة التي تحتوي على الاسم ، البيتزا.وحيد القرن.الماعز, ولكن من الداخل تحتوي على فئة يمكن أن يكون معروفا من قبل اسم بسيط.ومع ذلك ، في كل مثيل الطبقة الداخلية مرتبطة مثيل خاص من الطبقة التي تحتوي على:أعلاه ، الماعز التي تم إنشاؤها في جيري, هو ضمنا مرتبطة وحيد القرن سبيل المثال هذا في جيري.وإلا فإننا جعل المرتبطة بها وحيد القرن سبيل المثال صريحة عندما مثيل الماعز:

Rhino rhino = new Rhino();
Rhino.Goat goat = rhino.new Goat();

(لاحظ الرجوع إلى الداخلية نوع فقط الماعز في غربة جديد بناء الجملة:جافا يستنتج تحتوي على نوع من وحيد القرن جزء.و نعم جديد وحيد القرن.الماعز() سيكون من المنطقي أكثر أن لي أيضا.)

فماذا يعني هذا مكسب لنا ؟ حسنا, الطبقة الداخلية مثيل له الوصول إلى مثيل أعضاء الطبقة التي تحتوي على سبيل المثال.هذه أرفق سبيل المثال أعضاء ويشار إلى داخل الطبقة الداخلية عبر مجرد أسماء بسيط, لا عبر هذا (هذا في الطبقة الداخلية يشير إلى الطبقة الداخلية سبيل المثال لا المرتبطة بها التي تحتوي الطبقة سبيل المثال):

public class Rhino {

    private String barry;

    public class Goat {
        public void colin() {
            System.out.println(barry);
        }
    }
}

في الطبقة الداخلية ، يمكنك الرجوع إلى هذا من التي تحتوي على صف وحيد القرن.هذا, و يمكنك استخدام هذا إلى الرجوع إلى أعضائها ، على سبيل المثالوحيد القرن.هذا.باري.


المحلية الطبقات الداخلية

محلي الطبقة الداخلية هي فئة أعلن في الجسم من طريقة.هذه الدرجة هو الوحيد المعروف ضمن تحتوي على الأسلوب ، لذلك فإنه يمكن فقط إنشاء مثيل ويكون لأعضائها الوصول إليها ضمن تحتوي على الأسلوب.المكسب هو أن الطبقة الداخلية المحلية سبيل المثال يرتبط ويمكن الوصول إلى النهائي المتغيرات المحلية يتضمن الأسلوب.عندما سبيل المثال يستخدم النهائي المحلية يتضمن طريقة متغير يحتفظ القيمة التي عقدت في وقت سبيل المثال هو الخلق حتى إذا كان المتغير قد خرجت من نطاق (هذا هو فعال جافا الخام, نسخة محدودة من الإغلاق).

لأن الطبقة الداخلية المحلية ليس عضوا في أي فئة أو مجموعة ، فمن غير المعلنة مع مستوى الدخول.(يكون من الواضح أن أعضائه من الوصول إلى مستويات مماثلة في الصف العادي.)

إذا المحلية الطبقة الداخلية أعلنت في أسلوب مثيل إنشاء مثيل من الطبقة الداخلية مرتبطة سبيل المثال عقد يتضمن الأسلوب هذا في وقت سبيل المثال هو الخلق ، بحيث تحتوي الفئة على سبيل المثال أعضاء يمكن الوصول إليها في مثيل الطبقة الداخلية.محلي الطبقة الداخلية هي ببساطة مثيل عبر من اسمها ، على سبيل المثال الطبقة الداخلية المحلية القط يتم إنشاء مثيل كما new Cat(), لا جديد هذا.القط() كما قد تتوقع.


مجهول الطبقات الداخلية

مجهول الطبقة الداخلية هو نحويا مريحة طريقة كتابة الطبقة الداخلية المحلية.الأكثر شيوعا ، الطبقة الداخلية المحلية هو مثيل على الأكثر مرة واحدة فقط في كل مرة يتضمن طريقة تشغيل.سيكون من الجميل, ثم, إذا نحن يمكن الجمع بين الطبقة الداخلية المحلية تعريف واحد لها مثيل في واحدة مريحة جملة شكل, و أيضا سيكون من الرائع إذا لم يكن لديك للتفكير اسم الدرجة (أقل أسماء غير مفيد يحتوي على التعليمات البرمجية الخاصة بك أفضل).مجهول الطبقة الداخلية يسمح لكل هذه الأمور:

new *ParentClassName*(*constructorArgs*) {*members*}

هذا هو تعبير عن عودة مثيل جديد من فئة لم يذكر اسمه الذي يمتد ParentClassName.لا يمكنك العرض الخاصة بك منشئ ؛ بل هو واحد ضمنا الموردة والتي ببساطة يدعو سوبر منشئ ، لذلك الحجج المقدمة يجب أن تناسب السوبر منشئ.(إذا كان الوالد يحتوي على العديد من المنشئات ، "أبسط" واحد يسمى "أبسط" كما يحددها معقدة مجموعة من القواعد لا يستحق عناء تعلم بالتفصيل-تدفع فقط الانتباه إلى ما NetBeans أو الكسوف أقول لك.)

بدلا من ذلك, يمكنك تحديد واجهة لتنفيذ:

new *InterfaceName*() {*members*}

هذا الإعلان بإنشاء مثيل جديد من فئة لم يذكر اسمه الذي يمتد موضوع تنفذ InterfaceName.مرة أخرى, لا يمكن التوريد الخاصة بك منشئ ؛ في هذه الحالة, جافا ضمنا اللوازم لا arg, افعل شيئا منشئ (لذلك لن يكون هناك منشئ الحجج في هذه الحالة).

حتى ولو كنت لا يمكن أن تعطي مجهول الطبقة الداخلية منشئ, يمكنك لا تزال تفعل أي إعداد تريد استخدام مهيئ كتلة (أ {} كتلة وضعها خارج أي طريقة).

يكون من الواضح أن الطبقة الداخلية من مجهول هو ببساطة أقل مرونة من خلق الطبقة الداخلية المحلية مع حالة واحدة.إذا كنت ترغب في الطبقة الداخلية المحلية التي تنفذ واجهات متعددة أو التي تنفذ واجهات بينما تمتد بعض فئة أخرى من وجوه أو الذي يحدد الخاصة منشئ, كنت عالقا خلق العادية تدعى الطبقة الداخلية المحلية.

لا أعتقد أن الفرق الحقيقي أصبح واضحا في الإجابات أعلاه.

أول من يحصل على شروط اليمين:

  • فئة متداخلة هي فئة الوارد في فئة أخرى على مستوى شفرة المصدر.
  • بل هو ثابت إذا كنت تعلن أنها مع ثابت التعديل.
  • غير ثابت متداخلة فئة تسمى الطبقة الداخلية.(أبقى مع غير ثابت متداخلة الدرجة.)

مارتن الجواب الصحيح حتى الآن.لكن السؤال الفعلي هو:ما هو الغرض من إعلان متداخلة الدرجة ثابت أو لا ؟

يمكنك استخدام ثابت الطبقات المتداخلة إذا كنت ترغب فقط للحفاظ على الطبقات معا إذا كانوا ينتمون موضعيا معا أو إذا متداخلة الدرجة حصرا في أرفق الدرجة.لا يوجد الدلالي الفرق بين ساكنة متداخلة فئة وكل فئة أخرى.

غير ثابت الطبقات المتداخلة هي مختلفة الوحش.على غرار الداخلية من مجهول فصول هذه الطبقات المتداخلة هي في الواقع الإغلاق.وهذا يعني أنهم التقاط المحيطة بهم نطاق و أرفق سبيل المثال أن الوصول إليها.ربما على سبيل المثال سوف يوضح ذلك.ترى هذا كعب الحاوية:

public class Container {
    public class Item{
        Object data;
        public Container getContainer(){
            return Container.this;
        }
        public Item(Object data) {
            super();
            this.data = data;
        }

    }

    public static Item create(Object data){
        // does not compile since no instance of Container is available
        return new Item(data);
    }
    public Item createSubItem(Object data){
        // compiles, since 'this' Container is available
        return new Item(data);
    }
}

في هذه الحالة كنت تريد أن يكون لها مرجع من الطفل البند إلى الحاوية الأصل.استخدام غير ثابت متداخلة الدرجة ، وهذا يعمل دون بعض العمل.يمكنك الوصول إلى أرفق سبيل المثال حاوية مع بناء الجملة Container.this.

أكثر المتشددين التفسيرات التالية:

إذا نظرتم جافا bytecodes مترجم يولد على (غير ثابت) متداخلة فئة قد تصبح أكثر وضوحا:

// class version 49.0 (49)
// access flags 33
public class Container$Item {

  // compiled from: Container.java
  // access flags 1
  public INNERCLASS Container$Item Container Item

  // access flags 0
  Object data

  // access flags 4112
  final Container this$0

  // access flags 1
  public getContainer() : Container
   L0
    LINENUMBER 7 L0
    ALOAD 0: this
    GETFIELD Container$Item.this$0 : Container
    ARETURN
   L1
    LOCALVARIABLE this Container$Item L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 1
  public <init>(Container,Object) : void
   L0
    LINENUMBER 12 L0
    ALOAD 0: this
    ALOAD 1
    PUTFIELD Container$Item.this$0 : Container
   L1
    LINENUMBER 10 L1
    ALOAD 0: this
    INVOKESPECIAL Object.<init>() : void
   L2
    LINENUMBER 11 L2
    ALOAD 0: this
    ALOAD 2: data
    PUTFIELD Container$Item.data : Object
    RETURN
   L3
    LOCALVARIABLE this Container$Item L0 L3 0
    LOCALVARIABLE data Object L0 L3 2
    MAXSTACK = 2
    MAXLOCALS = 3
}

كما يمكنك أن ترى مترجم يخلق حقل مخفي Container this$0.هذا هو منشئ التي لديها معلمة إضافية من نوع الحاويات لتحديد أرفق سبيل المثال.لا يمكنك أن ترى هذه المعلمة في المصدر ولكن المترجم ضمنا يولد على فئة متداخلة.

مارتن سبيل المثال

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

سيكون ذلك من تجميع مكالمة من شيء مثل (في bytecodes)

new InnerClass(outerObject)

من أجل استكمال:

مجهول الدرجة هو مثال ممتاز غير ثابت متداخلة الفصل الذي ليس له اسم المرتبطة به و لا يمكن الرجوع إليها في وقت لاحق.

أعتقد أن أيا من الإجابات أعلاه أشرح لك الفرق الحقيقي بين فئة متداخلة و ثابت متداخلة الدرجة في المدة الطلب تصميم :

نظرة عامة

فئة متداخلة يمكن nonstatic أو ثابت في كل حال ، هي فئة محددة ضمن فئة أخرى. فئة متداخلة ينبغي أن توجد إلا لخدمة هو أرفق الدرجة, إذا فئة متداخلة مفيد فئات أخرى (ليس فقط أرفق), يجب أن تعلن باعتباره أعلى مستوى الصف.

الفرق

Nonstatic متداخلة الدرجة :هو ضمنا المرتبطة أرفق مثيل تحتوي الطبقة ، وهذا يعني أنه من الممكن استدعاء أساليب الوصول إلى المتغيرات من أرفق سبيل المثال.واحد مشترك استخدام nonstatic متداخلة الدرجة هو تحديد محول الدرجة.

ثابت متداخلة الدرجة :لا يمكن الوصول أرفق المثال فئة و أساليب الاحتجاج على ذلك ، لذلك ينبغي أن تستخدم عند فئة متداخلة لا تتطلب الوصول إلى مثيل أرفق الدرجة .الاستخدام المشترك ثابت متداخلة الدرجة هو تنفيذ مكونات الكائن الخارجي.

الختام

وبالتالي فإن الفرق الرئيسي بين الاثنين من وجهة نظر تصميم هو : nonstatic متداخلة فئة يمكن الوصول المثال من الطبقة الحاوية ، في حين ثابتة لا يمكن.

بعبارات بسيطة نحتاج الطبقات المتداخلة في المقام الأول لأن جافا لا توفر الإغلاق.

متداخلة فئات فئات محددة داخل الجسم من آخر أرفق الدرجة.فهي نوعان ثابت غير ثابت.

تعامل أعضاء أرفق الطبقة ، ومن ثم يمكنك تحديد أي من أربعة محددات الوصول - private, package, protected, public.نحن لا نملك هذا الترف مع أعلى مستوى الطبقات التي لا يمكن إلا أن أعلن public أو حزمة خاصة.

الطبقات الداخلية الملقب غير كومة دروس الوصول إلى أعضاء آخرين من الطبقة العليا ، حتى لو كانوا أعلن خاصة حين ثابتة الطبقات المتداخلة يكن لديك الوصول إلى أعضاء أخرى من الطبقة العليا.

public class OuterClass {
    public static class Inner1 {
    }
    public class Inner2 {
    }
}

Inner1 هو ثابت الطبقة الداخلية ، Inner2 هو الطبقة الداخلية وهي ليست ثابتة.الفرق الرئيسي بينهما, لا يمكنك إنشاء Inner2 سبيل المثال دون الخارجي حيث يمكنك إنشاء Inner1 كائن مستقل.

عندما يمكنك استخدام الطبقة الداخلية?

التفكير في الحالة التي تكون فيها Class A و Class B هي ذات الصلة ، Class B يحتاج إلى الوصول Class A أعضاء ، Class B هو ذات الصلة فقط Class A.الطبقات الداخلية يأتي في الصورة.

إنشاء مثيل من الطبقة الداخلية ، تحتاج إلى إنشاء مثيل الخارجي الدرجة.

OuterClass outer = new OuterClass();
OuterClass.Inner2 inner = outer.new Inner2();

أو

OuterClass.Inner2 inner = new OuterClass().new Inner2();

عندما يمكنك استخدام الداخلية ثابتة الصف ؟

يمكنك تحديد ثابت الطبقة الداخلية عندما تعلم أنه ليس لديه أي علاقة مع مثيل أرفق الفئة/الدرجة الأولى.إذا كانت الطبقة الداخلية لا تستخدم الطرق أو الميادين من الطبقة الخارجية ، انها مجرد مضيعة للمساحة ، حتى جعله ثابت.

على سبيل المثال ، إنشاء كائن ثابت متداخلة الدرجة استخدم بناء الجملة التالي:

OuterClass.Inner1 nestedObject = new OuterClass.Inner1();

ميزة ثابتة متداخلة الدرجة هو أنه لا يحتاج إلى كائن تحتوي الفئة/الدرجة الأولى للعمل.هذا يمكن أن تساعدك على تقليل عدد الكائنات التطبيق الخاص بك يخلق في وقت التشغيل.

أعتقد أن تتبع عموما هو هذا:

  • ثابت الدرجة في مستوى أعلى فئة هي متداخلة الدرجة
  • غير ثابت الدرجة في مستوى أعلى فئة هي الطبقة الداخلية, التي المزيد اثنين من أكثر من شكل:
    • الطبقة المحلية - اسمه الطبقات وأعلن داخل كتلة مثل طريقة أو منشئ الجسم
    • مجهول الدرجة - لم يكشف عن اسمه الطبقات من الحالات التي يتم إنشاؤها في التعبير البيانات

ومع ذلك ، فإن قلة الأخرى نقاط يتذكر هي:

  • أعلى مستوى حصص ثابتة متداخلة فئة لغويا نفسه إلا أنه في حالة ثابتة متداخلة فئة يمكن أن تجعل ثابت المرجعية إلى خاص ثابت الحقول/أساليب الخارجي [الأم] الدرجة والعكس بالعكس.

  • الطبقات الداخلية من الوصول إلى المتغيرات سبيل المثال من أرفق مثيل الخارجي [الأم] الصف.ومع ذلك ، ليس كل الطبقات الداخلية قد أرفق الحالات على سبيل المثال الطبقات الداخلية في سياقات ثابتة ، مثل مجهول الدرجة المستخدمة في ثابت مهيئ كتلة لا.

  • مجهول الدرجة افتراضيا تمتد الطبقة الأم أو تنفذ الوالد واجهة وليس هناك شرط تقديم أي فئة أخرى أو تنفيذ أي أكثر الواجهات.لذلك ،

    • new YourClass(){}; يعني class [Anonymous] extends YourClass {}
    • new YourInterface(){}; يعني class [Anonymous] implements YourInterface {}

أشعر أن السؤال الأكبر التي لا تزال مفتوحة والتي ومتى ؟ حسنا هذا يعتمد في الغالب على ما السيناريو الذي تتعامل معه ولكن قراءة الرد الذي قدمته @jrudolph قد تساعدك في اتخاذ بعض القرارات.

هنا هو مفتاح الاختلاف والتشابه بين جافا الطبقة الداخلية ثابتة متداخلة الدرجة.

نأمل أن يساعد!

الطبقة الداخلية

  • يمكن الوصول إلى الخارجي الدرجة سواء سبيل المثال و ثابت الطرق والميادين
  • المرتبطة مثيل أرفق الدرجة حتى مثيل ذلك يحتاج أولا مثيل الخارجي فئة (ملاحظة جديد الكلمة مكان):

    Outerclass.InnerClass innerObject = outerObject.new Innerclass();
    
  • لا تحديد أي أعضاء ثابتة نفسها

  • لا لديك الدرجة أو واجهة إعلان

ثابت متداخلة الدرجة

  • لا يمكن الوصول إلى الخارجي الدرجة سبيل المثال الطرق أو الميادين

  • لا يرتبط مع أي مثيل أرفق الدرجة حتى مثيل:

    OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
    

أوجه التشابه

  • سواء الطبقات الداخلية يمكن الوصول حتى خاص الميادين و الطرق من الخارجي الدرجة
  • أيضا الخارجي الدرجة الوصول إلى خاص الميادين و الطرق من الطبقات الداخلية
  • كل الطبقات يمكن أن يكون الخاصة المحمية أو وصول الجمهور التعديل

لماذا استخدام متداخلة الطبقات ؟

وفقا أوراكل الوثائق هناك عدة أسباب (وثائق كاملة):

  • بل هو وسيلة منطقيا تجميع الصفوف التي تستخدم فقط في مكان واحد: إذا فئة مفيدة واحدة فقط فئة أخرى ، ثم فمن المنطقي أن تضمين ذلك في الصف والحفاظ على الاثنين معا.التعشيش مثل "مساعد الفئات" يجعل حزمة أكثر تبسيطا.

  • لأنه يزيد التغليف: النظر في اثنين من أعلى مستوى الطبقات A و B حيث B يحتاج إلى الوصول إلى أعضاء لولا ذلك أعلن خاصة.عن طريق إخفاء فئة ب في الدرجة الأولى ، أعضاء يمكن تعريف خاص و ب يمكن الوصول إليها.وبالإضافة إلى ذلك ، ب نفسها يمكن أن تكون مخفية عن العالم الخارجي.

  • فإنه يمكن أن يؤدي إلى المزيد للقراءة كود للصيانة: تداخل فصول صغيرة في أعلى مستوى الطبقات الأماكن رمز أقرب إلى حيث يتم استخدامه.

متداخلة الدرجة:الدرجة داخل الطبقة

أنواع:

  1. ثابت متداخلة الدرجة
  2. غير ثابت متداخلة الدرجة [الطبقة الداخلية]

الفرق:

غير ثابت متداخلة الدرجة [الطبقة الداخلية]

في غير ثابتة متداخلة كائن فئة من الطبقة الداخلية توجد داخل الكائن الخارجي الدرجة.بحيث تكون البيانات عضو الخارجي الدرجة الوصول إلى الطبقة الداخلية.وذلك لخلق كائن من الطبقة الداخلية يجب إنشاء كائن الخارجي من الدرجة الأولى.

outerclass outerobject=new outerobject();
outerclass.innerclass innerobjcet=outerobject.new innerclass(); 

ثابت متداخلة الدرجة

في ثابت متداخلة كائن فئة من الطبقة الداخلية لا تحتاج الكائن الخارجي الصف ، لأن كلمة "ثابت" تشير إلى حاجة إلى إنشاء الكائن.

class outerclass A {
    static class nestedclass B {
        static int x = 10;
    }
}

إذا كنت ترغب في الوصول إلى x ، ثم كتابة التالية داخل الطريقة

  outerclass.nestedclass.x;  i.e. System.out.prinltn( outerclass.nestedclass.x);

على سبيل المثال الطبقة الداخلية عندما سبيل المثال من الطبقة الخارجية يتم إنشاؤه.ولذلك أعضاء وأساليب الطبقة الداخلية من الوصول إلى أعضاء وأساليب سبيل المثال (كائن) من الطبقة الخارجية.عندما مثيل فئة الخارجي يخرج من نطاق أيضا الطبقة الداخلية من الحالات تزول من الوجود.

ثابت متداخلة فئة لا يكون ملموسا على سبيل المثال.انها مجرد تحميلها عند استخدامه لأول مرة (مثل أساليب ثابتة).انها تماما كيان مستقل ، الذي أساليب والمتغيرات ليس لديها أي الوصول إلى مثيلات فئة الخارجي.

ثابت الطبقات المتداخلة لا تقترن مع الكائن الخارجي ، فهي أسرع, وأنها لا تأخذ كومة/كومة الذاكرة ، لأنه ليس من الضروري إنشاء مثيل من هذه الفئة.ولذلك وبحكم التجربة هو محاولة تحديد ثابت متداخلة الصف ، مع محدودية نطاق ممكن (خاص >= الدرجة >= المحمية >= العام) ومن ثم تحويله إلى الطبقة الداخلية (عن طريق إزالة "ثابت" معرف) و تخفيف نطاق ، إذا كان من الضروري حقا.

هناك دقة حول استخدام متداخلة ثابت الفئات التي قد تكون مفيدة في بعض الحالات.

وحيث ثابت سمات الحصول على مثيل من قبل الطبقة يحصل مثيل عبر المنشئ لها ، ثابت سمات داخل متداخلة فئات ثابتة لا يبدو للحصول على مثيل حتى بعد فئة منشئ يحصل الاحتجاج ، أو على الأقل ليس حتى بعد السمات الأولى المشار إليها ، حتى إذا تم وضع علامة 'النهائي'.

النظر في هذا المثال:

public class C0 {

    static C0 instance = null;

    // Uncomment the following line and a null pointer exception will be
    // generated before anything gets printed.
    //public static final String outerItem = instance.makeString(98.6);

    public C0() {
        instance = this;
    }

    public String makeString(int i) {
        return ((new Integer(i)).toString());
    }

    public String makeString(double d) {
        return ((new Double(d)).toString());
    }

    public static final class nested {
        public static final String innerItem = instance.makeString(42);
    }

    static public void main(String[] argv) {
        System.out.println("start");
        // Comment out this line and a null pointer exception will be
        // generated after "start" prints and before the following
        // try/catch block even gets entered.
        new C0();
        try {
            System.out.println("retrieve item: " + nested.innerItem);
        }
        catch (Exception e) {
            System.out.println("failed to retrieve item: " + e.toString());
        }
        System.out.println("finish");
    }
}

على الرغم من 'متداخلة" و "innerItem' على حد سواء كما أعلن 'ثابت النهائي'.الإعداد المتداخلة.innerItem لا تتم إلا بعد أن يتم إنشاء مثيل فئة (أو على الأقل ، حتى بعد متداخلة ثابت البند الأول المشار إليه) ، كما يمكنك أن ترى بنفسك من خلال التعليق و uncommenting الخطوط التي أود أن أشير إلى أعلاه.نفس لا يحمل صحيح 'outerItem'.

على الأقل هذا هو ما أراه في Java 6.0.

في حالة إنشاء سبيل المثال ، على سبيل المثال من غير ثابت الطبقة الداخلية يتم إنشاؤه مع الإشارة موضوع الخارجي الدرجة التي يتم تعريفه.هذا يعني أنه قد inclosing سبيل المثال.ولكن مثيل ثابت الطبقة الداخلية يتم إنشاؤه مع المراجع الخارجي في الدرجة وليس مع مرجع كائن الخارجي الدرجة.هذا يعني أنه لم inclosing سبيل المثال.

على سبيل المثال:

class A
{
  class B
  {
    // static int x; not allowed here…..    
  }
  static class C
  {
    static int x; // allowed here
  }
}

class Test
{
  public static void main(String… str)
  {
    A o=new A();
    A.B obj1 =o.new B();//need of inclosing instance

    A.C obj2 =new A.C();

    // not need of reference of object of outer class….
  }
}

أنا لا أعتقد أن هناك الكثير لأضيفه هنا ، فإن معظم الإجابات تماما شرح الفروق بين ساكنة متداخلة فئة الطبقات الداخلية.ومع ذلك, النظر في المشكلة التالية عند استخدام الطبقات المتداخلة مقابل الطبقات الداخلية.كما ذكر في بعض الاجابات الطبقات الداخلية لا يمكن إنشاء مثيل من دون مثيل من أرفق الطبقة مما يعني أنها عقد a مؤشر على سبيل المثال من أرفق الدرجة التي يمكن أن تؤدي إلى الذاكرة تجاوز أو استثناء تجاوز سعة مكدس يرجع ذلك إلى حقيقة GC لن تكون قادرة على جمع القمامة أرفق الطبقات حتى لو كانت لا تستخدم أي أكثر من ذلك.لجعل هذا واضحا التحقق من التعليمات البرمجية التالي بها:

public class Outer {


    public  class Inner {

    }


    public Inner inner(){
        return new Inner();
    }

    @Override
    protected void finalize() throws Throwable {
    // as you know finalize is called by the garbage collector due to destroying an object instance
        System.out.println("I am destroyed !");
    }
}


public static void main(String arg[]) {

    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();

    // out instance is no more used and should be garbage collected !!!
    // However this will not happen as inner instance is still alive i.e used, not null !
    // and outer will be kept in memory until inner is destroyed
    outer = null;

    //
    // inner = null;

    //kick out garbage collector
    System.gc();

}

إذا قمت بإزالة التعليق على // inner = null; البرنامج سوف اخماد "أنا دمرت !"،ولكن الحفاظ على هذا وعلق فإنه لا.
والسبب هو أن الأبيض الداخلي سبيل المثال لا يزال المشار إليها GC لا يمكن جمع ذلك لأنه المراجع (وقد مؤشر إلى) الخارجي سبيل المثال وليس جمعها أيضا.وجود ما يكفي من هذه الكائنات في المشروع الخاص بك و يمكن أن ينفد من الذاكرة.
مقارنة مع ساكنة الطبقات الداخلية التي لا يحمل نقطة إلى الطبقة الداخلية مثيل لأنه ليس سبيل المثال ذات الصلة ولكن فئة ذات الصلة.البرنامج أعلاه يمكن طباعة "أنا دمرت !"إذا كنت جعل الطبقة الداخلية ثابتة مثيل مع Outer.Inner i = new Outer.Inner();

مصطلحات تستخدم بالتبادل.إذا كنت تريد أن تكون حقا متحذلق ، يمكن أن تعريف "متداخلة فئة" للإشارة إلى ثابت الطبقة الداخلية, الذي أرفق سبيل المثال.في التعليمات البرمجية ، قد يكون لديك شيء من هذا القبيل:

public class Outer {
    public class Inner {}

    public static class Nested {}
}

هذا ليس مقبولا على نطاق واسع من الوضوح على الرغم من.

متداخلة الدرجة هو مصطلح عام:كل فئة وهي ليست أعلى مستوى فئة متداخلة.وهي الطبقة الداخلية هو غير ثابت متداخلة الدرجة.جوزيف دارسي كتب جميل جدا شرح عن متداخلة, الداخلية, عضو, و أعلى مستوى الطبقات.

يممم...وهي الطبقة الداخلية هي فئة متداخلة...تعني مجهول الطبقة و الطبقة الداخلية?

تحرير:إذا كنت قصدت الداخلية ضد مجهول...وهي الطبقة الداخلية هو مجرد فئة محددة داخل الصف مثل:

public class A {
    public class B {
    }
}

في حين مجهول الطبقة هي امتداد فئة محددة من مجهول, لذلك لا الفعلية "فئة محددة ، كما في:

public class A {
}

A anon = new A() { /* you could change behavior of A here */ };

آخر تحرير:

ويكيبيديا مطالبات هناك فرق في جافا, ولكن لقد تم العمل مع جافا لمدة 8 سنوات و أول مرة أسمع مثل هذا التمييز...ناهيك عن أن هناك أي إشارات إلى هناك مرة أخرى هذا الإدعاء...خلاصة القول ، الطبقة الداخلية هي فئة محددة ضمن فئة (ثابت أو لا) ، و متداخلة مصطلح آخر على أنها تعني نفس الشيء.

هناك فرق دقيق بين ثابت وغير ثابت متداخلة الدرجة...في الأساس غير ثابت الطبقات الداخلية قد ضمنا الوصول إلى مثيل مجالات وأساليب أرفق فئة (وبالتالي لا يمكن بناؤها في ثابت السياق ، سيكون خطأ التحويل).ثابت الطبقات المتداخلة ، من ناحية أخرى ، لم يكن لديك الوصول الضمني على سبيل المثال مجالات وأساليب يمكن بناؤها في ثابت السياق.

استهداف المتعلم ، الذين هم المبتدئين جافا و/أو الطبقات المتداخلة

الطبقات المتداخلة يمكن أن تكون إما:
1.ثابت الطبقات المتداخلة.
2.غير ثابت الطبقات المتداخلة.(المعروف أيضا باسم الطبقات الداخلية) =>يرجى تذكر هذا


1.الطبقات الداخلية
على سبيل المثال:

class OuterClass  {
/*  some code here...*/
     class InnerClass  {  }
/*  some code here...*/
}


الداخلية فئات فرعية متداخلة فصول:

  • الطبقة الداخلية هو نوع معين من الدرجة متداخلة
  • الداخلية فئات فرعية من الطبقات المتداخلة
  • هل يمكن القول أن الطبقة الداخلية هو أيضا فئة متداخلة ، ولكن يمكنك لا أقول أن فئة متداخلة أيضا الطبقة الداخلية.

تخصص الطبقة الداخلية:

  • مثيل الطبقة الداخلية وقد الوصول إلى جميع من أعضاء الطبقة الخارجية ، حتى تلك التي تم وضع علامة "خاص"


2.ثابت الطبقات المتداخلة:
على سبيل المثال:

class EnclosingClass {
  static class Nested {
    void someMethod() { System.out.println("hello SO"); }
  }
}

حالة 1:إنشاء ثابت متداخلة فئة من غير أرفق الدرجة

class NonEnclosingClass {

  public static void main(String[] args) {
    /*instantiate the Nested class that is a static
      member of the EnclosingClass class:
    */

    EnclosingClass.Nested n = new EnclosingClass.Nested(); 
    n.someMethod();  //prints out "hello"
  }
}

الحالة 2:إنشاء ثابت متداخلة فئة من أرفق الدرجة

class EnclosingClass {

  static class Nested {
    void anotherMethod() { System.out.println("hi again"); } 
  }

  public static void main(String[] args) {
    //access enclosed class:

    Nested n = new Nested(); 
    n.anotherMethod();  //prints out "hi again"
  }

}

تخصص فئات ثابتة:

  • ثابت الطبقة الداخلية فقط الوصول إلى أعضاء ثابتة من الطبقة الخارجية و الوصول إلى غير ثابت الأعضاء.

الخلاصة:
السؤال: ما هو الفرق الرئيسي بين الطبقة الداخلية و ثابت متداخلة الدرجة في جافا ؟
الجواب: مجرد الذهاب من خلال خصوصيات كل فئة المذكورة أعلاه.

الطبقة الداخلية و متداخلة ثابت الدرجة في جافا كلاهما الطبقات وأعلن داخل فئة أخرى ، المعروف مستوى أعلى فئة في جافا.في جافا المصطلحات ، إذا كنت تعلن فئة متداخلة ثابتة ، سوف يسمى متداخلة ثابت الدرجة في جافا بينما غير ثابت متداخلة الطبقة هي ببساطة يشار إلى الطبقة الداخلية.

ما هو الطبقة الداخلية في جافا ؟

أي الطبقة التي ليست أعلى مستوى أو وأعلن داخل فئة أخرى كما هو معروف متداخلة فئة من تلك الطبقات المتداخلة ، الطبقة التي أعلنت غير ثابتة تعرف باسم الطبقة الداخلية في جاوة.هناك ثلاثة أنواع من الطبقة الداخلية في جاوة:

1) الطبقة الداخلية المحلية - وأعلن داخل كتلة رمز أو الأسلوب.
2) الطبقة الداخلية من مجهول - هي الطبقة التي لا تملك اسم الإشارة و تهيئة في نفس المكان الذي يتم إنشاؤه.
3) عضو في الطبقة الداخلية - أعلن غير ثابت عضو الخارجي الدرجة.

public class InnerClassTest {
    public static void main(String args[]) {      
        //creating local inner class inside method i.e. main() 
        class Local {
            public void name() {
                System.out.println("Example of Local class in Java");

            }
        }      
        //creating instance of local inner class
        Local local = new Local();
        local.name(); //calling method from local inner class

        //Creating anonymous inner class in Java for implementing thread
        Thread anonymous = new Thread(){
            @Override
            public void run(){
                System.out.println("Anonymous class example in java");
            }
        };
        anonymous.start();

        //example of creating instance of inner class
        InnerClassTest test = new InnerClassTest();
        InnerClassTest.Inner inner = test.new Inner();
        inner.name(); //calling method of inner class
    }

     //Creating Inner class in Java
    private class Inner{
        public void name(){
            System.out.println("Inner class example in java");
        }
    }
}

ما هو متداخلة ثابت الدرجة في جافا ؟

متداخلة ثابت الفئة هي فئة أخرى والتي أعلنت داخل الصف الأعضاء و جعل الساكنة.متداخلة ثابت الدرجة كما أعلن عضو الخارجي فئة يمكن أن تجعل الخاصة والعامة أو المحمية مثل أي عضو آخر.واحد من الفائدة الرئيسية المتداخلة ثابت الطبقة فوق الطبقة الداخلية هي تلك الحالة المتداخلة ثابت الدرجة لا تعلق أي أرفق المثال الخارجي الدرجة. أنت أيضا لا تحتاج إلى أي مثيل الخارجي فئة إنشاء مثيل متداخلة ثابت الدرجة في جافا.

1) فإنه يمكن الوصول إلى أعضاء بيانات ثابتة الخارجي فئة بما في ذلك القطاع الخاص.
2) ثابت متداخلة فئة لا يمكن الوصول إلى غير ثابت (على سبيل المثال) بيانات الأعضاء أو طريقة.

public class NestedStaticExample {
    public static void main(String args[]){  
        StaticNested nested = new StaticNested();
        nested.name();
    }  
    //static nested class in java
    private static class StaticNested{
        public void name(){
            System.out.println("static nested class example in java");
        }
    }
}

Ref: الطبقة الداخلية و متداخلة ثابت الدرجة في جافا مع المثال

أعتقد أن الناس هنا يجب أن تلاحظ أن المشارك أن :ثابت عش الدرجة فقط أول الطبقة الداخلية.على سبيل المثال:

 public static class A {} //ERROR

 public class A {
     public class B {
         public static class C {} //ERROR
     }
 }

 public class A {
     public static class B {} //COMPILE !!!

 }

حتى وتلخيص الفئة ثابتة لا تعتمد الفئة التي لها يحتوي على.حتى أنهم لا يستطيعون في الصف العادي.(لأن الطبقة العادية تحتاج مثيل).

عندما نعلن عضو ثابت فئة داخل الصف ، كما هو معروف في أعلى مستوى متداخلة فئة أو ثابت متداخلة الدرجة.يمكن التدليل على النحو التالي :

class Test{
    private static int x = 1;
        static class A{
        private static int y = 2;
        public static int getZ(){
            return B.z+x;
        }
    }
    static class B{
        private static int z = 3;
        public static int getY(){
            return A.y;
        }
    }
}

class TestDemo{
     public static void main(String[] args){
        Test t = new Test();
        System.out.println(Test.A.getZ());
        System.out.println(Test.B.getY());
    }
}

عندما نعلن غير ثابت الأعضاء الدرجة داخل الطبقة كما هو معروف في الطبقة الداخلية.الطبقة الداخلية يمكن البرهنة على النحو التالي :

    class Test{
        private int i = 10;
        class A{
            private int i =20;
            void display(){
            int i = 30;
            System.out.println(i);
            System.out.println(this.i);
            System.out.println(Test.this.i);
        }
    }
}

التالي هو مثال من static nested class و inner class:

OuterClass.java

public class OuterClass {
     private String someVariable = "Non Static";

     private static String anotherStaticVariable = "Static";  

     OuterClass(){

     }

     //Nested classes are static
     static class StaticNestedClass{
        private static String privateStaticNestedClassVariable = "Private Static Nested Class Variable"; 

        //can access private variables declared in the outer class
        public static void getPrivateVariableofOuterClass(){
            System.out.println(anotherStaticVariable);
        }
     }

     //non static
     class InnerClass{

         //can access private variables of outer class
         public String getPrivateNonStaticVariableOfOuterClass(){
             return someVariable;
         }
     }

     public static void accessStaticClass(){
         //can access any variable declared inside the Static Nested Class 
         //even if it private
         String var = OuterClass.StaticNestedClass.privateStaticNestedClassVariable; 
         System.out.println(var);
     }

}

OuterClassTest:

public class OuterClassTest {
    public static void main(String[] args) {

        //access the Static Nested Class
        OuterClass.StaticNestedClass.getPrivateVariableofOuterClass();

        //test the private variable declared inside the static nested class
        OuterClass.accessStaticClass();
        /*
         * Inner Class Test
         * */

        //Declaration

        //first instantiate the outer class
        OuterClass outerClass = new OuterClass();

        //then instantiate the inner class
        OuterClass.InnerClass innerClassExample =  outerClass. new InnerClass();

        //test the non static private variable
        System.out.println(innerClassExample.getPrivateNonStaticVariableOfOuterClass()); 

    }

}

أعتقد أن أيا من الإجابات أعلاه تعطي مثالا واقعيا لك الفرق بين فئة متداخلة و ثابت متداخلة الدرجة في تصميم التطبيق.والفرق الرئيسي بين ساكنة متداخلة الطبقة و الطبقة الداخلية هي القدرة على الوصول إلى الطبقة الخارجية سبيل المثال المجال.

دعونا نلقي نظرة على اثنين من الأمثلة التالية.

ثابت عش الدرجة:مثال جيد من طريق ثابت الطبقات المتداخلة هو باني نمط (https://dzone.com/articles/design-patterns-the-builder-pattern).

بالنسبة BankAccount نستخدم ثابت متداخلة الدرجة ، وذلك أساسا بسبب

  1. ثابت عش الدرجة سبيل المثال يمكن إنشاؤه من قبل الطبقة الخارجية.

  2. في البناء نمط البناء مساعد الدرجة التي يتم استخدامها لإنشاء BankAccount.

  3. BankAccount.باني يرتبط فقط مع BankAccount.أي فئات أخرى تتعلق BankAccount.باني.لذا فمن الأفضل أن تنظم لهم معا دون استخدام اسم الاتفاقية.
public class BankAccount {

    private long accountNumber;
    private String owner;
    ...

    public static class Builder {

    private long accountNumber;
    private String owner;
    ...

    static public Builder(long accountNumber) {
        this.accountNumber = accountNumber;
    }

    public Builder withOwner(String owner){
        this.owner = owner;
        return this; 
    }

    ...
    public BankAccount build(){
            BankAccount account = new BankAccount(); 
            account.accountNumber = this.accountNumber;
            account.owner = this.owner;
            ...
            return account;
        }
    }
}

الطبقة الداخلية:الاستخدام المشترك الطبقات الداخلية هو تحديد معالج الحدث.https://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html

بالنسبة MyClass, نحن نستخدم الطبقة الداخلية ، وذلك أساسا بسبب:

  1. الطبقة الداخلية MyAdapter تحتاج إلى الوصول إلى الطبقة الخارجية الأعضاء.

  2. في المثال ، MyAdapter يرتبط فقط مع MyClass.أي فئات أخرى تتعلق MyAdapter.لذا فمن الأفضل أن تنظم لهم معا دون استخدام اسم الاتفاقية

public class MyClass extends Applet {
    ...
        someObject.addMouseListener(new MyAdapter());
    ...
    class MyAdapter extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            ...// Event listener implementation goes here...
            ...// change some outer class instance property depend on the event
        }
    }
}

أولا وقبل كل شيء لا يوجد مثل هذه الطبقة يسمى ثابت الدرجة.ثابت معدل الاستخدام مع الطبقة الداخلية (كما دعا متداخلة فئة) يقول أنه هو ثابت عضو الخارجي الدرجة وهو ما يعني أننا يمكن الوصول إليها كما هو الحال مع غيرها من أعضاء ثابتة و دون وجود أي مثيل الخارجي الدرجة.(والذي هو مصلحة ثابتة في الأصل.)

الفرق بين استخدام متداخلة في الدرجة العادية الطبقة الداخلية هي:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();

أولا نحن يمكن إنشاء مثيل Outerclass ثم يمكننا الوصول إلى الداخلية.

ولكن إذا كان الصف متداخلة ثم بناء الجملة هو:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

والذي يستخدم ثابت الجملة كالمعتاد تنفيذ ثابتة الكلمة.

لغة البرمجة جافا يسمح لك لتحديد فئة في فئة أخرى.مثل هذه الدرجة تسمى فئة متداخلة كما هو موضح هنا:

class OuterClass {
...
class NestedClass {
    ...
    }
}

الطبقات المتداخلة تنقسم إلى فئتين:ثابتة وغير ثابتة.الطبقات المتداخلة التي أعلنت ثابت يسمى ثابت الطبقات المتداخلة.غير ثابت الطبقات المتداخلة تسمى الطبقات الداخلية.شيء واحد يجب أن نأخذ في الاعتبار هو غير ثابت متداخلة الطبقات (الطبقات الداخلية) من الوصول إلى أعضاء أخرى أرفق الدرجة ، حتى لو كانوا أعلن خاصة.ثابت الطبقات المتداخلة فقط من الوصول إلى أعضاء أخرى أرفق الدرجة إذا كانت تلك هي ثابتة.فإنه لا يمكن الوصول غير ثابتة أعضاء من الطبقة الخارجية.كما هو الحال مع أساليب الفئة و المتغيرات ثابتة متداخلة الطبقة المرتبطة الخارجي الدرجة.على سبيل المثال ، إنشاء كائن ثابت متداخلة الدرجة استخدم بناء الجملة التالي:

OuterClass.StaticNestedClass nestedObject =
 new OuterClass.StaticNestedClass(); 

إنشاء مثيل فئة الداخلية ، يجب عليك أولا إنشاء مثيل فئة الخارجي.ثم إنشاء الكائن الداخلي داخل الكائن الخارجي مع هذه الجملة:

OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();

لماذا نستخدم الطبقات المتداخلة

  1. بل هو وسيلة منطقيا تجميع الصفوف التي تستخدم فقط في مكان واحد.
  2. لأنه يزيد التغليف.
  3. فإنه يمكن أن يؤدي إلى المزيد للقراءة كود للصيانة.

المصدر: جافا Tm الدروس - الطبقات المتداخلة

الفرق هو أن فئة متداخلة الإعلان الذي هو أيضا ثابت يمكن إنشاء مثيل خارج أرفق الدرجة.

عندما يكون لديك فئة متداخلة الإعلان لا ساكنة ، الطبقة الداخلية, جافا لن تسمح لك مثيل إلا عبر أرفق الدرجة.الكائن خلقت من الطبقة الداخلية مرتبط كائن خلق من الطبقة الخارجية ، وبالتالي فإن الطبقة الداخلية يمكن الرجوع مجالات الخارجي.

ولكن إذا كانت ساكنة ، ثم عدم وجود ارتباط الخارجي المجالات لا يمكن الوصول إليها (باستثناء طريق عادي المرجعية مثل أي كائن آخر) و ولذلك يمكنك إنشاء مثيل فئة متداخلة في حد ذاته.

لدي توضيح مختلف ممكن الصحيح والخطأ السيناريو الذي يمكن أن يحدث في كود جافا.

    class Outter1 {

        String OutStr;

        Outter1(String str) {
            OutStr = str;
        }

        public void NonStaticMethod(String st)  {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            //  below static attribute not permitted
            // static String tempStatic1 = "static";    

            //  below static with final attribute not permitted         
            // static final String  tempStatic1 = "ashish";  

            // synchronized keyword is not permitted below          
            class localInnerNonStatic1 {            

                synchronized    public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /* 
        //  static method with final not permitted
          public static void innerStaticMethod(String str11) { 

                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }                            

        }

        public static  void StaticMethod(String st)     {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            // static attribute not permitted below
            //static String tempStatic1 = "static";     

            //  static with final attribute not permitted below
            // static final String  tempStatic1 = "ashish";                         

            class localInnerNonStatic1 {
                public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /*
    // static method with final not permitted
    public static void innerStaticMethod(String str11) {  
                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }    

        }

        // synchronized keyword is not permitted
        static  class inner1 {          

            static String  temp1 = "ashish";
            String  tempNonStatic = "ashish";
            // class localInner1 {

            public void innerMethod(String str11) {
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            public static void innerStaticMethod(String str11) {
                //  error in below step
                str11 = temp1 +" india";    
                //str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }
            //}
        }

        //synchronized keyword is not permitted below
        class innerNonStatic1 {             

//This is important we have to keep final with static modifier in non
// static innerclass below
            static final String  temp1 = "ashish";  
            String  tempNonStatic = "ashish";
            // class localInner1 {

            synchronized    public void innerMethod(String str11) {
                tempNonStatic = tempNonStatic +" ...";
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            /*
            //  error in below step
            public static void innerStaticMethod(String str11) {   
                            //  error in below step
                            // str11 = tempNonStatic +" india";                     
                            str11 = temp1 +" india";
                            System.out.println("innerMethod ===> "+str11);
                        }*/
                    //}
                }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top