黑马程序员技术交流社区

标题: JDK1.5新特性之静态导入的问题 [打印本页]

作者: 张亚青    时间: 2013-3-9 02:11
标题: JDK1.5新特性之静态导入的问题
  1. package com.itheima;
  2. import java.util.*;
  3. import static java.util.Arrays.*;//导入的是Arrays这个类中的所有静态成员


  4. class StaticImportDemo
  5. {
  6.         public static void main(String[] args)
  7.         {

  8.                 int[] arr={1,5,3};
  9.                 sort(arr);

  10.                 int index=binarySearch(arr,1);
  11.                 System.out.println(toString(arr));//这里会报错:toString()方法没有参数
  12.                 System.out.println("index"+index);

  13.         }
  14. }
复制代码
我想问的是,在这个类中静态导入了java.util.Arrays下的所有静态方法,包括toString(int [])方法,另外StaticImportDemo类也继承了Object类中的toString()方法,可是这两个方法并没有产生冲突,应该是重载,为什么会报错呢?
作者: amen0205    时间: 2013-3-9 02:30
我对静态导入了解不多  不过看你这个代码   静态导入的静态方法可以再类中直接用吗   是不是该用Arrays.toString(int[]);   ?
作者: 移动小坦克    时间: 2013-3-9 03:25
如果成员函数,与静态倒入的函数相冲突,应该是只考虑成员函数。
作者: 李辉    时间: 2013-3-9 05:30
本帖最后由 李辉 于 2013-3-9 07:39 编辑

1.首先你把toString(arr)换成java.util.Arrays.toString(arr)就不会报错了。
2.静态导入只是简化了书写。编译器会自动把静态导入的方法更名为包名.类名.方法。
3.当静态导入的方法与类自身的方法重名(参数不同)时,当然不是方法重载。因为静态导入的方法并不属于这个类,它只是因为省略了包名和类名,然后用的时候很像类自身的方法而已。比如A类中导入了B类的静态方法,那A类的对象还是不能调用那个导入的静态方法。
4.当静态导入的方法和自身的方法重名时(无论参数是否相同),默认都要用自身的方法,如果想调用静态导入的方法,就要用方法的全名(包名.类名.方法)
作者: 张亚青    时间: 2013-3-9 10:19
李辉 发表于 2013-3-9 05:30
1.首先你把toString(arr)换成java.util.Arrays.toString(arr)就不会报错了。
2.静态导入只是简化了书写。编 ...

你说的前三点我都认同,对于第四点我还是有疑问。
疑问是:
    为什么“当静态导入的方法和自身的方法重名时(无论参数是否相同),默认都要用自身的方法”,这是死规定吗?
    但是我认为JVM编译的时候应该能识别toString(int [] arr)方法在本类中没有,那为什么不会自动加上静态导入的包名"java.util.Arrays."呢?
    JVM又是如何识别哪些方法是导入的静态方法然后在方法前面自动加上包名呢?
作者: 李辉    时间: 2013-3-9 18:11
张亚青 发表于 2013-3-9 10:19
你说的前三点我都认同,对于第四点我还是有疑问。
疑问是:
    为什么“当静态导入的方法和自身的方法重 ...

第四点是我试出的结论,没有在书上看到啊!:#
作者: 张亚青    时间: 2013-3-10 11:53
本帖最后由 张亚青 于 2013-3-10 11:54 编辑
李辉 发表于 2013-3-9 18:11
第四点是我试出的结论,没有在书上看到啊!

虽然没有得到想要的答案,但也非常感谢你了,希望哪位大虾能给个标准答案?????

*************************************************************************
***************************【求解释】*************************************
*************************************************************************

为什么:当静态导入的方法和自身的方法重名时(无论参数是否相同),默认都要用自身的方法,如果想调用静态导入的方法,就要用方法的全名(包名.类名.方法)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2