Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在我的项目中使用预定义的类名字符串_Java_Jvm_Classloader - Fatal编程技术网

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

我有下面的代码抛出下面给出的错误。当'String[]args'替换为'java.lang.String[]args'时,它不会抛出错误并运行方法s1.method1()

问题:为什么本地字符串优先于java.lang.String? 根据委托模型,引导类加载器在加载测试类之前获得首选项和java.lang.String。我是不是遗漏了什么。请给我指出有关这种行为的任何参考资料

Test.java:

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