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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丘凤光 金牌黑马   /  2013-3-28 12:56  /  3253 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丘凤光 于 2013-3-28 14:31 编辑

再看毕老师的视频时,老师经常把重复的代码封装起来,提高复用性。

刚才在封装一个数组打印功能时,遇到下面这个问题
  1. private static void printInt(int[] arr)
  2.         {
  3.                 for(int i=0;i<arr.length;i++)
  4.                 {
  5.                         System.out.print(arr[i]+" ");
  6.                 }
  7.                 System.out.println();
  8.         }
  9.         private static void printChar(char[] arr)
  10.         {
  11.                 for(int i=0;i<arr.length;i++)
  12.                 {
  13.                         System.out.print(arr[i]+" ");
  14.                 }
  15.                 System.out.println();
  16.         }
复制代码
函数里的代码完全一样,要实现的功能也一样,但就因为要传进去的参数一个为int[],一个为char[]。找不到把两个函数合二为一的办法,要是还有double[]、byte[]等,那岂不是要重复很多遍。那位大神有好的解决方法,还望指点指点。

评分

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

查看全部评分

17 个回复

倒序浏览
你可以试试传递参数时传递object[]这个类型,只是想法,具体行不行你试试
回复 使用道具 举报
曹春贵 发表于 2013-3-28 12:59
你可以试试传递参数时传递object[]这个类型,只是想法,具体行不行你试试

之前我也想过Object,刚才试了试确实也不行,需要转换,只是有什么高效的转换方法呢?
回复 使用道具 举报
int[],char[],double[],byte[]的父类都是object,传参数传object类型就可以了
回复 使用道具 举报
魏福伟 发表于 2013-3-28 13:04
int[],char[],double[],byte[]的父类都是object,传参数传object类型就可以了

光传Object不行的

主要是怎么合理的转换类型,返回去时怎么返回和传进来的类型一样。

评分

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

查看全部评分

回复 使用道具 举报
写了个小程序,不知道对你有没有帮助:
  1. public class Instanceof {
  2.         public static void print(Object[] obj){
  3.                 if(obj instanceof Integer[]){
  4.                         System.out.println("integer");
  5.                 }else if(obj instanceof Character[]){
  6.                         System.out.println("character");
  7.                 }else{
  8.                         System.out.println("...");
  9.                 }
  10.         }
  11.        
  12.         public static void main(String[] args) {
  13.                 print(new Character[]{'2'});
  14.         }
  15. }
复制代码
回复 使用道具 举报
fighting 发表于 2013-3-28 13:15
写了个小程序,不知道对你有没有帮助:

我是这么改的,但还是错误。

intanceof好像比较的是一个对象是不是属于某个类的吧。额,我也不太懂用intanceof。
回复 使用道具 举报
丘凤光 发表于 2013-3-28 13:31
我是这么改的,但还是错误。

intanceof好像比较的是一个对象是不是属于某个类的吧。额,我也不太懂用int ...

呵呵,不知道你要实现什么功能。。。
可以把打印数组元素的所有类型放在上面的这一个方法也行,
只不过方法的参数要写成Object[] obj 数组类型的
针对不同的数据类型做不同的处理
回复 使用道具 举报
fighting 发表于 2013-3-28 13:44
呵呵,不知道你要实现什么功能。。。
可以把打印数组元素的所有类型放在上面的这一个方法也行,
只不过方 ...

还是不行啊,换Object[]的话int[]传都传不进去。


我想要的这个函数的功能是:我传一个数组(int[]、char[]类型不确定)进这个函数,然后函数帮我打印出这个数组。
回复 使用道具 举报
丘凤光 发表于 2013-3-28 13:31
我是这么改的,但还是错误。

intanceof好像比较的是一个对象是不是属于某个类的吧。额,我也不太懂用int ...

arr=(int[])arr;
这句执行完arr还是object类型的,(int[])arr是(int[])类型的,又把他赋给了object类型的;
object类型中没有length
回复 使用道具 举报
丘凤光 发表于 2013-3-28 13:12
光传Object不行的

主要是怎么合理的转换类型,返回去时怎么返回和传进来的类型一样。

