是否可以定义自己的String类?

时间:2014-11-10 08:08:25

标签: java

是否可以定义自己的String类,其名称与java.lang.String完全相同?我的假设是,在我定义之后,我可以直接使用它或者使用类加载器加载它。

抱歉,我写的代码有误。方法main()的参数String [] args的String类被错误地引用到我自己定义的String中。这就是它发生编译错误的原因。 我的工作结果是我们可以在自己的命名空间或java.lang中定义一个名为String的类。但是由于JVM加载了默认的java.lang.String,我们无法加载自己的String并使用它。

1 个答案:

答案 0 :(得分:8)

是的,您可以定义该类,但您无法使用它。类java.lang.String将在引导程序中从JRE加载,并且您无法在引导程序类加载器中重新加载类。如果您尝试使用自己的类加载器,JVM会注意到java.lang.String已经加载并且只使用那个。

来自the JLS section on class loading

  
      
  • 给定相同的名称,一个好的类加载器应该总是返回相同的类对象。 (这意味着在引导程序中获取的java.lang.String类将是权威类。)
  •   
  • 如果类加载器L1 (引导加载程序)将类C的加载委托给另一个加载器L2 (您自己的加载器),那么对于任何类型的T java.lang.String作为直接超类或C的直接超接口,或作为C中字段的类型,或作为方法的形式参数的类型或C中的构造函数,或作为C中方法的返回类型, L1和L2应该返回相同的Class对象。 (您自己的java.lang.String将与引导加载程序加载的任何其他参数和字段发生冲突,并且会导致您的流氓类加载过后几乎任何事情都会因链接或转换错误而崩溃。)
  •   

无论如何,你到底想要做什么? java.lang.String具有非常严格定义的语义,并且改变其行为会破坏大量代码。

相关问题