之前和Jacky的交流收获很多,在这里对其中数据储存的问题做一个小结,Let's go.
创建对象是我们每天都会用到的,就像这个:
Employee emp=new Employee();
Employee中有两个私有属性id和name,加上Setters/Getters方法即可。
创建成功后我们就在内存中需要分配一个空间去储存,那么问题来了,上边这个式子中的每一部分究竟是储存在哪里呢,我用一张图来解释:
等式左边的emp被储存到了栈区,等式右边的new Employee()会在堆区开辟空间储存,而emp事实上只是一个地址符,它会指向堆区中真正对象的位置,对象中所包含的所有属性也都储存在堆区,说到这里,到底堆和栈通常都储存什么类型的数据呢?
其实,栈中存放是基本类型与引用类型,堆中存放的是对象类型与数组(当然数组也是对象类型)。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
提到堆和栈就不得不再说说静态区,通常情况下,我们在需要全局变量的时候会用到static,还是之前的例子,在Employee的model中加这样一段代码:
public int count=0;
public Employee(){
count++; }
然后在测试类中创建两次对象:
Employee emp1=new Employee();
System.out.println(emp1.count);
Employee emp2=new Employee();
System.out.println(emp2.count);
不难看出,打印的结果一定是两次1,但是如果用static修饰count,结果将变成1和2,那么用static修饰的全局变量究竟是储存在哪里呢,这样就出现了第三个储存区static静态区:
最后补充下static的三种用法:
1.static{ }直接在{ }中写入代码片段,会使在加载类时优先加载其中代码
2.static variate修饰变量,使变量作为全局变量
3.static method修饰方法,预加载方法,使用方法时无需创建对象
再说两句题外话,有经验的it工程师给出了一个方向:
A.Architect
B.Business
C.Coding
D.Design
E.English
每个人都有自己的理解吧,我也不再赘述了,攻城狮和程序猿也许就是方向不同呢,下功夫总会有收获的。