2016-09-18 36 views
0

给定一个类遮蔽一个内置类(如String):当我们将类名定义为字符串时会发生什么?

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

} 
} 

字符串不是一个关键字,不过,上面的程序给出了一个运行时错误。这是为什么?

+1

那么,什么是错误? – OldProgrammer

+0

字符串已经是类的名称。 String类。这对我来说假设你想覆盖那个类。 –

+0

@OldProgrammer错误是:错误:在类String中找不到主要方法,请将主要方法定义为: public static void main(String [] args) 或者JavaFX应用程序类必须扩展javafx.application.Application –

回答

2

不好的事情发生,当你定义一个名为字符串您阴影 一个java.lang.String类的类,这意味着每一个声明的对象必须使用全限定名java.lang.String如果它指的是一个“正常的字符串”比其他将指向你定义一个..

例子是你写的代码:

public static void main(String[] args) { 

} 

如果这是你有,那么编译器会抱怨,因为入口点的应用程序将永远不会被发现的唯一类...

你会需要做

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

} 
定义明确的说法

这是一个非常不错的陷阱,会打破你的脖子,所有的最大的原因是在java lang中的类不需要导入,你的代码必须仔细书写,并且非常容易出错..

那个代码将编译,但在任何体面的代码分析器,你会得到很多抱怨和重命名的建议s ..

我会遵循这种方式,并建议永远不要命名你的类像标准的java类...

2

原因是因为main方法是'特殊的',因为它是程序的入口点。该程序的参数被指定为具有可变数量Javajava.lang.String s,而不是您的String类。您的字符串类与类最接近,因为它是当前类,所以当JVM预期Java的字符串时,Java会在main参数中使用您的String类,从而导致错误。您可以通过使用Java的字符串的完全合格的名称防止这种情况:

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

那么,用户定义的String类将比Libraray String类更优先? –

+0

是的,因为它是最接近的一个,因为它是当前类@NickSilicon – Li357

相关问题