1)除long和double之外的基本类型的赋值 *** 作
2)所有引用reference的赋值 *** 作
3)javaconcurrentAtomic 包中所有类的一切 *** 作。
但是java对long和double的赋值 *** 作是非原子 *** 作!!long和double占用的字节数都是8,也就是64bits。在32位 *** 作系统上对64位的数据的读写要分两步完成,每一步取32位数据。这样对double和long的赋值 *** 作就会有问题:如果有两个线程同时写一个变量内存,一个进程写低32位,而另一个写高32位,这样将导致获取的64位数据是失效的数据。因此需要使用volatile关键字来防止此类现象。volatile本身不保证获取和设置 *** 作的原子性,仅仅保持修改的可见性。但是java的内存模型保证声明为volatile的long和double变量的get和set *** 作是原子的。(from
>基本数据类型作为类的成员时,
即使没有对其进行初始化,
java也会确保它有一个默认值,如下:
基本类型的初始值 基本类型 默认值
boolean false
char \u0000(null)
byte (byte)0
short (short)0
int 0
long 0L
float 00f
double 00d
上面的默认值,是当变量作为类的成员使用时才有的,
java这样做是保证基本类型的成员变量得到初始化,
防止产生程序错误,
但这些值在实际的程序中可能都是不合理的,
所以最好明确的给出初始值。
上面的默认值对在程序中非成员变量就不适用了,
非成员变量如果不明确给出初始值,就可能是任何值。
在java程序编译时会提示你一个错误,而不是c++中的警告。
至于那些应用类型,像数组,对象啦,有些复杂,根据你的类型而定,对象一般弄人为null,
数组根据你的类型,按照基本数据类型的默认值来初始化……
明白了么?
本文来自CSDN博客,转载请标明出处:>byte n=26;
long n =26;
这样赋值是对的,但是你说的“用Long赋值”这句话不对。
首先Long是一个对象,在jdk15之前Long对象不能赋值给long基本类型。
在者long赋值给int、short、或者byte,若超过改三个数的最大值时,会溢出。
最后26是字面常量,字面常量没有数据类型这一说法,只有变量有数据类型。对于java而言:
一、
各种数值类型的默认值都是0或00。
具体包括byte、short、int、long的默认值都是0,而float和double类型的默认值都是00。
二、
char类型的默认值是''(即空字符)。
三、
boolean类型的默认值是false。
四、
所有引用类型的默认值都是null。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)