java内存分为:代码区、栈区、堆区、静态区域
代码区:存放程序中方法的二进制代码,而且是多个对象共享一个代码空间的区域
栈区:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new出来的对象)或者常量池(字符串常量对象存放在常量池中)。
堆区:存放new出来的对象
静态区域:存放字符串常量、全局变量、静态变量
常量池:存放字符串常量和基本类型常量(public static final)
对于字符串,其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)就存在常量池中。如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
为了形象地说明对象、引用以及它们之间的关系,可以做一个类似的比喻:对象是一只很大的气球,大道我们抓不住它,引用变量是一根绳,可以用来系住绳子。
只有通过new()方法才能保证每次都创建一个新的对象。诸如String str = "abc";的格式定义类时,对象可能并没有被创建,而可能只是指向一个先前已经创建的对象
StringBuffer s;
s = new StringBuffer("hello world");
StringBuffer s1 = s;//这句使得s1和s指向同一个对象,不管哪个引用操纵对象,对象的内容都发生改变,并且只有一份。
String s1 = "AAAA"; String s = s1;操纵s,由于s1始终不变,所以为s另外开辟存储空间来存储s
Java只有一种参数传递方式,那就是值传递。即Java中传递任何东西都是传值基本类型则传基本类型的拷贝,引用类型则传引用类型的拷贝(引用传递时若对原对象进行操作则方法里操作会影响调用函数主体内的引用访问对象得的值。若对形参引用重新new进行赋值则不该变调用函数里通过引用访问得到的原对象数据)
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
A a;A是类, a是引用不是对象,a指向的对象为空null