表达式中的陷阱

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/83511625

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);

被final修饰的变量不会自动改变类型

猜你喜欢

转载自blog.csdn.net/strivenoend/article/details/83511625
今日推荐