内存分区:
注:不是所有基本类型都存在栈中
heap:堆,动态申请内存(new出来的)成员变量(实例变量),当新建一个对象的时候,,JVM为类分配空间,这个空间的大小就是实例变量的大小,当实例变量带一个对象引用变量的时候,引用的这个对象并不占原对象的空间
三种方法释放对象的引用:
(1)引用在方法结束后消失
(2)引用被赋值到其他对象上
(3)直接将引用设定为null //类似拿到一个没有电视的遥控器,使用null. 会报空指针错
stack:栈(先进先出),存局部变量,引用变量,对象句柄,基本类型(方法中),调用时的对象的方法,当方法调用时位于栈顶,直到方法被使用完,当方法1内调用方法2,这时方法2位于方法1的上边,先执行方法2再执行方法1
方法区:静态成员,构造函数,常量池,线程池。方法
String对象
String a = "abc";①
String b = "abc";②
分析:
①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象,②执行时,因为常量池中存在"abc"所以就不再创建新的String对象了。所以只创建了一个对象
2)
String c =newString("xyz");① String d =newString("xyz");②
分析:①Class被加载时,"xyz"被作为常量读入,在常量池里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆(heap)里创建这个new String("xyz")对象;②由于常量池(constant pool)中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
②String s1 =newString("xyz");//创建1个对象(常量池已经有“xyz”了, 堆 中创建一个),
字符串创建对象后不可以改变
Person[] p=new Person[5] 这句话的意思就是建立一个5个空间大小的数组,然后将引用赋给p
p[0]=new Person() 建立一个Person对象,将它的引用赋给了数组里的第一个位置,P[0]指向的是数组的第一个位置,所以p[0]引用了这个建立的Person对象
数组里装的其实是对象的地址,从而数组的每一个位置获得了对象的引用
Integer t1=12;
int t2=12;
t1等于t2么? 将12赋值给t1的时候进行了自动打包,返回的是一个Integer类型,t1,t2比较的时候t1进行了自动解包返回的是一个int型的12,这时候,变量t1和变量t2都指向常量池中的一个12,所以它俩相等
Integer t1=128;
Integer t2=128;
这时候t1,t2相等么??不相等,可以理解为当数大于128的时候,他们不会自动转换为int型比较,而是直接通过对象比较