表达式中的陷阱

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类的对象

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

强制类型转换:

会发生截断,截断的位数根据转换的低位的数据类型进行截断,

例如本题:byte8位,short16位,留下低8位,

自动类型转换:

表达式类型的自动提升,类型会自动提升到最高的数据类型

将低精度类型自动转为高精度类型再比较,,-精度从高到低 double float long int short(char) byte

例子

short a2;

a=a-10;//会出现编译错误

因为a-10会自动提升为int类型,将int赋值给short会导致编译错误

short a2;

a-=10;//不会出现编译错误

因为复合运算符-=包含了一个隐式的类型转换

a-=10相当于a=(a的类型)(a-10);

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

被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了

而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。

Java中的byte,short,char进行计算时都会提升为int类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值