Два вопроса на внутренних классах в Java (класс A {класс B {}})

Это ваша функция, которую вы передаете, единственным входным аргументом является тау.

tau => MyFunction(r, tau, appCfg, Ta, Da) * ProbDensity(tau)

Другие вариабели r, appCfg, Ta, Da «закрыты» закрытием

6
задан Don Kirkby 9 December 2008 в 21:53
поделиться

4 ответа

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

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 будет экземпляр outerclass, связанного с экземпляром внутреннего класса.

21
ответ дан 8 December 2019 в 03:02
поделиться

[Редактирование: Мой ответ подходит для программистов 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 таким образом кажется мало забавным: технически, можно передать в любом родителе. Вероятно, было бы лучше переписать Ваш класс с методом, который возвращает 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;
}
2
ответ дан 8 December 2019 в 03:02
поделиться

Можно получить доступ к нему с 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());
    }
}
7
ответ дан 8 December 2019 в 03:02
поделиться

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

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);
    }
}
1
ответ дан 8 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: