Java数组的声明与创建

今天在刷Java题的时候,写惯了C++发现忘记了Java数组的操作,遂把以前写的文章发出来温习一下。

首先,数组有几种创建方式?

Java程序中的数组**必须先进行初始化才可以使用,**所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值,而在Java中,数组是静态的,数组一旦初始化,长度便已经确定,不能再随意更改。

声明数组变量

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

1dataType[] arrayRefVar; // 首选的方法 2 34 5dataType arrayRefVar[]; // 效果相同,但不是首选方法 c++沿用

但是以上只是声明了数组,并不能直接使用,因为没有为其分配内存空间,此时必须初始化。

例如以下代码在Java8中就会报错

1public class test{ 2 public static void main(String[] arg) { 3 int[] a; 4 a[0]= 1; 5 System.out.println(a[0]); 6 } 7} 8// 系统将报错 局部变量 a 可能尚未初始化 9// 进一步加入我个人的理解,声明的数组没有确定大小,没有办法分配内存空间,所有必须初始化 10// 但是以下代码在Java中是禁止的 11public class test{ 12 public static void main(String[] arg) { 13 int[10] a; 14 a[0]= 1; 15 System.out.println(a[0]); 16 } 17} 18// 系统将报错 标记“10”上有语法错误,删除此标记 19// 不能像c++这样初始化数组

所以,我们拥有两种初始化数组的方式

  1. 静态初始化:由程序猿自己确定每个数组元素的初始值,而数组的长度则由系统自己决定,例如:

    int[] a = {1,2,3,4,5}; System.out.println(a.length); // 第二行代码可以看出,数组拥有类的性质,可以用dot访问其变量 // 第一行代码静态初始化了数组整型数组a,赋予其固定的长度,系统可以为其分配空间

  2. 动态初始化:初始化时由程序猿确定数组的长度,而没一个数组元素的值,则由系统来分配初始值,例如:

    int[] b=new int[5]; System.out.println(b[0]); // 很明显,数组就是类

数组一定要初始化吗?所谓的对数组初始化究竟是对什么初始化?是数组变量本身吗?

答案看上去肯定是一定要,但是我在实践中发现却是不一定需要,要想搞清楚这个问题,我们需要理解数组变量数组对象的区别。而在认识他们之前需要先了解Java的数据类型。Java的数据类型分为两种,基本数据类型引用数据类型

基本数据类型有八种:byte,short,int,long,float,double,boolean,char。只需要知道基本数据类型变量包含一个值,这个值的类型与变量相对应。

引用数据类型:引用型变量的值与基本类型变量不同,变量值是指向内存空间的引用(地址)。所指向的内存中保存着变量所表示的一个值或一组值。这和C++中的指针很相似,事实上Java语言中的引用实际上就是指针,是指向一个对象的内存地址。Java所说的不支持指针只是不支持指针的计算,但是指针类型被保留了下来,并称为引用类型。声明引用数据类型后,不可以直接使用,还需要实例化在堆内存中开辟内存空间。

数组变量是一个引用类型的变量,数组变量是指向堆内存当中的数组对象,并不是数组本身。当改变一个数组变量所引用的数组,就可以造成数组长度可变的假象。实际上数组对象本身的长度本没有变化,只是数组变量指向了一个新的数组对象。

所以对于数组变量来说,他并不需要初始化,我们常说的初始化其实是初始化数组对象而非数组变量,有时候我们不进行初始化,而让数组变量指向一个有效的数组对象,数组也可以使用,例如:

1int[] a = {0,1,2,3,4}; 2int[] b; 3b = a; 4System.out.println(b[1]); 5// 输出结果为 1 6b[1] = 99; 7System.out.println(a[1]); 8// 输出结果为 99 9 10 11我自己的理解是,Java的数组就是一个对象。初始化数组的最好办法就是new一个。
  • 数组的增强循环(也可用于其他集合)

    Java增强循环语句如下:

    1for(声明语句:表达式){ 2 // 代码 3} 4// 冒号可以理解为"in"

    声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等(而不是数组的下标!!)。

    表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。

    实例

    1public class Test { 2 public static void main(String args[]){ 3 int [] numbers = {10, 20, 30, 40, 50}; 4 5 for(int x : numbers ){ 6 System.out.print( x ); 7 System.out.print(","); 8 } 9 System.out.print("\n"); 10 String [] names ={"James", "Larry", "Tom", "Lacy"}; 11 for( String name : names ) { 12 System.out.print( name ); 13 System.out.print(","); 14 } 15 } 16}

    输出结果

    110,20,30,40,50, 2James,Larry,Tom,Lacy,

    我们回头理解其执行顺序:

    1. 创建名为x的integer变量
    2. 将numbers的第一个元素赋值给x
    3. 执行大括号内的代码
    4. 赋值给下一个元素x
    5. 重复执行至所有的元素都被运行

Java的变量类型

  • Java中有三种变量类型

    • 类变量:独立于方法之外的变量,用static修饰
    • 实例变量:独立于方法之外的变量,不过没有static修饰
      • 类的每个对象特定的变量也是实例对象(顾名思义)
    • 局部变量:类的方法中的变量

    public class variable{ static int a = 0; // 类变量

    1String str = "Java is easy to learn."; // 实例变量 实例变量声明在类内而不是方法中 2 3public void method{ 4 int b = 1; // 局部变量 局部变量是声明在方法中的 5 // 局部变量在使用前必须初始化 6 int x; 7 int z = x + 1; // 这就是错误的代码,无法编译 8}

    }

声明与初始化变量类型

  • 实例变量永远会有默认值。如果没有明确的赋值给实例变量,或者没有调用setter,实例变量仍有默认值。
    • integers 0
    • floating points 0.0
    • Booleans false
    • references null
  • 局部变量没有默认值
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java基础面试题(三) (2020持续更新)

前言全套面试题请直接转到文章末尾1.Java中能创建volatile数组吗?能,Java中可以创建volatile类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到volatile的保护,

Java开发者容易犯的十个错误

!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr

AS3 数组

varfoo:Array"one","two","three";trace(foo1);//"tow",数组下标从0开始trace(foo.length);//3Array的length属性是可读可写的,这与Java不同,在Java中,数组一旦定义好长度,就无法再更改

Java基础14

1.二位数组可以看成以数组为元素的数组2.java中多维数组的声明和初始化一样,应该从高维到低维的顺序进行,例如1intanewint3;2a0newint2;3a1newint4;4a2newint3;5inttnew

Android JNI开发系列(七)访问数组

JNI访问数组JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象。