Доступ к классу внутри несуществующего класса

#java

#java — язык #java

Вопрос:

Как это работает?

РЕДАКТИРОВАТЬ: Статичность — не очень хорошее объяснение, потому что я могу использовать нестатические методы, и все это будет работать. Обновил код, чтобы отразить это.

У меня есть это в файле под названием Foo.java:

 // This is in the Foo.java file
class Test {
    public void printSomething() {
        System.out.println("In Foo.Test");
    }
};
  

и это в файле под названием Caller.java:

 // This goes in the Caller.java file
public class Caller {
    public static void main(String[] args) {
        Test test = new Test();
        test.printSomething();
    }
}
  

Я могу выполнить своего Вызывающего абонента, и он напечатает In Foo.Test . Как это может не быть проблемой компиляции? У меня даже не создан Foo класс. Мне даже не нужно давать определение Foo.Test в Caller .

Это на Eclipse Luna, Java8.

Комментарии:

1. Когда вы компилируете Foo.java это создает Test.class файл. Затем вы могли бы удалить любой Foo.class файл и код все равно будут выполняться.

2. Вы путаете класс Foo в его собственном файле с классом Test в том же файле . . .

Ответ №1:

Java такая странная. У вас может быть файл без каких-либо строк кода, и он все равно будет компилироваться. Продолжайте, попробуйте.

Теперь, я думаю, вы путаете Test с Foo .Тест (я так понимаю, сегодня пятница).

По сути, то, что вы определили, это:

 public class Foo {} // this is by default, but don't try to use it because you didn't define the scope
class Test {}
  

И ваше недоумение «OMG, Test это нечистое порождение несуществующего класса !!!», потому что вы ожидали чего-то вроде

 public class Foo {
    class Test {}
}
  

Это не имеет ничего общего со статическим методом. Речь идет о причудливости в javac .

Всех с пятницей! Время для счастливого часа.

Ответ №2:

main -Метод Foo.java объявлен статическим

вызов статических методов работает без создания объекта класса.

Например, вы можете создать следующий метод в Foo.java

 class Test {
    public static void test(String test) {
        System.out.println(test);
    }
};
  

Теперь вы можете вызвать Test.test("No object will be created"); , и экземпляра Test

Ответ №3:

Файл Java может содержать один общедоступный класс, но в нем может быть столько непубличных классов (в вашем случае локальных по пакету), сколько вы хотите.

Foo.Test предназначен для внутренних классов. Тот, который вы объявили, является типом верхнего уровня.