觉得翻译不准的话我贴原文: One group of types, which you’ll use quite often in your programming, gets special treatment. You can think of these as “primitive” types. The reason for the special treatment is that to create an object with new—especially a small, simple variable—isn’t very efficient, because new places objects on the heap. For these types Java falls back on the approach taken by C and C++. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The variable holds the value directly, and it’s placed on the stack, so it’s much more efficient.
ticmy,看了你的回复,想请教你几个问题: 1、int a ;//a处于栈里!C++如此,想必java也如此,所以,stack直接翻译为栈就好了吧!你觉得呢? 2、我看<java2核心编程·卷I>里通用编程一部分,有些不理解,能否指点下,如下: 原文第5章5.2.2通用编程:Employee [] staff = new Employee[10]; Object arr = staff; arr = new int[10];//疑惑在此处 实际上,他说,任何类的任何值都可以用Object的变量来保存,但是int是一个普通类型,怎么保存得了? 由此引申,一个int作为一个普通数据类型,为什么也要像类类型一样,int [] i_a = new int [5];为什么要new?new不是实例化类时开辟内存空间么?望指教!
C++如此,想必java也如此 这个逻辑是大错特错的,c++编译的代码的指令集是基于寄存器的,而java字节码的指令集是基于栈的,这个栈在jvm中的表现就是操作数栈。很多人根本分不清栈、java栈、栈帧、操作数栈的区别比如 public class Test { public static void main(String[] args) { int a = 0;//这个a在运行main方法执行到这一句的时候会将a的值从局部变量区压入操作数栈 } }又如 public class Test { private int a = 0;//这个a首先是int类型的变量,其次a的值不是new出来的,但这个a是存在堆里的 } 至于arr = new int[10];//疑惑在此处 赋值给arr的并不是int变量,而是数组,new的也是数组,而数组在java中是一个真正的对象。数组也是有类名的,比如int[] arr这个数组的类名就是[I String[][] arr这个数组的类名是[[Ljava/lang/String;,只不过不了解jvm的人不知道这些罢了
有时间还是要看看
建议你读完吧,好东东!
同时还有java core 和 effective java
觉得翻译不准的话我贴原文:
One group of types, which you’ll use quite often in your programming, gets special treatment.
You can think of these as “primitive” types. The reason for the special treatment is that to
create an object with new—especially a small, simple variable—isn’t very efficient, because
new places objects on the heap. For these types Java falls back on the approach taken by C
and C++. That is, instead of creating the variable by using new, an “automatic” variable is
created that is not a reference. The variable holds the value directly, and it’s placed on the
stack, so it’s much more efficient.
里面例子代码,非常非常经典的。没有一个是废话的。
ticmy,看了你的回复,想请教你几个问题:
1、int a ;//a处于栈里!C++如此,想必java也如此,所以,stack直接翻译为栈就好了吧!你觉得呢?
2、我看<java2核心编程·卷I>里通用编程一部分,有些不理解,能否指点下,如下:
原文第5章5.2.2通用编程:Employee [] staff = new Employee[10];
Object arr = staff;
arr = new int[10];//疑惑在此处
实际上,他说,任何类的任何值都可以用Object的变量来保存,但是int是一个普通类型,怎么保存得了?
由此引申,一个int作为一个普通数据类型,为什么也要像类类型一样,int [] i_a = new int [5];为什么要new?new不是实例化类时开辟内存空间么?望指教!
这个逻辑是大错特错的,c++编译的代码的指令集是基于寄存器的,而java字节码的指令集是基于栈的,这个栈在jvm中的表现就是操作数栈。很多人根本分不清栈、java栈、栈帧、操作数栈的区别比如
public class Test {
public static void main(String[] args) {
int a = 0;//这个a在运行main方法执行到这一句的时候会将a的值从局部变量区压入操作数栈
}
}又如
public class Test {
private int a = 0;//这个a首先是int类型的变量,其次a的值不是new出来的,但这个a是存在堆里的
}
至于arr = new int[10];//疑惑在此处
赋值给arr的并不是int变量,而是数组,new的也是数组,而数组在java中是一个真正的对象。数组也是有类名的,比如int[] arr这个数组的类名就是[I
String[][] arr这个数组的类名是[[Ljava/lang/String;,只不过不了解jvm的人不知道这些罢了
另外那个翻译是没问题的,堆栈 就是 栈,我贴英文是怕别人觉得翻译有问题。我说的问题在上个帖子里回复了,就是int的值是会只存在堆里的,而它一棍子打死说在栈里,让很多不明真相的人信以为真,结果闹出笑话,还以为自己是对的。并且它的这个栈也并没有说清楚是什么栈。通常我们所说的堆、栈都是指的c堆、c栈,我java堆,java栈跟它们并不是一个东西,并且java栈里还存了一个操作数栈。它笼统的说一个stack,对于不懂jvm运行结构的人来说,根本不知道这个stack指的是什么——结果就是让人云里雾里了!
有所获!我继续 ... thanks !
严重同意ticmy 。
TIJ,不值得...