站在光明中,只看到黑暗
站在黑暗中,却能看到光明。。
--------------------------------
关于堆内存和栈内存的简单描述:
举例
代码片段如下
...
...
Person p = new Person("javier",24);
...
在内存中的分配情况则如下

在一个方法中定义的基本数据类型(Primitive Type)和引用变量类型(Reference Type),都是在栈内存中分配,
也就是说在一个方法(或称函数)中定义的变量,java就会在栈中分配对象空间,超出函数范围(以{...}来区间范围),则会自动释放栈中空间,这就是为什么在函数中定义的局部变量必须赋初值。
而堆中的则是由new关键字产生的对象,它是有垃圾回收器负责的(并不需要程序员参与)。
一旦产生了对象,只要引用存在,对象则存在,引用一旦为null,对象则会在一定时候(不确定时间)被垃圾回收器释放,这也就是为什么java运行比较占用内存的原因。
就像 上面的图, 产生的代码,其中的 引用变量p保存在栈内存中,p中的值保存的是堆内存中它所指向的实例 (instance)的地址的值,只要引用存在,则堆内存中的对象则存在,如果引用消失,参考垃圾回收机制。
Casting(类型转型) :
char
|
|
byte -- short -- int -- long
/ /
float -- double
byte 到 short 到 int 到 long 到 double 的从小到大顺序强制转换不会丢失精度,可以隐式的转换
反之,丢失精度,必须显示转换 如
long x=10L;
int a = (int)x;
char到 int类型的,也不会丢失精度(特殊)
int ,long,到 float 丢失精度
int 到 double 不丢失
long到double丢失
float 到 double 不丢失
看上去挺多,其实很好理解
站在黑暗中,却能看到光明。。
--------------------------------
关于堆内存和栈内存的简单描述:
举例
代码片段如下




在内存中的分配情况则如下

在一个方法中定义的基本数据类型(Primitive Type)和引用变量类型(Reference Type),都是在栈内存中分配,
也就是说在一个方法(或称函数)中定义的变量,java就会在栈中分配对象空间,超出函数范围(以{...}来区间范围),则会自动释放栈中空间,这就是为什么在函数中定义的局部变量必须赋初值。
而堆中的则是由new关键字产生的对象,它是有垃圾回收器负责的(并不需要程序员参与)。
一旦产生了对象,只要引用存在,对象则存在,引用一旦为null,对象则会在一定时候(不确定时间)被垃圾回收器释放,这也就是为什么java运行比较占用内存的原因。
就像 上面的图, 产生的代码,其中的 引用变量p保存在栈内存中,p中的值保存的是堆内存中它所指向的实例 (instance)的地址的值,只要引用存在,则堆内存中的对象则存在,如果引用消失,参考垃圾回收机制。
Casting(类型转型) :
char
|
|
byte -- short -- int -- long
/ /
float -- double
byte 到 short 到 int 到 long 到 double 的从小到大顺序强制转换不会丢失精度,可以隐式的转换
反之,丢失精度,必须显示转换 如
long x=10L;
int a = (int)x;
char到 int类型的,也不会丢失精度(特殊)
int ,long,到 float 丢失精度
int 到 double 不丢失
long到double丢失
float 到 double 不丢失
看上去挺多,其实很好理解