كيف يمكنني استخدام مثيل الطبقة الداخلية من طريقة الطبقة الداخلية الأخرى؟

StackOverflow https://stackoverflow.com/questions/1406525

  •  05-07-2019
  •  | 
  •  

سؤال

public class Ex7 {
    private int fld;

    private void meth(int val) {
        fld = val;
        System.out.println(" meth() -> fld = " + fld);
    }

    public class Ex7Inner1 {
        void operateOnFld() {
            fld = 12;
        }

        void operateOnMeth() {
            meth(10);
        }

        public void bar() {
            System.out.println(" bar() ");
        }
    }

    class Ex7Inner2 {
        Ex7Inner1 i1 = new Ex7Inner1();
        // how to call i1.bar() ??
        i1.bar();
    }
}
هل كانت مفيدة؟

المحلول

ومشكلتك هي أنك تحتاج إلى استدعاء i1.bar() داخل دالة. على سبيل المثال

class Ex7Inner2 {
    Ex7Inner1 i1 = new Ex7Inner1();  // this is now a field of the Ex7Inner2 class
    public void callBar() {
        i1.bar();                    // this will work
    }
}

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

Ex7.java:26: <identifier> expected
  i1.bar();
        ^
1 error

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

String s;

وبعد ذلك s يمكن أن يكون المعرف.

نصائح أخرى

هناك بعض الأشياء الخاطئة هنا؛

  • يحتاج inner2 الخاص بك إلى استدعاء ملف i1 داخل وظيفة
  • بما أنك لم تعلن عن inner1 ثابت يحتاج إلى مثيل من إرفاق Ex7 بالوجود.

لذا يمكنك القيام بشيء مثل هذا:

public class Ex7 {

    private Ex7Inner1 i1;
    public class Ex7Inner1 {
        public void bar() {
            System.out.println( " bar() " );
        }
    }

    class Ex7Inner2 {
        // how to call i1.bar() ??
        public Ex7Inner2() {
            Ex7.this.i1.bar();
        }
    }
}

للوصول إلى i1 الخاص بـ Ex7.

حيث يحتوي مثيل Ex7 الخاص بك على داخلي 1 وداخلي 2 ومرجعك من داخل داخلي 2 هو داخلي 2-->parentEx7->طفل داخلي 1.

إذا جعلت الفئة الداخلية ثابتة، فيمكنك التخلص من مرجع Ex7، حيث إنك تحدد أن الفئة الداخلية لا تحتاج إلى مثيل للفئة الخارجية لتكون موجودة.

ولكن لا توجد طريقة في الدرجة Ex7Inner2. إنشاء الأسلوب مع "i1.bar ()؛" استدعاء داخل ويجمع طيب

وEx7Inner1 يحتاج إشارة إلى Ex7 من أجل مثيل. من Ex7Inner2 أن المرجعية هي Ex7.this.

وهكذا يقول

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

جافا دروس من مزيد من المعلومات .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top