Chapter5_初始化与清理_数组初始化与可变参数列表

一、数组初始化

  数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥有这个数组的存储空间。要获取数组的存储空间,必须要写初始化表达式,最朴素的表达式类型如下

1 int[] a = {1,2,3};

  如果在编写程序时,不能确定数组的长度,可以使用如下方式,直接用new在数组里创建元素

1 int[] a = new int[3];

  当创建对象数组时,数组中的元素仅仅是对象的引用,当试图使用数组中的空引用时,会引起编译器运行期错误,这是需要注意的,可以使用用花括号括起来的列表初始化对象数组。

1 Integer[]  = {
2     new Integer(1),
3     new Integer(2),
4     3,
5 }

  数组类型还有两个使用很多的方法,一个是length()方法,用来返回数组的长度,一个是.toString()方法,会将数组以可视化的方法打印出来。

二、可变参数列表

  先举一个可变参数的例子。

 1 class A{
 2
 3 }
 4
 5 public class test{
 6     static void print(Object... args){
 7         for(Object obj:args){
 8             System.out.print(obj + " ");
 9         }
10         System.out.println();
11     }
12     public static void main(String args[]){
13         print(new Integer(1), new Float(2.0), new Double(3.0));
14         print("a", "b", "c");
15         print(new A(), new A(), new A());
16     }
17
18 }

1 1 2.0 3.0 2 a b c 3 [email protected] [email protected] [email protected]

  这种方法的效果是可变参数列表和自动包装机制的和谐共处,使用了可变参数列表,当指定参数类型后,编译器会给你自动填充数组,即允许将一组事物当做列表传递给一个数组,并且将空参数列表传递给可变参数列表是可行的。除了object类型的参数列表,参数列表可以使用任何类型的参数,包括基本类型。

  使用可变参数列表,会使重载过程变得更加复杂,需要注意这种复杂带来的问题,以下是一个例子。

 1 public class test{
 2     static void f(Character... args){
 3         System.out.print("first");
 4         for(Character c:args){
 5             System.out.print(c + " ");
 6         }
 7         System.out.println();
 8     }
 9
10     static void f(Integer... args){
11         System.out.print("first");
12         for(Integer c:args){
13             System.out.print(c + " ");
14         }
15         System.out.println();
16     }
17
18     static void f(Long... args){
19         System.out.print("third");
20     }
21
22     public static void main(String args[]){
23         f(‘a‘, ‘b‘, ‘c‘);
24         f(1);
25         f(2, 1);
26         f(0);
27         f(0l);
28         //f();
29     }
30
31 }

  在这种情况下,不能调用f()方法,因为编译器会不知道该调用哪个方法了,这是可变参数列表带来的潜在的隐患。为了解决这种隐患,可以给每个参数列表都添加一个非可变参数,例如:

1 static void f(Integer i,Integer... args); 2 static void f(float i, float... args);

时间: 2024-10-05 08:51:25

Chapter5_初始化与清理_数组初始化与可变参数列表的相关文章

Chapter5_初始化与清理_构造器初始化

一.构造器初始化的基本顺序 在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性.看如下的一个例子. 1 class Window{ 2 Window(int marker){ 3 System.out.println("Window(" + marker + ")"); 4 } 5 } 6 7 class House{ 8 Window w1 = new Window(1); 9 House(){ 10 System.o

Chapter5_初始化与清理_成员初始化

在java中,成员初始化在使用之前应该都要保证已经完成初始化.对于在方法体中的局部变量,如果没有使用指定初始化的方法对成员变量进行初始化,编译器会提示一个错误.而对于类的数据成员,编译器会对这些成员赋予默认的初始值,下面这段代码反映了这一点. 1 package test1; 2 3 class InitialValue{ 4 public int i; 5 public boolean b; 6 public char c; 7 public float f; 8 public String

从头认识java-4.8 数组的初始化(2)-可变参数列表

接着上一节,我们这一章节来聊一下数组的另外一个应用:可变参数列表 1.可变参数列表带来的改变 在没有出现可变参数列表的时候,我们一般会使用数组来替代,但是有一个问题,每一次都需要先建立一个数组作为参数,不能动态的形成数组作为参数. package com.ray.ch04; public class Test { public static void printArray(Object[] objects) { for (int i = 0; i < objects.length; i++) {

Chapter5_初始化与清理_用构造器初始化

接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾占用的出现,为解决这些问题,java中提供了对构造器和垃圾清理器的支持,首先讨论构造器的问题. 为了保证程序的安全性,java中采用了构造器的机制来保证初始化.第一个问题就是命名的问题,java中的构造器规定名称必须和类名相同.这主要是出于如下的考虑,第一如果让编程者自行命名,则可能会产生于其他任何

Chapter5_初始化与清理_方法重载

方法重载是java中编译器在方法调用时采用的一个重要机制.起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机制,并且这种机制不仅限于构造器方法.下面这个例子提供了方法重载的构造器和一般方法的例子. 1 class tree{ 2 int height; 3 tree(){ 4 System.out.println("无参数构造器"); 5 } 6 7 tree(int height){ 8 th

函数(二)_全局变量声明、可变参数、关键字参数

1. global声明全局变量 #声明name这个变量为全局变量,只是写在函数里面 #写代码时,尽量不要用全局变量,会一直占用内存.       ------->{'name':'abc','sex':'29'} #字典和list,这种可变变量,不需要用global来声明,就可以直接改了 2.可变参数,参数组 #对于可变参数,非必填,没有限制参数个 name为位置参数,age为默认参数,*args为可变参数 #位置参数(必填参数),默认值参数(不必填),可变参数(不必填的,不限制参数个数) 3.

Thinking in JAVA笔记——第五章 初始化与清理

5.1用构造器确保初始化 为了确保安全性,强制在使用前进行初始化 Java构造器与类名相同,无参数构造器有叫做默认构造器. 5.2 方法重载 method overloading:重载,同名不同参 method overriding:重写/覆盖,子类覆盖父类 5.2.1区分重载方法 独一无二的参数类型表,否则编译不通过! 5.2.2涉及基本类型的重载 如果参数类型是int,short,byte,long等,自动定位到int而不会执行short,byte 因为默认常数就是int型,如果没有int,

五、初始化与清理

一.创建对象时,如果其类有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行. 二.每个重载方法都必须有独一无二的参数类型列表 如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升. 如果传入的数据类型较大,就得通过类型转换来执行窄化转换. 三.如果写的类中没有构造器,编译器就会自动帮你创建一个默认构造器. 四.this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用 this关键字也可以用于将当前对象传递给其他方法 使用thi

JAVA基础之初始化与清理

用构造器确保初始化 构造器与类名称相同;是一种特殊类型的方法,因为它没有返回值. 在创建对象时,会为对象分配存储空间,并调用相应的构造器. 不包含任何参数的构造器叫做默认构造器 方法重载 class Person { public Person() {} public Person(String name){} public Person(String name,int age){} } 区分重载 每个方法都有独一无二的参数类型列表 方法重载 1.如果传入的数据类型小于方法中声明的形式参数类型,