注1: Java里面就两个大类型的数据:基本数据类型和引用数据类型
注2:开发中一般 整型都用int , 浮点型都用double
详解:https://blog.csdn.net/zhzhao999/article/details/53449504
一. 基本数据类型
- 关于char 类型
char类型是可以进行加减乘除运算的,因为它都对应有Unicode码,而string字符串只能进行拼接。char本质上是整数
char a = "x" #编译会报错,只能用单引号,双引号是字符串
char a = 'xy' #编译报错,字符型只能有一个字符
char a = '' //编译报错,字符不能为空; 但是字符串是可以为空的
char a = 'a';
char b = 97;
if(a == b){
System.out.print("ok"); // OK
}
说明char a 和char b底层存储的二进制都是一样的
为什么char 类型可以参与运算?
详解1:单个字符都是有对应的Unicode码的,而单个字符的Unicode码是和ASCII值一样的,存在磁盘上的二进制码就是对应的ASCII码
详解2:https://zhidao.baidu.com/question/522793624007583765.html
char a = 'a'; // 'a'这个字符 ASCII对应的就是十进制的97
char b = 98;
int x = a+b;
System.out.print(x); // 195
注:只要涉及到加减乘除运算,字符都会转化成相对应的ASCII十进制数值
char x = 65; // 不加单引号,就会把它当成ASCII对应的十进制数值
System.out.print(x); // A
char a = 98;
char b = 98;
int x = a+b;
System.out.print(x); // 196
boolean类型不可以转换为其它的数据类型;
boolean类型只有true、false这两个值,不能用1、0 等等取代;
true、false 也不能做运算;
if (false == 0) { //会报错,虽然true、false底层是1、0,但是Java里面是不等价的,不像Python那样
System.out.print(age[i]);
}
通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可
以实现把字符串转换成基本类型。
如:String a = “43”;inti=Integer.parseInt(a);
String a = “43”;int b = (int)a; //编译报错
基本类型:long
long a = 112L 或 112l 注:末尾必须带上大写的L或小写的l ,这是一种声明,存的时候是不会吧L或l 存入磁盘的
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)
注:float表示的数值范围比long还大
float可以保存单精度浮点数,但也可以保存整数。
float的数值范围:3.402823e+38 ~ 1.401298e-45
byte<short<int<long<float<double,从左往右,数值范围越大,右边的基本数据类型可以表示左边的。
基本类型:float
flaot a = 3.11f 或 F 注:float 类型末尾需要f 或 F来声明
最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)
最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)
基本类型:double
最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)
最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)
short 的取值范围-32768~32767
short a = 32768;
System.out.println(a); //编译会报错,因为超过short取值范围了
为什int型127转换成 byte型就成了-128了呢?
答: https://zhidao.baidu.com/question/374553839771429644.html
int a = 129;
byte b = (byte)a;
System.out.println(b); //-127
int a = 129;
byte b = (byte)a;
System.out.println(b); //-126
二.
整形常量都是默认为int类型的
byte x = 11;
system.out.print(x + 21474836479); //报错,21474836479超出了int 的范围了,因为整型常量都默认是int类型的,现在21474836479超出int的范围了,所以报错
eg: long a = 112233 #这里的112233是int类型,给4个字节大小的内存空间给它存储
short x =110
以上这种理解太简单了,short x =110 : x变量就是short类型,具有一个字节的空间
long a = 112233 :a变量就是long类型,a 变量就是具有8字节空间
byte a = 250 ; //报错cannot convert from int to byte ,250超过了byte,就把250当做int类型了
short a = 32790; //报错cannot convert from int to byte ,32790超过了short范围,就把32790当做了int类型了
112233L 或 112233l 这种形式常量 才会按long的内存大小(8字节)给 112233L 分配8字节的内存空间存储
小数常量都是默认为double类型
小数常量后面跟上f或F才算作float类型 eg : 111.2f 或111.2F #这样的话就按照float
的4字节分配内存空间,不带上f或F,按照double 的8字节内存空间分配
float a = 1 + 1.1; //编译报错,因为小数常量1.1默认是double类型,所以1.1 + 1 得到的是double类型,不能用float类型的变量来存
float b = 1.2; //编译报错,1.2默认是double类型
Java给变量赋值的过程:
比如 int a = 11
- 在内存开辟一块内存空间,名字就是a,分配4个字节的空间
- 判断11是什么类型,符不符合变量a的类型 或者 是不是小于变量a的存储空间,是的话就没问题;如果11的类型要的空间是大于a的存储空间,在编译时就会报错
eg1:
string a = 11;
System.out.println(a); //编译报错,11是整型,而变量a是字符串,属于完全不相干的数据类型。
eg2:
double b = 11;
System.out.println(b); //这个没问题,11虽然属于整型,但是b变量是双精度浮点型,也是数值类型,而且double 范围比整型范围更大
注:一般我们开发中,定义整数都是用int,定义小数都是用double
自动类型提升:
结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,得到的结果自动提升为容量大的数据类型。
byte 、char 、short --> int --> long --> float --> double
特别的:当byte、char、short三种类型的变量互相做运算时,或者自己和自己本身做运算时,结果都为int型,这是规定;
int类型 和 int类型 做运算,结果还是int;
int类型 和 float 类型做运算,结果是flaot类型;
。。。。。。。。
反正就是范围小的类型和大的类型做运算,结果的类型都是大的的那个类型;
注:
short x = 11;
byte y = 12;
float a = x+y ; //你要拿范围比int更大的类型来装变量,当然是可以的啦
强制类型转换:自动类型提升运算的逆运算。
注: 强制类型转换就是截断操作
1.需要使用强转符:()
2.注意点:强制类型转换,可能导致精度损失。
eg:
double d1 = 12.9;
//精度损失举例1
int i1 = (int)d1;//截断操作 i1里面存的是12
//没有精度损失
long l1 = 123;
short s2 = (short)l1; //short 类型 也可以放的下123
三.引用数据类型
1.类 : 字符串是属于类里面的
字符串string 是 引用数据类型
string a = ""
char b = '' //编译报错
可以有空字符串,但是没有空字符
字符串可以和八种基本数据类型做运算,但是只能是+(连接符)
String a = "123"
int b = (int)a;
System.out.print(b); //报错,不能转,有其他方法
int a = 123;
string b = (string)a;
System.out.print(b); //报错,不能这么转,有其他方法
以下两个是等价的:
String str1 = new String("atguigu");
String str2 = "atguigu";
System.out.println(str1); //"atguigu"
System.out.println(str2); //"atguigu"
- 数组是引用数据类型
3.接口