Подтвердить что ты не робот

Я думал, что внутренние классы могут обращаться к внешним переменным класса/методам?

Я прочитал несколько тем, обсуждая внутренние классы, и у меня создалось впечатление, что внутренний класс имеет доступ к переменным и методам охватывающего класса. В следующем случае у меня есть внешний класс и внутренний класс, в тестовом классе я создаю экземпляр внешнего класса, а затем из него создаю экземпляр внутреннего класса. Однако я не могу получить доступ к переменной String a через внутреннюю ссылку на класс. Помогите?

public class OuterClass {

    String a = "A";
    String b = "B";
    String c = "C";

    class InnerClass {
        int x;

    }

    public static class StaticInnerClass {
        int x;
    }

    public String stringConCat() {
        return a + b + c;

    }
}

public class TestStatic {

    public static void main(String args[]) {

        OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();

        System.out.println(inner.a);// error here, why can't i access the string
                                    // variable a here?

    }
}
4b9b3361

Ответ 1

Внутренний класс может обращаться к внешним методам и свойствам класса через свои собственные методы. Посмотрите на следующий код:

class OuterClass {

    String a = "A";
    String b = "B";
    String c = "C";

    class InnerClass{
        int x;
        public String getA(){
            return a; // access the variable a from outer class
        }
    }

    public static class StaticInnerClass{
        int x;
    }

    public String stringConCat(){
        return a + b + c;    
    }
}


public class Test{

    public static void main(String args[]) {

        OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();

        System.out.println(inner.getA()); // This will print "A"
    }
}

Ответ 2

Кажется, вы путаете область и доступ. Ссылки могут иметь доступ только к атрибутам и методам объекта, к которому они относятся. Таким образом, ваш inner.a не может работать.

С другой стороны, внешние переменные класса входят в объем методов в соответствующем внутреннем классе. Таким образом, вы можете сделать то, что хотите, указав аксессуар для чтения.

public class OuterClass {  

    String a = "A";  
    String b = "B";  
    String c = "C";  

    class InnerClass{  
        int x;  
        String getA() {
             return a;
        }
    }  
}  


public class TestStatic {  

    public static void main(String args[]) {  

        OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();  
        OuterClass outer = new OuterClass();  
        OuterClass.InnerClass inner = outer.new InnerClass();  

        System.out.println(inner.getA());  //error should be gone now.   

    }  
}

Ответ 3

inner - это экземпляр OuterClass.InnerClass, который не определяет a, поэтому он не сможет получить к нему доступ в любом случае.

Чтобы понять это простейшим образом... посмотрите на блок, в котором создается a, и блок, в котором определяется OuterClass.InnerClass.

public class OuterClass { // a is defined in this block

    String a = "A";

    class InnerClass{ // InnerClass starts here and an instance will access what is defined now
        int x;
    }
}

Ответ 4

An Non-static inner class имеет неявный привязку к OuterClass.....

Попробуй вот так.....

class OuterClass {

    String a = "A";
    String b = "B";
    String c = "C";

    class InnerClass {

            String x = a;    // Directly uses the instance variable a from Outer class


    }

    public static class StaticInnerClass {
        int x;
    }

    public String stringConCat() {
        return a + b + c;

    }
}

public class TestStatic {

    public static void main(String args[]) {

        OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass();
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();

        System.out.println(inner.x);

    }
}

Ответ 5

System.out.println(inner.a);

Вы пытаетесь читать a, как будто это свойство вашего внутреннего класса, но это не так. Вы должны определить метод, который будет читать искомое свойство внешнего класса. Поэтому в вашем внутреннем классе вы должны:

 public String getA(){
     return a;
 }

System.out.println(inner.getA());

Это должно работать.