Java - конструкторы статичны? - PullRequest
3 голосов
/ 27 января 2011

Я только что написал конструктор так:

public ArchivesManager(String identifier) {
    String[] components = String.split("\nNEW");
}

Но есть сообщение об ошибке: non-static method split(java.lang.String) cannot be referenced from a static context.Я знаю это сообщение об ошибке, но почему конструктор статичен?!

Ответы [ 7 ]

9 голосов
/ 27 января 2011

Это потому, что split должен вызываться для объекта String. * 1001 Т.е. *

String foo = "Hello, world";
String[] arr = foo.split(",");
4 голосов
/ 27 января 2011

Я знаю это сообщение об ошибке, но почему конструктор статичен?!

Контекст конструктора не является статическим, но вы явно вызвали метод split в статическом контексте, когда указали его с именем класса; т.е. String.split(...).

Вы, вероятно, хотели написать это:

String[] components = identifier.split("\nNEW");

, который вызывает метод в (нестатическом) контексте String объекта, переданного как identifier; то есть какая строка должна быть разбита .

3 голосов
/ 27 января 2011

Для ответа на вопрос в заголовке:

«Конструкторы не являются членами» [индекс JLS], поэтому static на самом деле не является подходящей концепцией. Конструкторы не являются членами, потому что они не наследуются (хотелось бы, чтобы статические методы также не наследовались). С точки зрения файла класса, это специальные методы экземпляра, которые возвращают void. Байт-код, вызывающий конструктор, сначала выделяет память, дублирует ссылку на эту память, а затем вызывает конструктор для одной из этих ссылок. (При нацеливании на 1.4 или более позднюю версию для внутреннего класса присваивается значение «external this» и включается final полей до вызова конструктора.)

2 голосов
/ 27 января 2011

из-за этого String.split("\nNEW"); split не является статическим методом

Вам, вероятно, нужно

public ArchivesManager(String identifier) {
    String[] components = identifier.split("\nNEW");//NOTE: components are local to const. this doesn't make sense
}
0 голосов
/ 08 июля 2013

На самом деле, я не знаю, почему конструктор статичен по умолчанию.В книге «Мышление в Java» говорится, что «хотя в нем явно не используется ключевое слово static, конструктор фактически является статическим методом».

0 голосов
/ 27 января 2011

Эта ошибка не означает, что ваш конструктор статичен.Это означает, что Split не является статическим методом, у вас есть 2 метода thisc из его объекта ..........

0 голосов
/ 27 января 2011

Вместо String.split("\nNEW"); вам нужно позвонить identifier.split("\nNEW");.Вы хотите разделить объект идентификатора (который имеет тип string).По сути, то, что вы сказали, это «разделить класс строк», что не имеет смысла, и поэтому компилятор жалуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...