Java可变长参数

可变长参数在Java中 在Java1.5之后在方法上传参时便出现了**"…"**,这三个点的学名叫做可变长参数,也就是相当于一个数组,能够传入0个至n个参数 public static void main(String[] args) { String[] t1 = {}; String[] t2 = {"java","C++"}; String t3 = "java"... 阅读详情

Java中可变长参数的使用及注意事项

在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");print("hello","张三", "alexia");下面介绍如何定义可变长参数 以及如何使用可变长参数。

1. 可变长参数的定义

使用...表示可变长参数,例如

print(String... args){

   ...

}

在具有可变长参数的方法中可以把参数当成数组使用,例如可以循环输出所有的参数值。

print(String... args){

   for(String temp:args)

      System.out.println(temp);

}

2. 可变长参数的方法的调用

调用的时候可以给出任意多个参数也可不给参数,例如:

print();

print("hello");

print("hello","lisi");

print("hello","张三", "alexia")

3. 可变长参数的使用规则

3.1 在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。看下面代码的输出:

复制代码

复制代码

package com;

// 这里使用了静态导入
import static java.lang.System.out;

public class VarArgsTest {

    public void print(String... args) {
        for (int i = 0; i < args.length; i++) {
            out.println(args[i]);
        }
    }

    public void print(String test) {
        out.println("----------");
    }

    public static void main(String[] args) {
        VarArgsTest test = new VarArgsTest();
        test.print("hello");
        test.print("hello", "alexia");
    }
}

复制代码

复制代码



3.2 如果要调用的方法可以和两个可变参数匹配,则出现错误,例如下面的代码:

复制代码

复制代码

package com;

// 这里使用了静态导入
import static java.lang.System.out;

public class VarArgsTest1 {

    public void print(String... args) {
        for (int i = 0; i < args.length; i++) {
            out.println(args[i]);
        }
    }

    public void print(String test,String...args ){
          out.println("----------");
    }

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", "alexia");
    }
}

复制代码

复制代码

对于上面的代码,main方法中的两个调用都不能编译通过,因为编译器不知道该选哪个方法调用,如下所示:



3.3 一个方法只能有一个可变长参数,并且这个可变长参数必须是该方法的最后一个参数

以下两种方法定义都是错误的。

 public void test(String... strings,ArrayList list){
  
 }
 
 public void test(String... strings,ArrayList... list){
  
 }
 

4. 可变长参数的使用规范

4.1 避免带有可变长参数的方法重载:如3.1中,编译器虽然知道怎么调用,但人容易陷入调用的陷阱及误区

4.2 别让null值和空值威胁到变长方法,如3.2中所示,为了说明null值的调用,重新给出一个例子:

复制代码

复制代码

package com;public class VarArgsTest1 {

    public void print(String test, Integer... is) {
        
    }

    public void print(String test,String...args ){
          
    }

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", null);
    }
}

复制代码

复制代码

这时会发现两个调用编译都不通过:

 

因为两个方法都匹配,编译器不知道选哪个,于是报错了,这里同时还有个非常不好的编码习惯,即调用者隐藏了实参类型,这是非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。对于本例来说应该做如下修改:

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        String[] strs = null;
        test.print("hello", strs);
    }

4.3 覆写变长方法也要循规蹈矩

下面看一个例子,大家猜测下程序能不能编译通过:

复制代码

复制代码

package com;

public class VarArgsTest2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 向上转型
        Base base = new Sub();
        base.print("hello");
        
        // 不转型
        Sub sub = new Sub();
        sub.print("hello");
    }

}

// 基类
class Base {
    void print(String... args) {
        System.out.println("Base......test");
    }
}

// 子类,覆写父类方法
class Sub extends Base {
    @Override
    void print(String[] args) {
        System.out.println("Sub......test");
    }
}

复制代码

复制代码

答案当然是编译不通过,是不是觉得很奇怪?

 

 

第一个能编译通过,这是为什么呢?事实上,base对象把子类对象sub做了向上转型,形参列表是由父类决定的,当然能通过。而看看子类直接调用的情况,这时编译器看到子类覆写了父类的print方法,因此肯定使用子类重新定义的print方法,尽管参数列表不匹配也不会跑到父类再去匹配下,因为找到了就不再找了,因此有了类型不匹配的错误。

这是个特例,覆写的方法参数列表竟然可以与父类不相同,这违背了覆写的定义,并且会引发莫名其妙的错误。

这里,总结下覆写必须满足的条件:

