Ответы на этот вопрос уже были опубликованы, еще одна аналогия. Это может быть не прямой ответ, но может помочь вам устранить вашу путаницу, почему бы избежать повторного использования имен классов платформы и никогда не использовать имена классов из java.lang, поскольку эти имена автоматически импортируются повсюду. Программисты используются для просмотра этих имен в их неквалифицированной форме, и естественно предполагают, что эти имена относятся к знакомым классам от java.lang
. Если повторное использование одного из этих имен, безоговорочное имя будет ссылаться на новое определение в любое время, когда оно используется внутри его собственного пакета.
Одно имя может использоваться для обозначения нескольких классов в разных пакетах. Следующий простой фрагмент кода исследует, что происходит при повторном использовании имени класса платформы. Что вы думаете ? Посмотри на это. Он повторно использует класс String
из пакета java.lang
. Попробуйте.
package test;
final class String
{
private final java.lang.String s;
public String(java.lang.String s)
{
this.s = s;
}
@Override
public java.lang.String toString()
{
return s;
}
}
final public class Main
{
public static void main(String[] args)
{
String s = new String("Hello world");
System.out.println(s);
}
}
Эта программа выглядит достаточно простой, если немного отталкивает.Класс String
в неназванном пакете представляет собой просто оболочку для экземпляра java.lang.String
. Кажется программа должна печатать Hello world. Если вы попытались запустить программу, однако, вы обнаружили, что не можете. VM выдает сообщение об ошибке что-то вроде этого:
Exception in thread "main" java.lang.NoSuchMethodError: main
Если вы используете IDE NetBeans, то программа будет просто предотвратить запуск. Вы получите сообщение Не найдено ни одного основного класса.
ВМ не может найти метод main
, потому что не существует. Хотя Main
имеет метод с именем main
, он имеет неправильную подпись. Основной метод должен принимать единственный аргумент, являющийся массивом строк. Что VM пытается сказать нам, что Main.main
принимает массив нашей строки класса, который не имеет ничего общего с java.lang.String
.
Заключение: Как уже упоминалось выше, всегда во избежание повторного использования имен классов платформы от java.lang
пакета.
На самом деле, почему люди не читают ошибки? –
Я читаю ошибку. Вот почему я копирую и вставляю сообщение об ошибке, которое я получаю. –
Что вы могли бы сделать, это поиск метода в java doc и определение его самостоятельно. в любом случае, хорошо, что вы нашли ответ :) –