[Java基础] 数组声明有关问题分析
2016-06-10 16:58
405 查看
问题
@Test public void Test(){ String[] p = null; p = {"no"};//这种不指定数组下标初始化的方式只在下一行这种格式中适用 String[] s = new String[]{"no"}; p[0] = "y";//此处编译可以通过,但是运行通过不了,无法输出p[0]的值 p = new String[]{"yes"};//这种方式就完全没问题,编译和运行都pass }
分析
其实这种问题从类和对象的内部分析是很好理解的首先要知道的是
栈(stack):局部变量、声明对象的引用名、数组的引用名,定义的类方法中的参数以及局部变量
堆(heap) :new出来的“东西”(如:对象的实体,数组的实体),含成员变量(即所谓的全局变量)
紧接着对象的引用要与对象的实体进行关联:栈中的对象引用中保存了堆中的实体的首地址,因而才可以正常编译、运行。
给出的问题分析:
第一种,无new操作,因此未在堆中将{“no”}保存,因此这种方式是不行的
第二种,与第一种事实上是一个问题,只是第二种编译可以通过
第三种,也就是通常我们声明一个数组并初始化的步骤了,其中就包含三部分:
1)在栈中声明一个对象的引用名(此步在第一行String[] p = null中体现,此时p就是一个数组对象的引用名)
2)在堆中创建一个字符串数组的实体(此步在new String[]{“yes”}中体现)
3)将实体的首地址赋给对象的引用(此步在p = new String[]{“yes”}中的=号处体现)
想必,通过内部分析 你应该能轻易理解这其中的差别。
相关文章推荐
- Java 希尔排序
- CLASSPATH PATH JAVAHOME
- Spring Mvc那点事---(14)Spring Mvc之mybatis调用存储过程
- javac -classpath的使用
- Java JDK框架概述
- java处理mysql里面字段的空值
- maven+springMVC+mybatis+junit详细搭建过程
- 浅谈spring容器中bean的初始化
- 《Java程序设计》课程实验指导书程序代码(答案)(实验七)
- Spring——Eclipse上安装springsource-tool-suite与jar包详解
- [javaSE] IO流(装饰设计模式)
- javax.faces.component.html.HtmlInputText.getOnfocusout()Ljava/lang/String;
- javabean
- 【Java学习-J.160601.0.20】Servlet 基础三 dao的封装
- spring开发 MethodInvokingFactoryBean的学习
- Java POI读取Excel 2003/2007/2010例子
- Spring 的Helloworld
- Eclipse编写jsp文件连接Mysql数据库的安装配置指南
- ubuntu14.04中安装jdk
- 【Java学习-J.160601.0.20】Servlet 基础二