在com.test包中 定义String类,重写toString()放回"my String!"
    public static void main(java.lang.String[] args) {
        String str=new String();
        System.out.println(str.toString());
    }
执行输出为 my String
根据java虚拟机类装载器的装载原理不应该会执行我自定义的String类
应该会先去启动类装载器中装载String类,如果装载到 就不会再装载我自定义的String
类了

解决方案 »

  1.   

    如果你的String在你的包下。当然会先找你的。
    如果没有就去找classpath下的
      

  2.   

    String类时final修饰的.去API看看吧.
      

  3.   

    在com.test包中 定义String类?
    String是final的,你自己的String咋个能继承API的String呢
      

  4.   

    包名都不相同,类的名字是要包含包的名称的。虽然你的类叫String,但是与java.lang.String是不相同的
      

  5.   

    java 默认会先在你当前的包下找String类,找不到再去它自带的包下找
      

  6.   

    最根本的原因,你这里其实是
    com.test.String str=new com.test.String();
    和java.lang.String不是一个类
      

  7.   

    首先在你当前的包下找String类,找不到再到自带的包下找。
      

  8.   

    你的String跟API里的String不是同一个类!!!!!!
      

  9.   

    请不要误导楼主,类的加载顺序请看ClassLoader的原理,是递归委托parent去加载的这里根本就是2个不同的类,“默认在当前包找”这个是想当然的吧
      

  10.   

    谢谢 大家
    特别谢谢 (疯狂的小猪) 当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的Class对象,若parent不能装载,则由parent的请求者去装载。
    当前装载器的parent会去装载com.test.String类,结果没有找到.则由当前装载器去装载如果包名改为java.lang.String
    当前装载器的parent会去装载java API 中的java.lang.String类,并返回这个类所对应的Class对象
    所以自定义的java.lang.String就不会被装载
      

  11.   

    看看你 import的时候 导入的是哪个包咯