Java数据类型
- 一、基本类型(四类八种)
- 1.整数
- 2.浮点数
- 3.字符
- 4.布尔
- 二、引用类型
- 三、变量作用域
- 四、字面值
- 五、final关键字修饰常量
- 六、类型转换
- 七、数值提升
- 八、打印输出
- 九、相关例题
一、基本类型(四类八种)
1.整数
(1)int
一个int变量占4个字节(-2^31 ~ 2^31-1).大概是-21亿到+21亿.
//定义一个整型变量
int value = 10;
// 使用代码查看Java中的整型数据范围
public static void theInt () {
//Integer是Java标准库中已经实现好的一个类,是int的“包装类”
System.out.println(Integer.MAX_VALUE);//int最大值
System.out.println(Integer.MIN_VALUE);//int最小值
//运算结果超出可表示的最大范围,产生溢出
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE - 1);
}
21亿这样的数字对于大数据时代来说,是很容易超出的,针对这种情况,Java提供了更大范围的数据类型 long 类型.
(2) long
一个long变量占8个字节(-2^63 ~ 2^63-1)
// 定义长整型变量
long num = 100L;
// 使用代码查看Java中的长整型数据范围
public static void theLong() {
//Long是long的“包装类”
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
//也可写成100l,但因为小写l会与数字1混淆,尽量选择大写L
long num = 100_0000_0000L;
}
(3)byte
字节类型表示的也是整数,只占一个字节(-128~127)
// 定义字节型变量
byte num = 10;
(4)short
一个short变量占2个字节(-32768 ~ +32767)
// 定义短整型变量
short num = 0;
2.浮点数
(1)double
占8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围.
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差.
// 定义短整型变量
double num = 1.1;
System.out.println(num * num);
// 执行结果
1.2100000000000002
public static void theDouble(){
double a = 1;
double b = 2;
System.out.println(a / b);
//double类型相除,结果为0.5
System.out.println(1 / 2);
//两个整型数字相除,结果为0,只保留整数部分
double a = 1.1;
System.out.println(a * a);
if (a * a == 1.21) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
//结果是不相等,会丢失一定的精度,所以要尽量少用==作为else最后判断
if (a * a - 1.21 < 0.0000001
&& a * a - 1.21 > -0.0000001) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
//因为精度丢失,用减法再去和一个非常接近于0的数字作比较来替代==会更好
(2)float
占4个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float
// 定义单精度浮点型变量,也可写成1.0F
float num =1.0f;
3.字符
(1)char
Java 中使用 Unicode 表示字符.
一个字符占用2个字节, 表示的字符种类更多, 包括中文
//定义字符型变量,用 单引号+单个字母 表示字符字面值
char ch = 'A';
//
public static void theChar() {
// 单引号括起来为char型'A',若写成双引号则是String型"A"
char a = 'A';
char b = '中';
System.out.println(a);
}
4.布尔
(1)boolean
没有规定具体占几个字节,有些JVM的实现是占1个字节,有些占1个比特位
该类型只有两种取值,true / false
Java的boolean类型和int不能相互转换,不存在0和非0表示真假
//定义布尔型变量
boolean value = true;
二、引用类型
(1)String
不属于基本数据类型,而是引用类型,引用可以理解成是低配指针
有些不太方便表示的字符需要用到转义字符:
转义字符 | 解释 |
\n | 换行 |
\r | 回到行首 |
\t | 水平制表符 |
\’ | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
// 定义字符串类型变量,用 双引号+若干字符 表示字符串字面值
String str = "hello";
// An highlighted block
public static void theString(){
//需要打印My name is "zsy",其中双引号需要转义,用到/“来表示
String str1 = "My name is \"zsy\"";
System.out.println(str1);
//需要打印字符串的长度,用到str。length()
String str2 = "hehe";
System.out.println(str2.length());
//用 + 操作来实现字符串的拼接
String a = "hello";
String b = "world";
System.out.println(a + b);
//用 + 来进行字符串和整数的拼接
String c = "hello";
System.out.println(c + 10 + 20);
System.out.println(c + (10 + 20));
System.out.println(10 + 20 + c);
//执行结果
hello1020
hello30
30hello
}
三、变量作用域
变量能生效的范围,一般就是该变量定义所在的代码块(大括号内)
public static void main(String[] args) {
int num = 10;
System.out.println("num = " + num);
//输出num=10
}
System.out.println(num);
//编译失败,找不到变量num
}
四、字面值
字面值常量 | 解释 |
010 | int型(十进制) |
0x10 | int型(八进制),数字 0 开头,010 是十进制的 8 |
10L | long型,也可写作 10l |
1.0 | double型。也可写作 1.0d 或 1.0D |
1.5e2 | double型,科学计数法表示,相当于 1.5 * 10^2 |
1.0f | float型,也可写作 1.0F |
true | boolean型,同样的还有false |
‘a’ | char型,单引号中只能有一个字符 |
“abc” | String型,双引号中可以有多个字符 |
五、final关键字修饰常量
经过final修饰后即为常量,不可再像变量一样分配值
public static void theFinal(){
final int num = 10;
num = 20;
System.out.println(num);
}
//编译错误,无法为最终变量num分配值
六、类型转换
public static void typeConversion() {
//long 表示的范围更大,可以将 int 赋给 long ,但不能将 long 赋给 int
//同理, int 也可以赋给 double ,但使用int字面值常量赋给 short 和 byte 的时候,
//Java会自动进行校验,判定赋值是否合理
// int 和 boolean 不能相互赋值,类型不兼容
int a = 10;
long b = 20_0000_0000L;
b = a;//编译通过
a = b;//编译出错,可能会损失精度
// 但凡代码中涉及到 强制类型转换,
// 意味着代码的正确性, 就需要程序猿人工来保证了.
a = (int)b;
int a = 10;
double b = 20.0;
b = a;
a = (int)b;//a = 20,丢失小数部分
//boolean 和 int 强制转换也不行
int a = 10;
boolean b = true;
a = (int)b;//编译出错
b = a;//编译出错
//整数转字符串
int num = 10;
//方法1
String str = "" + num;
System.out.println(str);//str=10
//方法2
String str1 = String.valueOf(num);
System.out.println(str1);//str=10
//字符串转整数
String str = "10.5";
double num = Double.parseDouble(str);//num=10.5
int num1 = Integer.parseInt(str);//编译错误
String str1 = "100";
double num = Double.parseDouble(str1);//num=100.0
int num1 = Integer.parseInt(str1);//num1=100
}
七、数值提升
public static void valueIncrease() {
int a = 10;
long b = 20;
//两个不同数值类型相加,会把低字节提升至高字节再进行相加,
//然后用高字节类型接收结果,要用低字节接收就要用强制类型转换
long ret = a + b;//编译成功
int ret = a + b;//编译出错,long 转换 int 丢失精度
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);//编译成功
byte d = a + b;//编译错误
//byte类型在进行 + 操作时,会提升至int类型,得到int类型结果再赋给d
//short 和 byte 这种不满4字节的类型计算时都会提升至4字节int进行计算
}
八、打印输出
public static void thePrint(){
//println输出的内容自带%n
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
System.out.format(format, msg); // 完全等同于 printf
}
九、相关例题
例1:经过强制类型转换以后,变量a,b的值分别为多少(B)
short a =128;
byte b =(byte) a;
A.128 127
B.128 - 128
C.128 128
D.编译错误
题解:
short占两个字节,表示 -2^7 ~ 2^7-1
byte占一个字节,表示 -128 ~ 127
所以,a = 128;
经过强制类型转换 b= 128 超出可表示的范围,转换成二进制为补码1000 0000,第一位为符号位,为负,反码0111 1111,原码就是1000 0000,为-128;
例2:下面属于java包装类的是( BCD )
A.String
B.Long
C.Character
D.Short
题解:
BCD分别是long,char,short的包装类
String不是包装类,也不是基础数据类型
例3:下面关于变量及其范围的陈述哪些是不正确的( B )
A.实例变量是类的成员变量
B.实例变量用关键字static声明
C.在方法中定义的局部变量在该方法被执行时创建
D.局部变量在使用前必须被初始化
题解:
static声明的是 类变量
实例变量是在类内而方法外声明定义的变量,也叫做成员变量