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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦晨光 中级黑马   /  2012-7-18 20:43  /  2729 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 焦晨光 于 2012-7-19 08:29 编辑

先看程序:
public class VarArgsDemo{
    public static void main(Staring[] args){
        printMax(34,3,3,2,56.5);
        printMax(new double[]{1,2,3});
}
    public static void printMax(double...numbers){
        if(numbers==0){
            system.out.println("No argument passed");
            return;
}

         double result = numbers[0];
         for(int i = 1;i<number.length;i++)
            if(numbers>result)
                result = numbers;
        system.out.println("The max value is" + result);

}
}

很纠结:
我想知道printMax(34,3,3,2,56.5);语句 在调用printMax方法时 发生了什么?
    public static void printMax(double...numbers)这条语句 到底是什么意思?

7 个回复

倒序浏览
本帖最后由 康大玮 于 2012-7-18 20:53 编辑

public class VarArgsDemo{
    public static void main(String[] args){
        printMax(34,3,3,2,56.5);
        printMax(new double[]{1,2,3});
}
    public static void printMax(double...numbers){
        if(numbers.length==0){
            System.out.println("No argument passed");
            return;
}

         double result = numbers[0];
         for(int i = 1;i<numbers.length;i++)
            if(numbers>result)
                result = numbers;
        System.out.println("The max value is" + result);

}
}
你的代码有几处错误

public static void printMax(double...numbers)
这里用到了可变参数
可变参数。其实就是一种数组参数的简写形式。
                不用每一次都手动的建立数组对象。
                只要将要操作的元素作为参数传递即可。
                隐式将这些参数封装成了数组。








评分

参与人数 1黑马币 +30 收起 理由
蒋映辉 + 30

查看全部评分

回复 使用道具 举报
  1. /*
  2. * 更正你的代码
  3. * */
  4. public class Demo2 {
  5.         public static void main(String[] args) {
  6.                 printMax();
  7.                 //将你传入的数据,先转换为double,再存入一个double类型的数组中。若有不能转的数据,则会报错。
  8.                 printMax('a',34, 3.0, 2, 6.5);       
  9.                 //传入的若为数组,则将数组引用numbers指向你传的数组对象。
  10.                 printMax(new double[] { 1, 2, 3 });
  11.         }

  12.         public static void printMax(double... numbers) {
  13.                 if (numbers.length == 0) {        //这里是判断数组是否为空,即有没有传入数据
  14.                         System.out.println("No argument passed"); //若没有数据打印这句
  15.                         return;        //方法结束
  16.                 }

  17.                 double result = numbers[0];
  18.                 for (int i = 1; i < numbers.length; i++) { //遍历数组,即传入的数据
  19.                         if (numbers[i] > result) {
  20.                                 result = numbers[i];        //用变量result记录下最大值
  21.                         }
  22.                 }
  23.                 System.out.println("The max value is" + result); //打印最大值
  24.         }
  25. }
  26. /*打印结果为:
  27.         No argument passed
  28.         The max value is97.0
  29.         The max value is3.0*/
复制代码

评分

参与人数 1黑马币 +30 收起 理由
蒋映辉 + 30

查看全部评分

回复 使用道具 举报
本帖最后由 马州州 于 2012-7-18 21:14 编辑

楼主代码有一些错误,我先给你改了一下
  1. public class VarArgsDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. printMax(34,3,3,2,56.5);
  6. printMax(new double[]{1,2,3});
  7. }
  8. public static void printMax(double...numbers)
  9. {
  10. if(numbers.length==0)
  11. {
  12. System.out.println("No argument passed");
  13. return;
  14. }

  15. double result = numbers[0];//result是角标0的值,用角标0去比较角标1
  16. for(int i = 1;i<numbers.length;i++)//这里的循环是执行下面的if语句
  17. if(numbers[i]>result)//比较角标1和角标0的值
  18. result = numbers[i];//如果角标1大于角标0,那么就把角标1的赋给result
  19. System.out.println("The max value is" + result);

  20. }
  21. }
复制代码
我想知道printMax(34,3,3,2,56.5);语句 在调用printMax方法时 发生了什么?
你这个程序是输出数组的最大值的,用到再调用printMax的时候,首先double result = numbers[0];
result是角标0的值,用角标0去比较角标1,如果角标1的值大,就把角标1的赋给角标result,然后for循环,x++了,这时x就等于2了,用result的值去跟角标2的值比较,一次类推
最后就得出最大的值了

