java程序创建对象的方式?
1通过new调用构造器创建java对象(系统主动调用构造器)
2通过java的反序列化机制从IO流中恢复java对象
3通过java对象提供的clone()方法复制一个新的java对象(系统主动调用构造器)
4通过class对象的newInstance()方法调用构造器创建java对象(系统主动调用构造器)
5对于String和包装类,java允许以直接量的方式来创建java对象
Java中的字符串直接量,保存在哪?
java中的直接量保存在常量池,其中字符串直接量保存在字符串池,字符串池是堆内存的一部分,
【所有类的实例和数组都是在堆上分配内存的,所以说String类的直接量实例是保存在对内存的字符串池上的,
对象所占的堆内存是由自动内存管理系统回收,但是垃圾回收机制并不会主动回收字符串池!!!!!!!!!!!!!
】
当第一次使用某个字符串直接量时,jvm会将他放入字符串池中缓存,字符串池中的字符串对象不会被垃圾回收,这是java内存泄漏的一个原因,String str="s"; str="dd"; str=""cc;,因此一般不建议使用String类
字符串对象的创建方法?
1用字符串直接量创建字符串对象(对象存储在字符串池)
2用new String()来创建字符串对象(对象存储在堆内存)
3用字符串连接表达式创建字符串对象(如果该表达式在编译时能够确定(宏替换/字符串直接量)该字符串变量的值,那么会创建字符串对象,存储在字符串池中,不会再字符串池中创建重复的字符串对象)
例题
String str="ss"+"dd"+"dd";创建了几个字符串对象?||使用字符串连接表达式创建字符串对象
一个,因为编译时便可确定下来,编译器直接将其存储在字符串池中,保存为ssdddd字符串对象,并让str指向这个字符串对象
String s=new String("xxx"):创建了几个字符串对象?||使用到字符串直接量和new String()来创建字符串对象
一条语句创建了两个字符串对象,一个是字符串直接量存储在字符串池,另一个是new String()创建的字符串对象
s指向堆内存中的字符串对象
通过这个可以减少内存的分配,使用直接量来创建包装类以及String类的对象
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
表达式类型的自动提升,类型会自动提升到最高的数据类型
例子
short a2;
a=a-10;//会出现编译错误
因为a-10会自动提升为int类型,将int赋值给short会导致编译错误
short a2;
a-=10;//不会出现编译错误
因为复合运算符-=包含了一个隐式的类型转换
a-=10相当于a=(a的类型)(a-10);