`

java 可变参数方法Object... objs

    博客分类:
  • java
 
阅读更多

public abstract List find(String hql, Object... values);
Object... values,你也可以认为是Object[]values,数组.

 

可变参数(Varargs)


  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是
函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);

  在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得
不是很有效。如果使用可变参数的话我们只需要一个函数就行了
public void write(Object... objs) {
   for (Object obj: objs)
      System.out.println(obj);
}
  在引入可变参数以后,Java的反射包也更加方便使用了。对于
c.getMethod("test", new Object[0]).invoke(c.newInstance(), new 
Object[0])),现在我们可以这样写了
c.getMethod("test").invoke(c.newInstance()),这样的代码比原来清楚了很多。

可变参数的调用

 public static void closeAll(Object... objs) {//可变参数
            for (Object obj : objs) {
                    if (obj instanceof Connection) close((Connection) obj);
                    if (obj instanceof Statement) close((Statement) obj);
                    if (obj instanceof ResultSet) close((ResultSet) obj);
            }
    }

 

 

 

 UtilDB  udb = new UtilDB();
        
         try{
            Connection     conn= udb.makeConnection();
             
             
                 Statement st =  conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 
                 ResultSet rt = st.executeQuery("select * from jobs");
             
          rt.last();
          System.out.println(rt.getRow()); 
         // rt.first();  //返回到第一条记录的位置
          rt.beforeFirst();  //反回到第一条记录的前面
        
        
        
         System.out.println("ok");
         if(rt.next())
         {
         System.out.println(rt.getInt(1)); //rs.getInt方法, 若数据库中记录的数值为null,getInt返回的是数值“0”,而不是null!
         System.out.println(rt.getInt(4));
         System.out.println(rt.getRow());  //是显示游标的当前行号 ,而非表的ID号
         }
         udb.closeAll(new Object[]{st, rt, conn}); 
         }catch(SQLException e)
         {
          e.printStackTrace();
         }finally {
                //udb.closeAll(new Object[]{st, rt, conn});
            }

 

 

 

 

static void printArray(Object...args){
     for(Object obj:args)
     System.out.print(obj+" ");
     System.out.println();
     }

     

printArray(new Object[]{
              new Integer(47),new Float(3.14),new Double(11.11)
              });
              printArray(new Object[]{"one","two","three"});

 

 

 

Java代码 复制代码 收藏代码
  1. public class VariArgs {   
  2.   
  3.     public static void main(String[] args) {   
  4.         test();   
  5.         test("aaa");   
  6.         test("aaa""bbb");   
  7.         test("aaa""bbb""ccc");   
  8.     }   
  9.   
  10.     public static void test(String... args) {   
  11.         System.out.println(args.getClass());   
  12.         for (String arg : args) {   
  13.             System.out.println(arg);   
  14.         }   
  15.     }   
  16. }  
public class VariArgs {

	public static void main(String[] args) {
		test();
		test("aaa");
		test("aaa", "bbb");
		test("aaa", "bbb", "ccc");
	}

	public static void test(String... args) {
		System.out.println(args.getClass());
		for (String arg : args) {
			System.out.println(arg);
		}
	}
}


第二个例子:

Java代码 复制代码 收藏代码
  1. public class VariArgs {   
  2.   
  3.     public static void main(String[] args) {   
  4.         test("aaa");   
  5.         test("aaa""bbb");   
  6.         test("aaa""bbb""ccc");   
  7.     }   
  8.   
  9.     public static void test(String arg, String... args) {   
  10.         System.out.println(arg);   
  11.         System.out.println("----------------");   
  12.         for (String s : args) {   
  13.             System.out.println(s);   
  14.         }   
  15.     }   
  16. }  
public class VariArgs {

	public static void main(String[] args) {
		test("aaa");
		test("aaa", "bbb");
		test("aaa", "bbb", "ccc");
	}

	public static void test(String arg, String... args) {
		System.out.println(arg);
		System.out.println("----------------");
		for (String s : args) {
			System.out.println(s);
		}
	}
}


   读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。
    不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
    对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.
    对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。
    以下是几种不正确使用不定长度参数的例子,请不要这样写程序:

  1. public static void test(Object... objs, Object obj);   
  2.   
  3. public static void test(Object obj1, Object... objs, Object obj2);   
  4.   
  5. public static void test(Object... objs1, Object... objs2);  
public static void test(Object... objs, Object obj);

public static void test(Object obj1, Object... objs, Object obj2);

public static void test(Object... objs1, Object... objs2);


   不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同)
   下面给出重载的示例:

  1. public class VariArgs {   
  2.   
  3.     public static void main(String[] args) {   
  4.         test("aaa");   
  5.         test("aaa""bbb");   
  6.         test("aaa""bbb""ccc");   
  7.     }   
  8.   
  9.     public static void test(Object... args) {   
  10.     }   
  11.   
  12.     public static void test(String arg, String... args) {   
  13.     }   
  14. }  
public class VariArgs {

	public static void main(String[] args) {
		test("aaa");
		test("aaa", "bbb");
		test("aaa", "bbb", "ccc");
	}

	public static void test(Object... args) {
	}

	public static void test(String arg, String... args) {
	}
}


   读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。
   然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:

  1. public class VariArgs {   
  2.   
  3.     public static void main(String[] args) {   
  4.         test();   
  5.         test("aaa");   
  6.         test("aaa""bbb");   
  7.         test("aaa""bbb""ccc");   
  8.     }   
  9.   
  10.     public static void test(String... args) {   
  11.         System.out.println(args.getClass());   
  12.         for (String arg : args) {   
  13.             System.out.println(arg);   
  14.         }   
  15.     }   
  16.   
  17.     public static void test(String arg, String... args) {   
  18.         System.out.println(arg);   
  19.         System.out.println("----------------");   
  20.         for (String s : args) {   
  21.             System.out.println(s);   
  22.         }   
  23.     }   
  24. }  
public class VariArgs {

	public static void main(String[] args) {
		test();
		test("aaa");
		test("aaa", "bbb");
		test("aaa", "bbb", "ccc");
	}

	public static void test(String... args) {
		System.out.println(args.getClass());
		for (String arg : args) {
			System.out.println(arg);
		}
	}

	public static void test(String arg, String... args) {
		System.out.println(arg);
		System.out.println("----------------");
		for (String s : args) {
			System.out.println(s);
		}
	}
}


    读者可以编译下这个程序,结果是编译不通过。为什么呢?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

分享到:
评论

相关推荐

    又小又快又无依赖Json序列化与反序列化

    Object[]objs=JsonUtil.instance().json2Obj(json,Object[].class); //泛型 DatagridReturn<Object> dgr=JsonUtil.instance().json2Obj(json,DatagridReturn.class,Object.class); List<Object> ...

    JDK1.5的五大新特性

    使用可变参数,可以轻松地编写能够接受不同数量参数的方法,而无需编写多个重载版本的方法。 例如,一个简单的打印方法: ```java public void write(Object... objs) { for (Object obj : objs) { System.out....

    jdk1.5 1.6 1.7的新特征总结

    可变参数允许一个方法接收不定数量的参数,只需在参数列表的末尾加上`...`。这使得编写接受任意数量参数的方法变得更加简单。例如: ```java public void write(Object... objs) { for (Object obj : objs) { ...

    JDK1.5和1.6新增特性[借鉴].pdf

    5. 可变参数(Varargs):JDK 1.5引入了可变参数,允许一个方法接收零个或多个相同类型的参数。这些参数在内部被当作数组处理。例如,`public void write(Object... objs)`方法可以接受任意数量的对象参数,简化了多...

    Java序列化多次追加到txt以及从txt反序列化

    objs.add(new MyObject("Charlie", 35)); for (MyObject obj : objs) { serializeAndAppend(obj, "objects.txt"); } List<MyObject> deserializedObjs = deserializeFromTxt("objects.txt"); for (MyObject ...

    J2ee入门之课堂笔记

    引入泛型后,Java实现了类型安全的参数化类型,即可以创建具有类型参数的类、接口和方法。这使得在编译阶段就可以检测到类型错误,避免了运行时可能出现的`ClassCastException`。 例如,在没有泛型的情况下,我们...

    libfreetype.so.6

    在Linux操作系统中,动态链接库(Dynamic Link Library,简称动态库)是系统提供的一种共享资源,它们包含了一组可重用的函数和数据,可供多个应用程序共享,极大地节省了系统资源。本文将深入探讨动态库中的一个...

    Java栈的实例-数组和链表两种方法 数组和链表.pdf

    private Object[] objs = new Object[16]; // 初始化数组 private int size; @Override public boolean isEmpty() { return size == 0; } // 其他方法实现... } ``` ### 链表实现栈 链表实现栈提供了更...

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    public Object intercept(Object obj, Method method, Object[] objs, MethodProxy proxy) throws Throwable { System.out.println("事物开始.........."); proxy.invokeSuper(obj, objs); System.out....

    java反射之Constructor

    Object[] objs = new Object[]{"12345", 1, 4}; String s2 = (String) constrct.newInstance(objs); ``` Constructor 类提供了关于类的单个构造方法的信息,包括构造函数的名称、参数类型、访问权限等信息,并提供了...

    java常用工具类的使用

    - `List asList(Object[] objs)`: 把指定的数组转换为`List`的对象。 - `int binarySearch(T[] objs, key)`: 在数组中查找`key`的位置。 **示例**: ```java int[] arrs = {12, 54, 12, 8765, 123, 34, 54, 23, 67};...

    JAVA导出TXT文件[参考].pdf

    Object[] objs = list.get(i); buff.write((objs[1].toString() + "\r\n").getBytes("UTF-8")); } buff.flush(); buff.close(); ``` 使用ServletOutputStream获取HTTP响应的输出流,通过BufferedOutputStream...

    Java占用内存的研究.pdf

    再比如,一个包含1000个null引用的Object数组Object[] objs = new Object[1000];,每个空引用占用4个字节,加上对象头,总共需要4 * 1000 + 对象头大小的内存空间。 文档也探讨了Java中各种包装类(Wrapper class)...

    java使用jdbc插入信息时获取id1

    在循环中,`setObject(i + 1, objs[i])`用于设置SQL语句中的占位符,其中`i+1`是参数的位置,`objs[i]`是对应的值。 4. **执行插入操作**:调用`preparedStatement.executeUpdate()`执行SQL插入语句。这个方法不...

    史上最全Java表单验证封装类

    - `isNull(Object[] objs)`:判断对象数组是否为空。 - `isNull(Integer integer)`:判断Integer对象是否为零或空。 - `isNull(Collection collection)`:判断集合是否为空。 - `isNull(Map map)`:判断Map是否为空...

    mongoose 分页代码

    项目npm插件目录下找到mongoose,将这个文件的代码覆盖上去就行了 案例 OrderInfo.execPageQuery(+req.query.page, +req.query.count, where, null, {sort: ... total: objs.total, result: objs.rows }) } });

    asynchronous_fifo_异步FIFO_

    异步FIFO(Asynchronous FIFO)是数字系统设计中一种重要的数据存储结构,尤其是在高速通信、数据处理和接口设计等领域。这种FIFO与其他同步FIFO的主要区别在于其读写时钟域不同,使得数据可以在两个独立的时钟域...

Global site tag (gtag.js) - Google Analytics