Sobes.tech
Middle
162

Ішкі сыныптан сыртқы сыныптың өрісіне қалай қол жеткізуге болады?

AI-дан жауап

sobes.tech AI

Нестатикалық ішкі сынып (inner class) сыртқы сыныптың өрісіне тікелей өріс атауы арқылы қол жеткізеді.

Статикалық ішкі сынып (static nested class) сыртқы сыныптың өрісіне тек сыртқы сыныптың объектісіне сілтеме арқылы қол жеткізуге болады, себебі статикалық ішкі сынып сыртқы сыныптың экземплярымен жасырын байланысқа ие емес.

// Сыртқы сынып
class Outer {
    private int outerField = 10;

    // Нестатикалық ішкі сынып
    class Inner {
        void accessOuterField() {
            // Сыртқы сыныптың өрісіне тікелей қол жеткізу
            System.out.println("Inner сыныптан: " + outerField);
        }
    }

    // Статикалық ішкі сынып
    static class StaticNested {
        // outerField-ке тікелей қол жеткізе алмайды
        void accessOuterField(Outer outerInstance) {
            // Сыртқы сыныптың объектісіне сілтеме арқылы қол жеткізу
            System.out.println("StaticNested сыныптан: " + outerInstance.outerField);
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.accessOuterField(); // Шығу: Inner сыныптан: 10

        Outer.StaticNested staticNested = new Outer.StaticNested();
        staticNested.accessOuterField(outer); // Шығу: StaticNested сыныптан: 10
    }
}

Егер ішкі сыныпта сыртқы сыныптың өрісімен бірдей атауы бар өріс болса, сыртқы сыныптың нақты өрісіне қол жеткізу үшін Outer.this.fieldName синтаксисін қолдануға болады.

class Outer {
    private int field = 10;

    class Inner {
        private int field = 20;

        void accessFields() {
            // Ішкі сыныптың өрісіне қол жеткізу
            System.out.println("Inner өрісі: " + field);
            // Сыртқы сыныптың өрісіне қол жеткізу
            System.out.println("Outer өрісі: " + Outer.this.field);
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.accessFields();
        // Шығу:
        // Inner өрісі: 20
        // Outer өрісі: 10
    }
}