不知抽了什么风,以前都是用c来写小程序的,周二那天好不得的说,从今天开始以后用java语言写;为此,阔别了半年的MyEclipse就在那天唤醒了,作为菜鸟的我总感觉太多东西要学,太多东西了,..(打住感概.....);
因为总用C语言中的结构体来归并一些若干变量的集合,好吧,java中木有结构体,我只能用类了模拟了;
class Sum
{
int start ;
int end ;
int sum ;
}
Sum dp[] = new Sum[10] ;
dp[1].sum= 1;
报错,NullPointerException,我写个程序容易么我,报你妹啊;
因为我是在回忆的阶段,为此补下知识;
1. 普通数组:
包括数组的声明和创建,要想使用数组必须为它分配内存空间,new对应数组;
- 一般默认值为对应0,0.0,false等等 --:int bb[][] = new int[10][1] ;
- System.out.println(bb[0]+" "+bb[1]+" "+bb[2]);------[I@1fc4bec [I@dc8569 [I@1bab50a ,仔细一看,还以为是数组的地址不是连续的,想下,为了安全考虑java里没有提供直接操作内存操作的方法,所以这该不是地址本身吧!
- 任何类均为Object类的间接子类,所以均继承方法public int hashCode()
散列的哈希码:默认的实现是将对象内部地址转化为整数作为HashCode,这当然能保证每个对象具有不同的引用,是对象在JVM虚拟出来的内存地址。不是实际物理内存地址;
2. 对象数组
- 对象的使用,先是声明,然后创建,堆中的内存空间的地址的引用放在栈中,实体是在堆中,对象借此引用可以直接操作对象的属性等
-
一个类创建的对象如果有两个对象,如果有相同的引用,那么就有完全相同的实体,如果没有实体,则为空对象,空对象不能使用,NullPointerException
但是编译不会对空对象做检查; - java所谓的垃圾回收机制,这种机制周期的检测某个实体是否已不再被任何对象所拥有(引用),如果发现这样的实体,就会释放该实体所占的内存;
所以之前的 NullPointerException 可以解释了,每个对象数组中没存对象、存的都是null的 ,只有在new一个对象时 内存空间才开辟出来
那么则需要用循环来逐个new啊,
for (int i = 0 ;i <dp.length ;i++) dp[i] = new Sum();
但是为什么不能用增强for呢 ?for (Sum h:dp) h = new Sum();
java.lang.NullPointerException ,--------见下增强for:
3 . 增强for
/* 一般for循环的简写形式,,for(声明循环变量:数组名字),
但是里面的循环变量迭代器只能取到里面的值,起迭代作用,不能做修改,
这就是我们不能new Sum()了的原因了,因为 h 开始赋值为null,随后分配了内存,
但这只是属于他自己,并未改变数组 dp重的各个对象 ;
(可以看看 Iterator 的作用和用法) */ String[] persons={"张三","李四","王五"}; for(String person:persons){ System.out.println(person); person = "person" ; //张三 李四 王五 } int a[]={77,88,99} ; int t = 0; for (int i:a){ i++ ; System.out.println(i) ; System.out.println("source "+a[t]) ; t++ ; } /* 78 source 77 89 source 88 100 source 99 */