Два вопроса о внутренних классах в Java (класс A {class B {}}) - PullRequest
6 голосов
/ 04 декабря 2008

Извините за плохой заголовок, но я не мог придумать лучшего.

У меня есть класс A и класс B, который является своего рода подклассом A, например:

(действительно ли для него правильное имя? Разве «подкласс» не зарезервирован для наследования?)

class A {
    int i = 0;
    class B {
        int j = 1;
    }
}

class Test {
    public static void main() {
        A a = new A();
        B b = a.new B();
        A c = ??? b ??? // get "a" back
    }
}

Из B можно получить доступ к любому свойству A, поэтому и ai, и bi возвращают 0. Теперь мне интересно, возможно ли каким-то образом извлечь исходный объект типа A из b, поскольку b содержит все содержит? Простое приведение, по-видимому, не помогает.

Второй:

class A {

    void print() {
        System.out.println("This is class A.");
    }

    class B {
        void print() {
            // <--- How to access print() of class A (like this.A.print() or smth)? 
            System.out.println("This is class B.");
        }
    }
}

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

Заранее спасибо. :)

Ответы [ 4 ]

21 голосов
/ 04 декабря 2008

Кажется, нет способа получить доступ к внешнему классу извне. Но вы можете сделать это так:

class A {
    int i = 0;
    class B {
        final A outer = A.this;
        int j = 1;
    }
}

class Test {
    public static void main() {
        A a = new A();
        A.B b = a.new B();
        A c = b.outer // get "a" back
    }
}

ClassName.this будет экземпляром внешнего класса, связанным с экземпляром внутреннего класса.

7 голосов
/ 04 декабря 2008

Вы можете получить к нему доступ с помощью синтаксиса ParentClass.this из внутреннего класса.

, например

public class Outter
{
    class Inner {
        public Outter getOutter()
        {
            return Outter.this;
        }
    }

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

class Runner{
    public static void main(String[] args){
        Outter out = new Outter(); 
        Outter.Inner inner = out.getInner();

        System.out.println(inner.getOutter().toString());
    }
}
2 голосов
/ 04 декабря 2008

[Редактировать: Мой ответ подходит для программистов на C #, но я не могу гарантировать, что он применим к Java.]

B является внутренним классом, а не подклассом A. Кроме того, B не содержит экземпляра A, поэтому ваш код как есть не может вернуть ни одного экземпляра A.

Вам нужно реструктурировать свои классы следующим образом:

class A
{
    public class B
    {
       public A Parent;
       public B(A parent)
       {
          this.Parent = parent;
       }
    }
}

Теперь у вашего класса B есть поле 'Parent', которое возвращает его родителя. Вы можете использовать эти классы следующим образом (это синтаксис C #, потому что я не знаю, имеет ли Java другой синтаксис для создания экземпляров внутренних классов):

public static void Main(String[] args)
{
    A parent = new A();
    A.B child = new A.B(child);
    A backToParent = child.Parent;
}

Конечно, создание вашего класса B таким способом кажется немного забавным: технически вы можете передать любого родителя. Вероятно, было бы лучше переписать ваш класс A с помощью метода, который возвращает B:

class A
{        
    public class B
    {
       public A Parent;
       public B(A parent)
       {
          this.Parent = parent;
       }
    }

    public B getChild()
    {
        return new B(this);
    }
}

public static void Main(String[] args)
{
    A parent = new A();
    A.B child = A.getChild();
    A backToParent = child.Parent;
}
1 голос
/ 03 мая 2009

мне показалось, что это работает

class A {
    int i = 0;
    class B {
        int j = 1;
    }
}

class Test {
    public static void main() {
        A a = new A();
        A.B b = a.new B();
        A c = (A)b.getClass().getDeclaredField("this$0").get(b);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...