数据类型
正文
java语言特色
java是一种强类型语言
强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
弱类型语言
要求变量的使用要可以不用明确声明类型
java数据类型
字面整数默认为int类型
- 在字面整数后面加 L 或 l 表示long类型
字面小数默认为double类型
- 在字面小数后面加 F 或 f 表示float类型
- 也可以在字面小数后面加 D或 d 表示double类型(没必要)
强制类型转化
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
- 强转转换的格式为: (类型名) 变量名
- 不能对boolean类型进行类型转换
- 不能把对象类型转换成不相关类的类型
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
- 转换的时候可能存在内存溢出,或者精度问题
整数拓展
JDK7新特性,数字之间可以用下划线分割
int a=10_0000_0000;
byte,short,int,long之间的类型转换
-
高位转向低位时:直接从后截取低位所能接收的位数
int a=0b0000_0000_0000_0000_1111_1111_1111_1111; short b=(short)a; //此时b为0b1111_1111_1111_1111
-
低位转向高位时:在**符号位后补(与符号位相同的数,符号位为0则补0,符号位为1则补1) **使低位达到高位的位数
short a=0b0000_0000_1111_1111; int b=a; //此时b为0b0000_0000_0000_0000_0000_0000_1111_1111 short c=0b1000_0000_1111_1111; int d=c; //此时b为0b1111_1111_1111_1111_1000_0000_1111_1111
整数的其他表示方式
int num1=10; //普通十进制数
int num2=0b10; //0b或0B开头表示二进制数
int num3=010; //0开头表示八进制数
int num4=0x10 //0x或0X开头表示十六进制数
-
任何时候你的整数表达式包含byte,short,char,int及字面量数字,在进行计算以前,所有表达式的类型被提升到整形,然后逐步运算,当遇到大于int类型的变量时转化为更大范围的类型进行运算。换句话说,就是byte,short,char类型变量在运算时被看作int类型,逐步运算,当需要与更大类型的变量进行运算时,才将之前的运算结果转化成对应的类型(下方的实践经历中有具体例子)
-
当一个整数字面量的值被赋给一个byte,short,char型的变量时,如果字面量的值没有超过对应类型的范围时不会产生错误 (但如果将一个整数字面量作为参数传递给byte,short型的变量时,不论字面量的值有没有超过对应的范围都会产生错误,下方的实践经历中有具体例子)
浮点数拓展
最好完全避免使用浮点数进行比较
double a=0.1;
float b=0.1F;
float c=1/10F;
System.out.println(a==b); //false
System.out.println(c==b); //true 不同类型的浮点数精确度不同,离散的情况也不同
float d=1000000000000001f;
System.out.println(d==d+1); //true 浮点数会舍入误差
想要精准的浮点数可以通过使用BigDecimal 数学工具类
字符拓展
char可以直接输出时为字符,也可以作为数字参与运算
给字符类型变量赋值超过char范围(0~65535)时需要加上强制转换
char a=(char)-100;
char b=(char)100000;
char与整数的类型转换
- char类型变量 -> byte类型 截取后8位
- char类型变量 -> short类型 原样接收
- char类型变量 -> int类型 全部接收并在最前方补(与符号位/首位相同的数,符号位为0则补0,符号位为1则补1)
- char类型变量 -> long类型 全部接收并在最前方补(与符号位/首位相同的数,符号位为0则补0,符号位为1则补1)
- byte类型 -> char类型变量 全部接收并在最前方补(与符号位相同的数,符号位为0则补0,符号位为1则补1)
- short类型 -> char类型变量 原样接收
- int类型 -> char类型变量 截取后16位
- long类型 -> char类型变量 截取后16位
转义字符
作用 | |
---|---|
\n | 换行 (0x0a) |
\r | 回车 (0x0d) |
\f | 换页符(0x0c) |
\b | 退格 (0x08) |
\0 | 空字符 (0x0) |
\s | 空格 (0x20) |
\t | 制表符 |
\ " | 双引号 |
\ ’ | 单引号 |
\ \ | 反斜杠 |
\ddd | 八进制字符 (ddd) |
\uxxxx | 16进制Unicode字符 (xxxx) |
char b='\u0061'; //用转义16进制的方式表示'a'
System.out.println(b); // a
char d='\141'; //用转义8进制的方式表示'a'
System.out.println(d); // a
实践经历
字符与字符串
"a"//这是一个字符串
'a'//这是一个字符
String 不能接收''包裹的数据
//即 char a="a";是错误的
char 不能接收""包裹的数据
//即 String b='a';是错误的
运算过程中数据类型的自动转化
public static void main(String[] args){
int a=10_0000_0000;
int b=10;
long c=100L;
//a先与b相乘,两者均为int,所以运算结果也为int,但是运算结果超出int范围,溢出,然后再与c //相乘,结果为141006540800
System.out.println(a*b*c); //141006540800
//a先与c相乘,由于一方为long,所以两者转化为long后运算,运算结果为long类型,不会溢出,然 //后再与b相乘,结果为1000000000000
System.out.println(a*c*b); //1000000000000
}
byte与short类型参数的传参
public static void main(String[] args){
f((byte)3);//必须使用强制转换,字面值3默认为int
}
public static void f(byte a){
System.out.println(a);
}
long类型变量的赋值
public static void main(String[] args){
long a=5455455545555555L;//如果不加L,则会报错,一个字面整数默认为int,需加L声明为long类型
System.out.println(a); //最好是加大写的L
}
n(a);
}
**long类型变量的赋值**
```java
public static void main(String[] args){
long a=5455455545555555L;//如果不加L,则会报错,一个字面整数默认为int,需加L声明为long类型
System.out.println(a); //最好是加大写的L
}