传参数用object,进入函数中在吧他转化成他原有的类型,进行处理
回复 使用道具 举报
本帖最后由 fighting 于 2013-3-28 14:07 编辑
丘凤光 发表于 2013-3-28 13:54
还是不行啊,换Object[]的话int[]传都传不进去。

你还是自己仔细研究一下吧,不能总是问别人

这里不能传int[],而是要传Integer[],自己多研究一下,呵呵
  1. public class Instanceof {
  2.         public static void print(Object[] obj){
  3.                 /*
  4.                  * 如果只是打印数组元素,直接print就可以了,在print方法中已经对不同的数据类型做了转换
  5.                  */
  6.                 for(Object arr : obj){
  7.                         System.out.println(arr);
  8.                 }
  9.                
  10.                 /*
  11.                  * 如果想对不同的数据类型做不同的操作,用下面的步骤,可以用instanceof判断一下,做了转化以后再操作
  12.                  */
  13. //                if(obj instanceof Integer[]){
  14. //                        System.out.println("integer");
  15. //                }else if(obj instanceof Character[]){
  16. //                        System.out.println("character");
  17. //                }else{
  18. //                        System.out.println("...");
  19. //                }
  20.         }
  21.         
  22.         public static void main(String[] args) {
  23. //使用原生类型的包装类,这些类是Object的子类
  24.                 print(new Character[]{'2', 'a', 'Q'});
  25.         }
  26. }
复制代码
回复 使用道具 举报
魏福伟 发表于 2013-3-28 13:57
arr=(int[])arr;
这句执行完arr还是object类型的,(int[])arr是(int[])类型的,又把他赋给了object类型的 ...

改成了这样终于可以了。
  1. private static void print(Object obj)
  2.         {
  3.                 if(obj instanceof int[])
  4.                 {
  5.                         int[] arr=(int[])obj;
  6.                         for(int i=0;i<arr.length;i++)
  7.                         {
  8.                                 System.out.print(arr[i]+" ");
  9.                         }
  10.                         System.out.println();
  11.                 }
  12.                 else if(obj instanceof char[])
  13.                 {
  14.                         char[] arr=(char[])obj;
  15.                         for(int i=0;i<arr.length;i++)
  16.                         {
  17.                                 System.out.print(arr[i]+" ");
  18.                         }
  19.                         System.out.println();
  20.                 }
  21.                 else
  22.                         return;
  23.         }
复制代码
两个函数虽然合在一起了,美中不足的是和最初的愿望相反,代码不增反减了。
不过好像也没什么更好的办法了。
谢谢大家,又学了个新知识点。

回复 使用道具 举报
丘凤光 发表于 2013-3-28 13:54
还是不行啊,换Object[]的话int[]传都传不进去。

int[]类型的是object的,int不是object的,
你把 int[] arr = new int[4];  
object[] obj = arr;这句相当于把int类型的赋值给object的
回复 使用道具 举报
魏福伟 发表于 2013-3-28 15:00
int[]类型的是object的,int不是object的,
你把 int[] arr = new int[4];  
object[] obj = arr;这句相 ...

是这样么?我怎么好像记得比向东老师初级视频里说的是,arr是数组名称,它指向int[4]。Object[] obj=arr是把数组int[4]的地址赋给obj,使得obj指向数组int[4]。我是这么理解的。
回复 使用道具 举报
丘凤光 发表于 2013-3-28 15:54
是这样么?我怎么好像记得比向东老师初级视频里说的是,arr是数组名称,它指向int[4]。Object[] obj=arr ...

赋得是内存地址,我的意思是
int[] arr = new int[4];  
object[] obj = arr;这句会报错,
看看这个http://bbs.itheima.com/thread-42601-1-1.html
回复 使用道具 举报
LZ你好 试一试这个看行不行

        public static void sop(Object str)
        {
                System.out.println(str);
        }
回复 使用道具 举报
HM朱蛟 发表于 2013-3-28 18:34
LZ你好 试一试这个看行不行

        public static void sop(Object str)

不行哦,这样打印的是地址
[I@811c88
[I@811c88
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马