谁来给我解释下java上的栈内存和堆内存
发布网友
发布时间:2022-03-31 02:38
我来回答
共4个回答
热心网友
时间:2022-03-31 04:07
你编译了,但没运行就像是你的机器上安装了一个游戏但没有运行这个游戏,你觉得这个游戏会占用你的内存吗?你编译后只生成了一个类文件,这个类文件最多就占你一点点硬盘空间并没有占用你的内存。
至于int i=1;和static int i=1;这两个,前者是在用到时才会加载内存,其作用范围在这个变量定义位置到这个变量所在匹配的右括号结束,而static int i=1;这个变量是在当这个静态变量所在的类被JVM加载时就一直存在不受这个类所定义的对象的影响,如果是int i=1;那么当这个对象不存在时那么这个变量也就不存在了,但如果是static int i=1那么这个i会到整个程序结束才消失。而且如果你把类里面的属性定义成为static那么整个类共享一个i,所有的对象访问和操作的都是同一个i,也可以通过类名.i来访问这个i。
至于final String str这里的str并不是多余的,所有字符串属于常量这句话并没有错,如同你把把一个字符a变成字符b吗?注意我说的是字符不是变量的值为a改成b。肯定不能,如果能改那计算机还不崩溃呀?这里的final并不是多余的,它不是用来修饰字符串的值而是用来修饰str的,str只不过是一个字符串的引用(在c里面叫指针),如果你的str不加final那么我是不是可以把它改变指向其它的字符呢?肯定是可以的,但如果我加上final那么就不能了,因为str是一个常量,它里面的引用值(也可以叫做指针地址)是不可以被改变的。String并不属于基本类型,它是一个较为特殊的引用类型。
热心网友
时间:2022-03-31 05:25
内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
热心网友
时间:2022-03-31 07:00
编译相当于,你从A地到B地,你已经到达B地,也就是说你曾经走过这段路而已,你走完了这段路,路和你好像没有关系。在java里面编译只是将java源码转成class文件而已,分配内存那也是你运行前要做的事情( java 类名 这时候才是分配内存的时候)。
基本数据类型放在栈,引用数据类型放在堆里面。
鉴定你是初学暂时不要考虑 static 和 String 等有一定基础后再考虑吧,这两个关键字要有点基础才能完全搞明白。
final这也是java里的关键字,表示是一个常量,常量也就是说值不能改的变量,你声明的时候给他赋值多少就是多少,比如在算圆周率时∏(派) ≌3.1415926这是一个固定的值这时候就应该用final来修饰变量,常量名一般全部用大写字母表示,而一般变量首字母小写,和不同单词组合命名时其他单词首字母大写(此命名叫骆驼命名法)。
热心网友
时间:2022-03-31 08:51
java 与其他语言相比有个优点就是可以自动回收内存中不用的数据,防止浪费内存的资源。Java有特有的垃圾回收机制。常量i在栈内存中,而静态变量放在堆内存中。字符串属于基本类型之一,所有的基本类型都是常量。final是定义了字符串的值,是不可改变的。如果不没有final修饰字符串的值是可以改变的追问呵呵 看来你看的书比我还少,你这段话最少有三个错误