Image

Конечно сегодня не пятница, но...

Что будет результатом компиляции/выполнения данной программы и почему?

class Foo {

  private void foo() {
    System.out.println("qwe");
  }

  static class Bar extends Foo {
    void bar() {
      this.foo();
    }
  }

  public static void main(String[] args) {
    new Bar().bar();
  }
}


UPDATE:
Для тех, кому всё понятно, объясните, почему вот это работает по-другому:
class Foo {
  private Foo() {
  }

  static class Bar extends Foo {
  }

  public static void main(String[] args) {
    new Bar();
  }
}


UPDATE2:

Итак, из класса Bar таки есть доступ к Foo.foo(). http://community.livejournal.com/ru_java/806380.html?view=10338028#t10338028
class Foo {

  private void foo() {
    System.out.println("qwe");
  }

  static class Bar extends Foo {
    void bar() {
      super.foo();
    }
  }

  public static void main(String[] args) {
    new Bar().bar();
  }
}


UPDATE3:
Как обнаружил Imageaefimov, через рефлекшен ничего не работает:
Foo.class.getDeclaredMethod("foo").invoke(this);

выдаёт
Class Foo$Bar can not access a member of class Foo with modifiers "private"


А это уже бага в рефлекшене:
Bug ID: 4071957 (reflect) Method.invoke access control does not understand inner class scoping