سؤال

بالنظر إلى ما أعرفه عن كل نوع آخر من الميزات الثابتة للبرمجة - أعتقد أن الإجابة "لا". ومع ذلك ، فإن رؤية بيانات مثل OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); يجعلني أتساءل.

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

المحلول

نعم ، لا يوجد شيء في دلالات أ static نوع متداخل يمنعك من القيام بذلك. هذا المقتطف يعمل بشكل جيد.

public class MultipleNested {
    static class Nested {
    }
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Nested();
        }
    }
}

أنظر أيضا


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

لكن بشكل عام ، نعم ، أ static يمكن إنشاء نوع متداخل عدة مرات.

لاحظ أنه من الناحية الفنية ، أ static النوع المتداخل ليس نوعًا "داخليًا".

JLS 8.1.3 الفصول الداخلية والحالات المرفقة

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

وهذا هو ، وفقا لمصطلحات JLS ، داخلي الفصل ليس كذلك static. إذا كان static, ، ثم هو مجرد نوع متداخل.


إذن ماذا يفعل static يعني؟

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

أنظر أيضا

نصائح أخرى

polygenelubricants: ولكن بشكل عام ، نعم ، يمكن إنشاء نوع متداخل ثابت عدة مرات.

فقط للتأكد من أن 100 ٪ من ذلك مددت المقتطف الخاص بك:

public class MultipleInner {
    static class Inner {
        private int state;
        public int getState() { return state; }
        public void setState(int state) { this.state = state; }
    }

    public static void main(String[] args) {
        List<Inner> inners = new ArrayList<Inner>();
        for (int i = 0; i < 100; i++) {
            Inner inner = new Inner();
            inner.setState(i);
            inners.add(inner);
        }
        for (Inner inner : inners) {
            System.out.println(inner.getState());
        }
    }
}

وبالطبع والنتيجة هي:

0
1
2
3
.
.
.
97
98
99

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

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

نعم يمكنك عمل مثيلات منه عدة مرات كما تريد.

ربما السبب في أنك ترى ذلك ، هو أن البرنامج فكر في تخزين مرجع في مكان ما. على الرغم من أنني أتفق معك يبدو غريبًا: S

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

     public class MultipleInner {
      private int outerstate =10;
      static class Inner {
        private int state;
        public int getState() { return state; }
        public void setState(int state) { this.state = state; }
      }

     public static void main(String[] args) {       
        Inner inner = new Inner();
        inner.setState(new MultipleInner().outerstate);
        System.out.println(inner.getState());        
     }

}

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

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

public class OuterClass {
    String outerStr = "this is the outer class!!" ;
    public static class StaticNestedClass {
        String innerStr = "default / first instance" ;      
    }

    public static void main(String[] args) {
        OuterClass.StaticNestedClass nestedObject1 = new OuterClass.StaticNestedClass();        
        OuterClass.StaticNestedClass nestedObject2 = new OuterClass.StaticNestedClass();
        nestedObject2.innerStr = "second instance" ;
        System.out.println(nestedObject1.innerStr) ;
        System.out.println(nestedObject2.innerStr) ;
    }
}

output:

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