Частный класс в векторе, используемый публично - PullRequest
1 голос
/ 26 июня 2010

Что происходит в Java, когда вы ссылаетесь на закрытый класс в Vector извне класса?

Пример:

public class A {
  private class B {}
  public Vector<B> vector = new Vector<B>();

  public A() {
    vector.add(new B());
  }
}

public class C {
  public C() {
    A a = new A();
    a.vector.get(0); // <- What does this return?
  }
}

Ответы [ 3 ]

1 голос
/ 26 июня 2010

Он вернет объект типа AB. Однако вы не можете ничего с ним поделать, потому что вы не сможете присвоить его переменной или вызвать какие-либо методы для него.Если вы сделаете:

System.out.println(a.vector.get(0));

, вы получите что-то вроде:

A$B@42e816
1 голос
/ 26 июня 2010

Вы можете попробовать этот код:

public static void main(String[] args) {
    A a = new A();
    Object o = a.vector.get(0); // <- What does this return?
    System.out.println(o.getClass());
}

Класс A $ B, поэтому он знает, что B является внутренним классом A.

Но вы не можете получить доступ ни к одному из членов B. Например, если вы измените класс A на:

public class A {
  private class B {
      public int x;
  }
  public Vector<B> vector = new Vector<B>();

  public A() {
    vector.add(new B());
    vector.get(0).x = 10;
  }
}

Вы все еще не сможете сделать это:

public static void main(String[] args) {
    A a = new A();
    System.out.println(a.vector.get(0).x); // this won't compile
}

Он скажет the type A.B is not visible.

1 голос
/ 26 июня 2010

Возвращает ссылку на объект типа A $ B.

Вы сможете назначить его для ссылки Object, например,

Object o = a.vector.get( 0 );

Вы можете даже использовать отражение, чтобы исследовать свойства o.

Просто общее напоминание, пожалуйста, используйте java.util.ArrayList вместо Vector.

...