关于Java数组两种初始化输出数组的问题

代码1
public static void main(String[] args) {
		
		
		//动态初始化
		int[] a1 = new int[3];
		System.out.println(a1);//输出是[I@52e922
}
代码2
public class ArrayPrintTest {
	public static void main(String[] args) {

		//动态初始化
//		int[] a1 = new int[3];
//		System.out.println(a1);//[I@52e922
		//静态初始化
		int[] a2 = new int[] {1,4,2};
		System.out.println(a2);//输出的仍是[I@52e922
}
代码3
public class ArrayPrintTest {
	public static void main(String[] args) {

		//动态初始化
		int[] a1 = new int[3];
		System.out.println(a1);
		//静态初始化
		int[] a2 = new int[] {1,4,2};
		System.out.println(a2);
//最后输出[I@52e922
}
代码4
public static void main(String[] args) {
		
		
		//动态初始化
		int[] a1 = new int[3];
		System.out.println(a1);//[I@52e922
		//静态初始化
		int[] a2 = new int[] {1,4,2};
		System.out.println(a2);//[I@25154f
		//遍历数组
		for(int i=0;i<a2.length;i++) {
			System.out.println(a2[i]);//
		}
		
	}
//最后输出
[I@52e922
[I@25154f
1
4
2

问题来了:
1.代码一输出的是数组a1的地址值[I@52e922,这很正常,但为什么执行代码二的时候输出a2的地址值也是[I@52e922?
2.执行代码三时输出的不应该是两段地址值吗,为什么只输出[I@52e922?
3.执行代码四后,把a2数组值遍历后能输出两段不同的地址值?

 

那个不是地址,是obj.toString()的默认实现的结果,大概这样:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
 }