System.out是一个System类的静态属性,属于lang包。虽然返回值是PrintStream,但为什么不用引入IO,就可以调用println方法?
突然想到这个问题,请大家指点。

解决方案 »

  1.   

    可以参考下这个
    http://topic.csdn.net/t/20050921/21/4285473.html
      

  2.   

    总之是因为虽然你写的程序没有引入io 但是System这个类写的时候源代码已经引入了io 所以你不必再引了 
      

  3.   

    这个问题问得好。不知道楼主有没有注意到,
    不仅仅是System.out,
    任何时候,我们只是引用一个对象(不显式生成变量)的时候,都不需要import,
    比如,对JDBC链接,
    ResultSet rs=conn.createStatement().executeQuery(sql);
    这样我们并不需要import java.sql.statement。我觉得,这要探讨一下import的作用,
    import给谁用?
    其实给编译器用的(当然,现在开发工具也在用),
    编译器使用import来决定一个变量具体是那个类,
    如果没有import,首先编译器效率很低(要做很大集合的搜索),而且解决不了多个包下重名类的问题。但通过Object1.getObject2()引用一个对象下的另外一个对象的变量时,虽然Object2的类没有import,
    但由上下文可以明确的知道Object2的身份,因此也无需import。所以,我们只需保证明确定义变量的类需要import(验明正身),
    控制了入口,其相关的对象图谱就在运行时刻可以确定。
      

  4.   

    去看看System类的源码,那个地方引入了 
      

  5.   

    System 类属于 java.lang 的,属于系统自动引入的package,所以无需引入而System依赖的类,比如你说的io下面的,因为你的程序没有用到,注意是你的程序,不是System的程序,所以你也不用引入。
    如果你这样写
    PrintStream ps = System.out;那么你就得自己引入了。
      

  6.   

    你想想,如果你用一个类的都话要你自己去引用相关的它用的类的话那还不得把人累死?
    其实这个问题本质上应该是classloader机制中的一条,如果A类是由你load的,那a类用的类也是要你去加载的(当然可能会先去查cache之类的)
      

  7.   

    lang这个包他默认就引入了的。