A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张亚青 中级黑马   /  2013-3-9 02:11  /  1384 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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()方法,可是这两个方法并没有产生冲突,应该是重载,为什么会报错呢?

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1 淡定

查看全部评分

7 个回复

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

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

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

为什么:当静态导入的方法和自身的方法重名时(无论参数是否相同),默认都要用自身的方法,如果想调用静态导入的方法,就要用方法的全名(包名.类名.方法)
回复 使用道具 举报
张亚青 发表于 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 07:39 编辑

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果成员函数,与静态倒入的函数相冲突,应该是只考虑成员函数。
回复 使用道具 举报
我对静态导入了解不多  不过看你这个代码   静态导入的静态方法可以再类中直接用吗   是不是该用Arrays.toString(int[]);   ?

点评

是的,可以直接用,报错是因为系统认为导入的方法和继承的方法发生了冲突,但是我感觉并没有发生冲突  发表于 2013-3-9 02:43
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马