(1)重写方法不能缩小访问权限;

(2)参数列表必须与被重写方法相同(包括显示形式);

(3)返回类型必须与被重写方法的相同或是其子类;

(4)重写方法不能抛出新的异常,或者超过了父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。

 

最后,给出一个有陷阱的例子,大家应该知道输出结果:

复制代码

复制代码

package com;

public class VarArgsTest {
    public static void m1(String s, String... ss) {
        for (int i = 0; i < ss.length; i++) {
            System.out.println(ss[i]);
        }
    }

    public static void main(String[] args) {

        m1("");
        m1("aaa");
        m1("aaa", "bbb");
    }
}

复制代码

复制代码

音频降采样系数 如果需要把8K, 16K, 32K, 48K采样率的音频数据降为4K的音频数据, 最简单的方法根据降频倍数来取点, 但是线性度不好. 另一种线性度好一点的方法是: 取适当个数的点数, 各点乘以各自点的系数, 然后相加取平均值. 降频倍数与系数的关系如下: 2倍:     {0.3, 0.4, 0.3} 4倍:    {0.15, 0.2, 0.3, 0.2, 0.15} 8倍:   {0 阅读详情

相关推荐

从学生项目到工程实践:手把手教你用ATE测试电源芯片的Rdson与漏电流

本文详细介绍了如何将学术级的电源芯片测试方案转化为工业级解决方案,重点讲解使用ATE设备测试Rdson(导通电阻)和漏电流的关键技术。从设备选型、测试夹具设计到量产环境下的工程化实现,提供了实用的优化技巧和常见问题解决方案,帮助工程师提升测试效率和精度。

weixin_42525289的博客 180

Java中可变长参数的使用及注意事项

在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");print("hello","张三", "alexia");下面介绍如何定义可变长参数 以及如何使用可变长参数。1. 可变长参数的定义 使用...表示可变长参数,例如print(

weixin_33701617的博客 741

Kindle使用USB数据线传书封面无法显示问题

不建议按这个解决封面问题,首先USB多次插拔麻烦,其次就是我起初按博主方法没啥问题,后面无论我怎么个顺序都出现了‘暂无图片’,我的建议是在亚马逊退出国内只能USB传书的情况下,下载一个calibre 和。飞行模式下用calibre传书到kindle ,然后用Fix Kindle Ebook Cover 修复一下,后面你要继续飞行模式还是连网随你便,两步完事。2,‘’发送到设备’的时候也最好选择 ‘发送特定格式至’ 选择具体的电子书格式,你的电子书是azw3就选azw3,是mobi就选mobi。

meser88的博客 7416

Java基础-可变长参数

本篇目录 1、什么是可变长参数 2、可变长参数的定义 3、可变长参数的使用 4、遍历可变长参数 1、什么是可变长参数 可变长参数顾名思义是可以改变长度的参数,意为传入的参数个数可以不固定。 Java中什么数据类型可以改变长度?当然是数组。确实,在JDK5之前的确是使用数组来实现可变长参数的。 那么什么是可变长参数?如下代码: public static void test(String[] args){ for(String str:args){ System.out.print

二饭的博客 6926

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3941

苹果搜索广告ASA开户教程

阅读导航 一、创建账号 1、登录网站 2、填写账号主体信息 3、填写商家和发票信息 4、选择付款方式 二、上传审核材料 1、上传文件 2、请求审批 3、上传文件中的常见问题 一、创建账号 1、用Apple ID登录ASA网站 首先我们进入开户网址:https://app-ads.apple.com/ 如果已拥有Apple ID,直接登录即可,如果没有Apple ID,可以先按照步骤创建Apple ID,再返回登录。 注意,这里登录的Apple ID也有讲究: ① 如果是开发

testflight121的博客 2128

Java学习之Varargs机制

Varargs,可变长度参数,具体来说是形参。

lonelymanontheway的博客 632

Isaac Lab强化学习实战:用SO-ARM101机械臂实现抓取任务(附B站视频教程)

本文详细介绍了如何使用Isaac Lab强化学习框架,在SO-ARM101机械臂上实现抓取任务的完整实战流程。内容涵盖从环境搭建、奖励函数设计、训练调参到模型部署的各个环节,并分享了Sim-to-Real迁移的关键技巧,旨在帮助开发者高效完成机器人强化学习项目。

weixin_29070721的博客 1101

Varargs(可变参数类型)详解

java Varargs详解    在java实际开发中,很多时候我们无法确定一个函数的参数个数。以一个能实现求和的函数为例,事先你不知道有多少个数会被相加,你甚至不会知道他们的类型是什么,但是,Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配。即使是通过重载机制,为同一个方法提供带有不同数量的形参的版本,仍然不能达到让实参数量任意变化的目的。在

u013573135的专栏 3189

系统安装(kuntaiR522 kvm安装)

鲲泰R522服务器kvm安装rocky

weixin_46396917的博客 1820

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 509

[J2SE 1.5]逐渐挖掘Varargs

.article {padding:1em;background:white;}.abstract {padding:1em 1ex 1em 2em;}.author, .date {padding:0.5ex 0 0 0;}h1.title, h2.major, h3.minor, h3.listing { margin:1ex 2px 1ex;color:#0066CC

孙海涛的谈笑间 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java中可变长参数

1 ** 2 * Created by Lenovo on 2017/12/10. 3 * java中可变长参数 4 */ 5 public class reflect04 { 6 7 //m1有一个int类型的可比变长参数 8 //m1在调用的时候实参可以是0-N个 9 public static void m1(i...

ao63946的博客 111

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java——可变长参数

既然是参数,一定与方法有关 1、可变长参数形式:类型名... 可传递0~N个参数,都会执行方法 public class Test { public static void m1(int... a)//a为一个可变长参数 { System.out.println("Test"); } public static void main(String[] args) { m1(); m1(1); m1(1,3,5,7,9);//m1方法在调用的时候,传递的参数可以是0~N个 }

qq_39622795的博客 253

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java中可变长参数的使用方法

Java中可变长参数的使用及注意事项1. 可变长参数的定义使用…表示可变长参数,例如 print(String... args){ ... }在具有可变长参数的方法中可以把参数当成数组使用,例如可以循环输出所有的参数值。 print(String... args){ for(String temp:args) System.out.println(temp); }2. 可变长参数的

闵浮龙的博客 3924

java中的可变长参数

什么叫做可变长参数:可变长参数就是我们给一个函数传参的时候,我们不确定具体传参的个数,就可以使用可变长参数,其本质就是一个数组 package test1; import java.util.LinkedList; public class testTest { public static void main(String[] args) { // TODO Auto-genera...

qq_37244548的博客 312

Java 可变长参数

可变长参数

yuan_dai_ma的博客 450

Java 可变长参数的使用及特性

专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 Java 核心知识专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java 核心知识 [[toc]] 一、可变长参数的定义 使用 类型... 名称 定义为可变长参数(Varargs),一个方法只能有一个可变长参数并且必须是方法最后一个参数。 void method(Str...

2.wa 1160

java可变长参数列表

package com.liufei.VariableParametersList; /** * Created with IntelliJ IDEA. * User: lenovo * Author: liufei * Description: java可变长参数列表 */ public class VariableParametersList { public static v

编程的艺术 2267

Java可变长参数列表

可以把类型相同但个数可变的参数传递给方法,方法的参数声明为: (类型名……参数名) 在方法声明中,指定类型后紧跟着省略号(...),只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数,任何常规参数必须在它之前。Java将可变长参数当成数组对待,可以将一个数组或可变的参数个数传递给可变长参数,当用可变的参数个数调用方法时,Java会创建一个数组并把参数传给它。 printMax...

qq_38497266的博客 458

Java中可变长参数的使用

原文章地址:http://blog.youkuaiyun.com/robinjwong/article/details/45039633 Java中可变长参数的使用及注意事项 在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");

u012481520的专栏 366

Java可变长参数的定义及使用

Java可变长参数的定义及使用 作者:郎佳星 什么是可变长参数: 可变长参数是一种参数集合,在集合中参数的数量的不确定的,可能为一个或者多个,也可能没有参数;在这个参数集合中的每个参数类型是不确定的,我们将这个参数集合称之为可变的长参数。 关于可变长参数...

chilupian3962的博客 2008

可变长参数java反射,Java可变长参数

packagecom.wkcto.chapter03.demo01;/***可变长参数*1)可变长参数用来接收任意个数据*2)定义可变长参数*方法名(参数类型参数名,参数类型...可变长参数名)*说明:*1)可变长参数最多只能有一个*2)方法参数列表如果有多个参数,可变长参数只能放在参数列表的最后*3)在方法体中,可以把可变长参数当作数组使用*4...

weixin_29499829的博客 156
上一篇: python 之matplotlib.plot
下一篇: Android开发消除横向排列的多个Button之间的空隙
windscloud
博客等级 码龄9年 14粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值