`
wateray
  • 浏览: 41960 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java 数组初始化的困惑

    博客分类:
  • java
阅读更多
我们知道,
1.类成员变量在定义时,如果没有初始化,会自动初始化的。
对象引用初始化为null;
原始变量
byte-> 0;   short -> 0;  char -> \u0000(null); int -> 0;
long -> 0L; float -> 0f;double -> 0d;         boolean -> false;

2.如果是local 变量,没有初始化,编译报错的。

下面重点说说数组变量。数组变量不管是对象引用数组,还是原始变量数组。都是对象引用的形式的。
1.类成员变量 数组。
public class TestArray {

	private String[] m_array1 = new String[5]; // 定义并分配堆(heap)空间,初始化数组大小为5,并且所指向的对象也会初始化(String
												// -> null)
	private String[] m_array2; // 只是定义没有分配堆(heap)空间,但是对象引用会默认初始化为 null

	private int[] m_int = new int[5]; // 定义并分配堆(heap)空间,初始化数组大小为5,并且所指向的对象也会初始化(int
										// -> 0)

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] l_array1 = new String[5]; // 定义并分配堆(heap)空间,初始化数组大小为5,并且所指向的对象也会初始化(String
											// -> null)
		String[] l_array2; // 只是定义没有分配堆(heap)空间,局部变量不会默认初始化

		int[] l_int = new int[5]; // 定义并分配堆(heap)空间,初始化数组大小为5,并且所指向的对象也会初始化(int
									// -> 0)
		TestArray ta = new TestArray();

		System.out.println("m_array1[0] " + ta.m_array1[0]); // 输出 null
		try {
			System.out.println("m_array2[0] " + ta.m_array2[0]);
		} catch (Exception e) {
			// 运行时出错 Exception in thread "main" java.lang.NullPointerException
			e.printStackTrace();

		}

		System.out.println("l_array1[0] " + l_array1[0]); // 输出 null
		// System.out.println("l_array2[0] " + l_array2[0]); //编译不通过,局部变量没有初始化。

		System.out.println("m_int[0] " + ta.m_int[0]); // 输出 0
		System.out.println("l_int[0] " + l_int[0]); // 输出 0

	}

}


m_array2 会默认初始化为 null,l_array2不会默认初始化,这个好理解。
m_array1分配了堆内存,每块堆空间默认初始化了。
l_array1分配了堆内存,每块堆空间也默认初始化了。(注意这里局部变量。)
这里个人理解,数组分配了堆内存的话,每块堆空间就要(就会)初始化。初始化规则按照上面的1,2点进行。

疑问:原始变量类型的数组。数组的值存放到栈(stack)中,还是堆(heap)里呢?
一般原始变量类型是存放到栈中(stack)?。

分享到:
评论

相关推荐

    《java语言程序设计(基础篇)》课后习题答案

    课后习题可能涉及如何创建类,定义属性和方法,以及如何通过构造函数初始化对象。此外,通过实例化对象、调用方法,学生可以深入理解面向对象编程的思想。 三、数组和集合 数组是存储同类型数据的有效方式,而集合...

    Java java.lang.ExceptionInInitializerError 错误如何解决

    `java.lang.ExceptionInInitializerError` 是Java编程语言中一个特殊的运行时异常,它通常表示在类的静态初始化过程中发生了异常。这个错误不是因为类的构造函数,而是由于静态变量初始化或者静态初始化块(也称为...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    5.2.3 一“实”多“名”带来的困惑 111 5.3 多维数组 114 5.3.1 什么是多维数组 114 5.3.2 多维数组的实质 115 5.4 数组大练兵 123 5.4.1 轻松查询全班成绩 123 5.4.2 轻松查询全校成绩不在话下 124 5.4.3 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    5.2.3 一“实”多“名”带来的困惑 111 5.3 多维数组 114 5.3.1 什么是多维数组 114 5.3.2 多维数组的实质 115 5.4 数组大练兵 123 5.4.1 轻松查询全班成绩 123 5.4.2 轻松查询全校成绩不在话下 124 5.4.3 ...

    java语言程序设计(基础与进阶篇)答案

    在复习题中,可能会涉及到这些基本概念的理解和应用,比如如何声明和初始化变量,如何使用不同类型的运算符进行计算,以及如何通过流程控制语句实现条件判断和循环逻辑。数组是存储多个相同类型数据的有效方式,而...

    java语言程序设计(基础篇)课后题答案

    5. **数组**:数组是存储同类型数据的集合,学习如何声明、初始化和操作数组,以及两维数组的应用。 6. **字符串处理**:Java中的String类提供了丰富的字符串操作方法,如concatenation、substring、indexOf等。 7...

    ACCP5.0JAVA部分全答案(作业部分和理论部分)

    3. **数组**:一维、二维数组的声明、初始化和使用。 4. **字符串处理**:学习String类的常用方法,如concat、substring、indexOf等。 5. **异常处理**:理解try-catch-finally结构,学会处理运行时可能出现的异常。...

    《Java语言程序设计》作业答案

    - **构造器**:用于初始化对象,通常与类名相同,无返回值。 3. **异常处理** - **异常类层次**:Java的异常分为检查型异常(如IOException)和运行时异常(如NullPointerException)。了解如何捕获和抛出异常是...

    保罗·戴特尔,哈维·戴特尔 Java大学教程(第十一版) 答案 Java How to Program, 11e

    3. **数组**:一维、多维数组的声明、初始化和操作。 4. **字符串**:String类的使用,字符串的操作方法。 5. **异常处理**:try-catch语句,异常类的使用。 6. **类与对象**:类的定义,对象的创建和使用,构造方法...

    Java语言程序设计第五版答案.rar

    2. **类与对象**:理解面向对象编程的基础,包括类的定义、对象的创建与初始化、访问修饰符(public、private、protected)、构造函数、方法重载与重写。 3. **封装、继承与多态**:封装是将数据和操作数据的方法...

    Java解惑(中文)

    - **变量**:变量是存储数据的容器,有声明和初始化两个步骤。 - **运算符**:Java支持算术、关系、逻辑、位、赋值等多种运算符。 - **流程控制**:包括条件语句(if, if-else, switch)和循环语句(for, while, ...

    Java初学者常问的问题(推荐)

    - **数组初始化**:声明数组时,Java会为其分配空间并初始化,这是一个O(N)的操作。 - **数组的打印**:`System.out.println(a)`打印的是数组的内存地址,不是其内容,要打印数组元素,需遍历并打印每个元素。 5....

    Synnex Java面试题 2018

    - **构造器**:构造函数的作用,重载和初始化块。 - **访问修饰符**:public, private, protected和默认修饰符的含义及使用场景。 - **抽象类与接口**:两者的区别,何时选择抽象类,何时选择接口。 3. **集合...

    对C++费解之处的解析

    2. **指针初始化**:指针在声明时通常需要初始化,否则它们将包含随机内存地址,可能导致程序出错。例如,`int x = 5; int *ptr = &x;`初始化了一个指向`x`的指针。 3. **解引用**:使用`*`操作符可以访问指针所指向...

    javaSE代码实例

    5.3 数组的初始化 63 5.3.1 默认初始化 63 5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值规则 68 5.5 数组的常用操作 ...

    js省市联动菜单 亲测可用

    - **初始化菜单**:在页面加载时,根据数据填充省份选择框,并根据默认省份设置城市选择框的初始值。 3. **JavaScript代码示例**: ```javascript var provinces = [ { id: '1', name: '北京', cities: ['东城...

    C#微软培训资料

    18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间成员速查.269 参 考 资 料 .300 <<page 4>> page begin==================...

    javaScript代码飘红报错看不懂?读完这篇文章再试试

    4. **constructor**(构造器):构造器是类(class)的一个特殊方法,用于初始化新创建的对象。 5. **cannot**(不能):表示某个操作无法完成。 6. **catch**(捕获):在异常处理中,与`try`配合使用,用来处理`...

Global site tag (gtag.js) - Google Analytics