Java 在我的项目中使用预定义的类名字符串
我有下面的代码抛出下面给出的错误。当'String[]args'替换为'java.lang.String[]args'时,它不会抛出错误并运行方法s1.method1() 问题:为什么本地字符串优先于java.lang.String? 根据委托模型,引导类加载器在加载测试类之前获得首选项和java.lang.String。我是不是遗漏了什么。请给我指出有关这种行为的任何参考资料 Test.java:Java 在我的项目中使用预定义的类名字符串,java,jvm,classloader,Java,Jvm,Classloader,我有下面的代码抛出下面给出的错误。当'String[]args'替换为'java.lang.String[]args'时,它不会抛出错误并运行方法s1.method1() 问题:为什么本地字符串优先于java.lang.String? 根据委托模型,引导类加载器在加载测试类之前获得首选项和java.lang.String。我是不是遗漏了什么。请给我指出有关这种行为的任何参考资料 Test.java: package diff; class String { public void me
package diff;
class String {
public void method1(){
System.out.println("in my method");
}
}
class Test {
public static void main(String[] args){
String s1 = new String();
s1.method1();
}
}
错误:在类差异测试中未找到主方法,请将主方法定义为:
公共静态void main(字符串[]args)
或者JavaFX应用程序类必须扩展JavaFX.application.application问题:为什么本地字符串优先于java.lang.String
本地文件是java.lang
中的文件。编译器为每个程序隐式导入java.lang
包,但是不能将java.lang.String
用作String
,因为屏蔽了String
名称。正如您所注意到的,您可以使用java.lang.String
或重命名String
类(简而言之,不要添加与java.lang
中的类名冲突的自定义类)。这不是类加载器问题,因为编译后所有类都在字节码中完全限定。问题:为什么本地字符串优先于java.lang.String
本地文件是
java.lang
中的文件。编译器为每个程序隐式导入java.lang
包,但是不能将java.lang.String
用作String
,因为屏蔽了String
名称。正如您所注意到的,您可以使用java.lang.String
或重命名String
类(简而言之,不要添加与java.lang
中的类名冲突的自定义类)。这不是类加载器问题,因为编译后所有类都在字节码中完全限定。您必须区分类型和名称。您已经创建了一个名为diff.String
的类,它与java.lang.String
不冲突。类装入器委托在这里是不相关的;甚至不可能定义冲突的java.lang.String
类,因为以java.
开头的名称是保留的
当解析简单名称字符串
时,局部作用域具有优先权。顺便说一下,这发生在编译时,这也是类装入器在这里不相关的另一个原因。还有另一个优先规则variable>class>package,它允许以下奇怪的代码:
Integer String = 42;
String Integer = ""+String.intValue();
System.out.println(Integer);
第一条语句声明一个名为String
的变量,类型为Integer
。在第二条语句中,第一个“String
”被解析为类型,因为在此位置不允许使用变量,而对于名称的第二次出现,在String.intValue()
中,变量String
优先。同样,在第三条语句中,Integer
被解析为变量Integer
一般来说,程序员应该遵循约定,只允许类名以大写字母开头,这大大减少了了解这些规则的需要
要点是,并非每次出现的简单名称
String
都意味着引用类型java.lang.String
,甚至不能保证引用类型。上下文很重要。您必须区分类型和名称。您已经创建了一个名为diff.String
的类,它与java.lang.String
不冲突。类装入器委托在这里是不相关的;甚至不可能定义冲突的java.lang.String
类,因为以java.
开头的名称是保留的
当解析简单名称字符串
时,局部作用域具有优先权。顺便说一下,这发生在编译时,这也是类装入器在这里不相关的另一个原因。还有另一个优先规则variable>class>package,它允许以下奇怪的代码:
Integer String = 42;
String Integer = ""+String.intValue();
System.out.println(Integer);
第一条语句声明一个名为String
的变量,类型为Integer
。在第二条语句中,第一个“String
”被解析为类型,因为在此位置不允许使用变量,而对于名称的第二次出现,在String.intValue()
中,变量String
优先。同样,在第三条语句中,Integer
被解析为变量Integer
一般来说,程序员应该遵循约定,只允许类名以大写字母开头,这大大减少了了解这些规则的需要
要点是,并非每次出现的简单名称
String
都意味着引用类型java.lang.String
,甚至不能保证引用类型。上下文很重要。一个问题。由于类名在编译时本身是完全限定的,因此java.lang.String和local String类被认为是不同的,并且都会被加载。因此,例如,如果我设法创建另一个java.lang.String类,我将能够验证类加载器deligation?。我的实际目标是检查类加载器的卸载/加载。如果我的理解正确,请告诉我您不能替换java.lang.String
-这是最后一个类,您将破坏JVM中依赖内部String
(s)的重要部分。一个问题。由于类名在编译时本身是完全限定的,因此java.lang.String和local String类被认为是不同的,并且都会被加载。例如,如果我设法创建另一个java.lang.String Cla