JAVA 中变量分为 1. 基本类型 2.引用类型 基本类型都是值传递, 其他的都是引用传递
基本类型有: byte, long, short, int, double, float, boolean, char
JAVA 的堆栈
Java的内存机制分为堆内存,栈内存,方法区等。
两者差别:
堆内存主要存放实体对象,用来存放new的对象和数组引用变量的实体对象。由虚拟机自动垃圾回收器管理。
栈内存主要存放基本基本类型的变量。
方法区主要存放一个类的模板和静态方法。
声明位置的不同决定储存位置
在方法中声明(局部变量):调用方式时在栈中分配空间给变量,结束时释放栈,体现变量的局限性。
在类中声明(成员变量):由于作用周期需要,变量存放在堆中。不会因方法销毁为失效,类似于C中的全局变量。
对于引用变量来说,对应内存所储存的值是一个引用,是对象的储存地址,被存放在栈中
堆主要用来存放对象 , 栈用来存放基本类型跟引用, 用来执行程序。
Stack栈: 储存基本数据类型的变量,对象的引用。 栈的存取速度更快,大小和生存期必须是确定的, 因此缺乏一定灵活性。
Heap堆 ,常量池: 引用类型的变量, (new 创建的对象都在堆内存) 线程之间会共享堆内存,堆可以在运行时动态分配内存
JAVA引用的用法: 在堆中产生了一个数组或对象后,可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象 在队中的首地址, 栈中的这个变量就成了这个数组/对象的引用变量。 就相当于为数组/对象 起的一个名字。
例:
String s = "abc" ; // 把“abc"放到常量区中,在编译时产生
String s = "ab" + "c"; 把”ab" + "c" 转换为字符串常量“abc" 并放到常量区中
String s = new String("abc") 在运行时 把“abc" 放到 堆里
String s1 = "abc"; 在栈里创建s1 并指向常量区中的”abc"
String s2 = new String("abc"); 在堆中又创建一个新的对象