#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
предназначен для внутренних классов. Тот, который вы объявили, является типом верхнего уровня.