【问题标题】:using predefined class name String in my project在我的项目中使用预定义的类名字符串
【发布时间】:2018-08-20 19:49:49
【问题描述】:

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

问题:为什么本地 String 优先于 java.lang.String ? 根据委托模型,Bootstrap 类加载器在加载 Test 类之前获得首选项和 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();
    }
}

错误:在类 diff.Test 中找不到主方法,请将主方法定义为: 公共静态无效主要(字符串 [] 参数) 或者 JavaFX 应用程序类必须扩展 javafx.application.Application

【问题讨论】:

    标签: java jvm classloader


    【解决方案1】:

    问题:为什么本地字符串优先于 java.lang.String ?

    本地name masksjava.lang 中的那个。 java.lang 包由编译器为每个程序隐式导入,但是您不能将java.lang.String 用作String,因为您屏蔽了名称String。如您所述,您可以使用java.lang.String 重命名您的String 类(简而言之,不要添加与java.lang 中的类名冲突的自定义类)。这不是类加载器的问题,因为编译后所有类在字节码中都是完全限定的。

    【讨论】:

    • 一个问题。由于类名在编译时本身是完全限定的,因此 java.lang.String 和本地 String 类被认为是不同的并且都被加载。因此,例如,如果我设法创建另一个 java.lang.String 类,我将能够验证类加载器 deligation?。我的实际目标是检查类加载器的 deligation/loading。如果我的理解正确,请告诉我
    • 你不能替换 java.lang.String - 它是一个最终类,你会破坏依赖于内部 String(s) 的 JVM 的重要部分。
    【解决方案2】:

    您必须区分类型和名称。您创建了一个名为diff.String 的类,它不会与java.lang.String 冲突。类加载器委托在这里无关紧要;甚至不可能定义一个冲突的 java.lang.String 类,因为以 java. 开头的名称是保留的。

    当简单名称String 得到解析时,本地范围优先。顺便说一句,这发生在编译时,这是类加载器在这里不相关的另一个原因。还有一个优先规则,变量 > 类 > 包,它允许以下奇怪的代码:

    Integer String = 42;
    String Integer = ""+String.intValue();
    System.out.println(Integer);
    

    第一条语句声明了一个名为String 的变量,其类型为Integer。在第二个语句中,第一个“String”被解析为一个类型,因为该位置不允许有变量,而对于名称的第二次出现,在String.intValue() 中,变量String 优先。同样,在第三条语句中,Integer 被解析为变量 Integer

    一般来说,程序员应该遵循约定,只让类名以大写字母开头,这大大减少了了解这些规则的需要。

    要点是,不是每个简单名称 String 的出现都意味着对类型 java.lang.String 的引用,甚至不能保证引用一个类型。上下文很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2013-06-07
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多