本文主要讲数组的初始化方法、可变参数列表以及可变参数列表对函数重载的影响。

1.数组初始化

定义数组的方式:

  int[] arr1; 或  int arr1[];

数组初始化

  通过上边的定义,我们只是得到了一个数组的引用。这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间。想要给数组对象分配存储空间,必须使用初始化表达式。

a.在数组创建的地方进行初始化,如:

int[] arr1 = {1,2,3,4,5};

  这种方式等价于使用new来进行存储空间分配。

b.给数组的引用赋值,如:

int[] arr1 = {1,2,3,4,5};
int[] arr2;
arr2 = arr1;

  复制的只是一个引用。如下图:

  所有的数组都有一个固定成员length,通过它可以知道数组元素的个数。

c.当不确定数组元素的个数时的数组创建

  当数组元素个数不确定时,我们可以直接使用new在数组里创建元素。注意new可以应用于基本类型的数组,但是不能应用于单个的基本类型。

d.在定义数组的同时也可以进行初始化,当创建一个非基本类型的数组时,实际上创建的是引用数组。

 可以用花括号列表的形式来初始化对象数组,有两种形式:

2.可变参数列表

下图标出了参数列表的使用方式、格式和对传入参数的要求。

2.1 列表参数类型可以不同的情况

可变参数类型为Object,因为所有的类都直接或间接的继承自Object类,可以向上转型为Object,因此参数列表中的类型可以不一致。

输出如下图:

2.2 列表参数类型必须相同的情况

  当然可变参数参数列表也可以作为函数的一个参数传入,如下图。这里的参数列表中的参数类型为string,则所有的参数必须是string类型,与上面的程序不同。

2.3 可变参数列表中的参数可以是任何类型,包括基本类型

下面是可变参数列表为数组的例子:

从输出结果的最后两行可知,可变参数列表实际使用的是基本类型,不依赖自动包装机制。

2.4 可变参数列表和自动包装机制

但是,我们要知道,可变参数列表和自动包装机制可以“共处”,如下图:

2.5 可变参数列表与函数重载

可变参数列表使重载过程变得复杂:

在上面的所有带参数的函数调用,编译器都会使用自动包装机制来匹配重载的方法,然后调用最匹配的方法。但是不使用使用参数来f()时,编译器会二义性错误:

  Exception in thread "main" java.lang.Error: Unresolved compilation problem:
  The method f(Character[]) is ambiguous for the type OverloadingVarargs

  at thingjinjava.OverloadingVarargs.main(OverloadingVarargs.java:25)

那么,如何解决这个问题呢?

可以尝试着在某个方法中增加一个非可变参数来解决该问题。

可是,程序仍然无法通过编译,还是报上面同样的错误。

但是,当我们在给这两个函数都添加一个非可变参数,问题就可以解决了。

Java之路(四)数组初始化的更多相关文章

  1. java基础(四)

    一.面向对象的三个基本特征: 1.封装,将对象的实现细节隐藏起来,并通过公共接口暴露相关功能: 2.继承,代码复用的表现,当子类继承父类后,子类作为一种特殊的父类,直接获得父类的属性和方法: 3.多态 ...

  2. java 数组声明定义 数组内存分配 数组初始化 数组引用 数组的遍历

    一,数组的定义 Java 中定义数组的语法有两种: 1. type arrayName[]; 2. type[] arrayName;type 为Java中的任意数据类型,包括基本类型和组合类型,ar ...

  3. java基础基础总结----- 数组深入理解(四)

    一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的元素可以是任何数据类型,包括基 ...

  4. java数组初始化

    java数组初始化 //静态初始化数组:方法一 String cats[] = new String[] { "Tom","Sam","Mimi&qu ...

  5. java 数组初始化

    一维数组 1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5} ...

  6. [转]Java数组初始化详解

    一维数组1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5}; ...

  7. Java 代码学习之数组的初始化

    我们都很熟悉Java中的数组,它具有查询快,增删慢的特点.但是通常我们自认为很了解它的用法,却容易忽略一些小细节.今天通过一段代码来简单了解数组初始化中的一些我们容易忽略的地方. package da ...

  8. JAVA学习笔记--数组初始化

    JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...

  9. Java编程思想(四)初始化和清除

    4.1用构建器自动初始化 若某个类中有一个构建器,那么在创建对象时,Java会自动调用哪个构建器    在Java中构建器的名字必须与类名相同,这样可以保证这样一个方法惠子初始化期间自动调用: 利用构 ...

随机推荐

  1. debian9部署jenkins

    这里记录两种部署方式,一种是通过包管理工具直接安装,另一种是用tomcat作为web容器运行jenkins.个人倾向第一种,部署简单,而且维护起来方便很多. 用包管理工具aptitude部署jenki ...

  2. 解题:SDOI 2011 消耗战

    题面 本身求答案是简单的树上DP,只需要求出根到每个点路径上的最小值,然后考虑割连父亲的边还是割所有儿子即可,但是每次都这样做一次显然不能通过,考虑优化 用虚树来优化:虚树是针对树上一些点建出来的一棵 ...

  3. Philosopher

    Description ​ 给你一个长度为\(n\)的序列\(a_i\)和\(m\)次操作,要支持两种操作: \(1\ l\ r\ flag\):将\([l,r]\)内的数排序,\(flag=1\)表 ...

  4. (转)Maven学习总结(二)——Maven项目构建过程练习

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...

  5. JDK环境变量的配置1

    JDK环境变量的配置 ... 1.安装完JDK后配置环境变量  计算机→属性→高级系统设置→高级→环境变量   2.系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(我的安装目录 ...

  6. 第一节 Spring的环境搭建

     正在构建,扫一扫,敬请期待 和玩得来的人在一起玩才叫玩! 和玩不来的人在一起玩,那种感觉就像加班啊! 关注胖个人微信公众账号,希望对各位学生有所帮助! --胖先生 Spring框架,什么是Sprin ...

  7. python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)

    一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...

  8. HDU 1524 树上无环博弈 暴力SG

    一个拓扑结构的图,给定n个棋的位置,每次可以沿边走,不能操作者输. 已经给出了拓扑图了,对于每个棋子找一遍SG最后SG和就行了. /** @Date : 2017-10-13 20:08:45 * @ ...

  9. Comparing Differently Trained Models

    Comparing Differently Trained Models At the end of the previous post, we mentioned that the solution ...

  10. LVS原理详解(3种工作模式及8种调度算法)

    2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法)   LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong  发布日期: ...