public static void printMax(double...numbers)这条语句 到底是什么意思?
这个是数组参数的简写形式,不用每次手动的建立数组,很容易理解的,就是不用每次都去定义一个数组

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
首先先解释一下public static void printMax(double...numbers){}
1.JDK5允许把类型相同但个数不定的参数传递给方法
2.形参声明发法:类型名称...参数名称
3.java把这个变长的参数作为数组处理,相当于长度不定的数组numbers[]相当于
public static void printMax(double[] numbers){}
我想知道printMax(34,3,3,2,56.5);语句 在调用printMax方法时 发生了什么?
if(numbers==0){
            system.out.println("No argument passed");
            return;
先判断是否有参数?没有则返回该函数,什么都不做。显然有五个参数,接着执行下面代码
double result = numbers[0];//把第一个参数赋给result
         for(int i = 1;i<number.length;i++)//for循环找出最大的参数并将其打印出来
                if(numbers>result)
                result = numbers;
        system.out.println("The max value is" + result);

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
printMax(1,2,3);
        printMax(new double[]{1,2,3});
这2个在书写上有区别实际效果没区别 地一行 你执行时 jdk会自动帮你把1,2,3打包成double数组在传给调用者
地2行 因为高版本的运行低版本编译的程序  而1.5以下没有可变参数 为了兼容1.5版本以下的版本  如果形成是基本类型的数组的话 那么你的实参是该类型的数组的会JDK不会帮你打包直接把该数组传给调用者  
所以对于形参是可变参数的方法  传过来的始终是一个数组  如果形成是泛型可变参数如T。。。t  那么传过来的对象则必须是一个引用类型数组 如果实参是引用类型数组的话就不会被自动打包直接传给该方法 如果不是引用类型数组的话如基本类型数组 和不是数组的类型 则会被系统打包成该类型的数组在传给该方法 如形参是1,2,3打包成integer的数组传过去 形参是1,'2' 打包成Object的数组传过去  int[]  打包成int的2维数组传过去即int[][]   int[] 是一个引用类型 int[][]则是一个引用类型数组 “f",String[]  则打包成Object传过去  
如果形参不是泛型和Object的话 则实参只要是数组则就直接传过去不是数组的打包成数组传过去    如果形成是Object的可变参数的话 那么实参除非是单独的一个Object数组 否则都发被打包了在传过去   
当你有了一个可变参数的方法时如果参数是泛型的可变参数 那么重载方法的形参就不能是Object[] o  如果形参不是泛型的话 那么重载形式就不能有形参为该可变参数元素类型的数组存在

这一特性也为我们反射方法参数为泛型和可变参数的方法成为可能 如果方法的参数是泛型那么 反射该方法是参数为Object  如果参数为泛型数组 则反射时则为Object[]  如果形参为可变参数 那么反射时参数则为该类型的数组则可 如果是泛型可变参数则反射参数则是Object的数组   
回复 使用道具 举报
杨康 中级黑马 2012-7-18 21:43:49
7#
public static void printMax(double...numbers)这里用了可变参数来传递参数。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式,
printMax(34,3,3,2,56.5)等同于编译器帮你创建了一个double数组 double[] d = {34,3,3,2,56.5},
剩下就代码内容就是比较元素大小并赋值的操作了。
回复 使用道具 举报
/*
再此前你的代码出错颇多,而且不规范,我已将其更正,虽更正了,但还是保留了部分的原有数据
希望以后,将代码尽量规范化

*/
public class VarArgsDemo
{
   public static void main(String[] args)
        {
           printMax();//无参函数

       printMax(34.1,3.2,3.5,2.4,56.5);//这句话做的事情是:将这系列数字存放到数组名为numbers的数组中

       printMax(new double[]{1,2,3});//将数组对象的引用传给numbers

        }
   public static void printMax(double...numbers)//这句话的做的事情:将该系列的数存入double类型的数组中
   {
                //判断数组是否为空
        if(numbers.length==0)

                        {

            System.out.println("No argument passed");//如果为空,则执行这句话

            return;//结束该函数,返回主函数执行下一条语句

                        }
                       
        double result = numbers[0];//定义个变量并初始化

        for(int i = 1;i<numbers.length;i++)//遍历数组
                {
            if(numbers[i]>result)

                result = numbers[i];

                }
                        System.out.println("The max value is = " + result);               
        }
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马