2013-06-12 3 views
5

Я написал следующий код.Java Puzzler - В чем причина?

class String { 

    private final java.lang.String s; 

    public String(java.lang.String s){ 
     this.s = s; 
    } 

    public java.lang.String toString(){ 
     return s; 
    } 

    public static void main(String[] args) { 
     String s = new String("Hello world"); 
     System.out.println(s); 
    } 
} 

Когда я исполню его, получить следующее сообщение об ошибке

The program compiled successfully, but main class was not found. 
    Main class should contain method: public static void main (String[] args). 

Почему это так? ... хотя основной метод определяется, почему система не читает/признания его?

+1

1) Используйте последовательный и логический отступ для кодовых блоков.Отступ кода предназначен для того, чтобы помочь людям понять поток программы! 2) 'class String {' Не называйте свой класс после существующего класса J2SE. Это, по крайней мере, смущает. 3) Этот класс также, кажется, ничего не делает, кроме того, что может достичь простая строка, основанная на J2SE. В чем его цель? –

+0

Попытка изменить это имя класса на Stringg заставляет его правильно скомпилировать, поэтому это должно быть что-то о повторном использовании имени класса String. –

+1

Если вы когда-либо пишете такую ​​программу в реальной жизни, вы заслуживаете того, чтобы ее шлепали! * :-) –

ответ

6
public static void main(String[] args) { 

Безусловно, вы должны использовать java.lang.String, а не свои собственные. В вашем основном методе String вы используете на самом деле пользовательский String, который был определен, а не реальный java.lang.String.

Вот код, выясненных немного:

class MyString { 

    private final String s; 

    public MyString(String s){ 
     this.s = s; 
    } 

    public String toString(){ 
     return s; 
    } 

    public static void main(MyString[] args) { // <--------- oh no! 
     MyString s = new MyString("Hello world"); 
     System.out.println(s); 
    } 
} 

Итак, урок, который вы можете узнать из этой загадки: не называйте классы, как и другие обычно используемые классы!

6

Почему это так?

Потому что String[], который вы используете в точке, не является java.lang.String[]. Это массив класса String, который вы определяете здесь. Таким образом, ваша среда IDE (или что-то еще) правильно сообщает вам, что метод main является допустимой точкой входа.

Урок: не используйте имена классов, которые совпадают с именами обычно используемых классов. Это делает ваш код очень запутанным. В этом случае, так запутанно, что вы запутались!

2

Поскольку подпись основного метода должна быть

public static void main(java.lang.String[] args) { 

и не

public static void main(mypackage.String[] args) { 

Обычно java.lang подразумевается. В этом случае вместо этого используются ваши личные String. Именно поэтому вы должны никогда имя классы, как тех, кто уже в java.lang

2

Проблема заключается в том, что ваш класс называется String, как String класса Java. Это очень плохо, вы не должны этого делать.

Из-за этого, когда вы пишете заявление о главном:

public static void main(String[] args) { 

String [] не относится к Java String класса, но своих собственному класса, так что Java не может найти его.

Если вы хотите Java, чтобы быть в состоянии найти его, вы должны написать:

public static void main(java.lang.String[] args) { 

Но на самом деле, это не то, что вы хотите, найти другое название для своего класса.

Смежные вопросы