Java-数据类型
- 一、字面常量
- 二、数据类型
- (1)基本数据类型
- 三、变量
- 1、变量概念
- 2、语法格式
- (1)语法:
- (2)示例:
- 3、整型变量
- (1)整型变量(int)
- a.语法
- b.最大值与最小值
- c.注意
- (2)长整型变量(long)
- a.语法
- b.最大值与最小值
- c.注意
- (3)短整型变量(short)
- a.语法
- b.最大值与最小值
- c.注意
- (4)字节型变量(byte)
- a.语法
- b.最大值与最小值
- c.注意
- 4、浮点型变量
- (1) 双精度浮点型
- a.语法
- b.最大值与最小值
- c.注意
- (2)单精度浮点型
- a.语法
- b.最大值与最小值
- c.注意
- 5、字符型变量
- a.语法
- b.最大值与最小值
- c.注意
- 6、布尔型变量
- a.语法
- b.注意
- 7、 类型转换
- (1)自动类型转换(隐式转换)
- (2)强制类型转换(显式转换)
- (3)转换时的注意事项
- (4)类型提升
- int 与 long之间
- byte与byte之间
- 总结
- 四、字符串变量
- 1、字符串拼接
- 2、int转String
- 3、String转int
一、字面常量
字面常量顾名思义就是固定不变的量。
比如:
public class Demo{public static void main(String[] args){System.Out.println("hello world!");System.Out.println(100);System.Out.println(3.14);System.Out.println('A');System.Out.println(true);System.Out.println(false);}
}
在上面的代码中,helloworld
、100
、3.14
等都是常量。那么根据这些常量的不同类型,可以将字面常量分为:
- 字符串常量:由
""
括起来的,比如“12345”、“hello”、“你好”。 - 整形常量:程序中直接写的数字(注意没有小数点),比如:100、1000
- 浮点数常量:程序中直接写的小数,比如:3.14、0.49
- 字符常量:由 单引号 括起来的当个字符,比如:‘A’、‘1’
- 布尔常量:只有两种true和false
- 空常量:null
二、数据类型
在Java中数据类型分为两大类:基本数据类型和引用数据类型
(1)基本数据类型
基本数据类型分为四大类:整型、浮点型、字符型以及布尔型
这四大类可以细分为八种:
这里我们需要做几点说明,用来区别我们之前学过的C语言。
在C语言中,部分数据类型在32位电脑和64位电脑中是存在一定差异的。但是java中的数据类型不论是32位还是64位,都不会发生改变,这也就是可移植性的体现,如果大家阅读了作者上一章的内容:JavaSE介绍与第一个Java程序的话,就知道这种可移植性是与java的虚拟机有关的。
同时,整型和浮点型都是有符号的。
三、变量
1、变量概念
在我们的java程序中,除了有始终不变的字面常量外,还有一些量是变量,这些变量也是有分类的,比如有的变量是浮点数,有的变量是字符,因此刚刚介绍的数据类型就是来定义不同种类的变量的。
2、语法格式
(1)语法:
方式1:
数据类型 变量名 = 初始值;
当然也可以分开写:
方式2:
数据类型 变量名;
变量名 = 初始值;
如果我们要定义很多相同数据类型的变量,我们也可以采取以下方式:
方式3:
数据类型 变量名1 = 初始值1,变量名2 = 初始值2,变量名3 = 初始值3,...;
(2)示例:
方式1
int a = 10;
double b = 2.3;
char c = 'c';
方式2
int a;
a = 10;double b;
b = 20.1;
方式3
int a1 = 1, a2 = 2, a3 = 3;
3、整型变量
(1)整型变量(int)
a.语法
\\方式1
int a1 = 1;
\\方式2
int a2;
a2 = 2;
b.最大值与最小值
我们可以用以下方式输出int
的最大值和最小值。
//最大值
System.out.println(Integer.MAX_VALUE);
//最小值
System.out.println(Integer.MIN_VALUE);
c.注意
- 使用未初始化的变量会发生报错。
- 如果没有合适的初始值,可以先赋值为0。
- 在给int赋值的时候,如果超过了
int
的范围,则会发生报错。 - int的包装类型为 Integer。
(2)长整型变量(long)
a.语法
\\方式1
long a1 = 1L;
\\方式2
long a2;
a2 = 2L;
这里要在数值的后面加字母L
,因为整型的字面常量默认是int
类型的,因此如果我们给long
类型的变量赋上超过int
范围的数字的话,会出现报错,所以我们需要将字面常量转化为长整型。
b.最大值与最小值
//最大值System.out.println(Long.MAX_VALUE);
//最小值
System.out.println(Long.MIN_VALUE);
c.注意
- long类型的赋值需要给数字加上
L
。 - 长整型不论在那个系统下都占8个字节。
- long的包装类型为Long。
(3)短整型变量(short)
a.语法
\\方式1
short a1 = 1;
\\方式2
short a2;
a2 = 2;
short不需要将字面常量的int转化为short,因为short的范围比int小,所以我们不会遇到超过int范围的赋值情况。
b.最大值与最小值
//最大值
System.out.println(Short.MAX_VALUE);
//最小值
System.out.println(Short.MIN_VALUE);i
c.注意
- short在任何系统下都占2个字节。
- 使用时注意不要超过范围(一般使用比较少)。
- short的包装类型为Short。
(4)字节型变量(byte)
a.语法
\\方式1
byte b1 = 10;
\\方式2
byte b2;
b2 = 10;
b.最大值与最小值
//最大值
System.out.println(Byte.MIN_VALUE);
//最小值
System.out.println(Byte.MAX_VALUE);
c.注意
4、浮点型变量
(1) 双精度浮点型
a.语法
double d1 = 1.0;
double d2;
d2 = 2.0;
b.最大值与最小值
//最大值
System.out.println(Double.MAX_VALUE);
//最小值
System.out.println(Double.MIN_VALUE);
c.注意
- double在任何系统下都占8个字节。
- double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
为了证明这一点,我们可以运行以下代码:
public class HelloWorld {public static void main(String[] args) {double d1 = 1.1;double d2 = 1.1;System.out.println(d1 * d2);}
}
我们会发现运行结果为:
- double的包装类型为Double。
- 在运算过程中只有至少存在一个浮点数的时候,结果才是浮点数。
(2)单精度浮点型
a.语法
//方式1:
float a1 = 1.2f;
//方式2:
float b1;
b1 = 2.1f;
b.最大值与最小值
//最大值
System.out.println(Float.MAX_VALUE);
//最小值
System.out.println(Float.MIN_VALUE);
c.注意
- 浮点型的字面常量默认是double类型的,所以如果我们想给浮点型赋值的话,我们需要在字面常量的后面加上字符
f
。 - float 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float. float的包装类型为Float。
5、字符型变量
a.语法
//方式1:
char a1 = 'a';
//方式2:
char a2;
a2 = 'b';
b.最大值与最小值
System.out.println(Character.MAX_VALUE);System.out.println(Character.MIN_VALUE);
c.注意
- 计算机中的字符本质上是一个整数。在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文。
- char的包装类型为Character。
6、布尔型变量
a.语法
//方式1:
boolean b1 = true;
//方式2:
boolean b2;
b2 = false;
b.注意
- boolean 类型的变量只有两种取值, true 表示真, false 表示假。
- Java 的 boolean 类型和 int 不能相互转换,== 不存在 1 表示 true, 0 表示 false 这样的用法==。
- Java虚拟机中并没有明确地规定boolean类型占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占1个字节。
- boolean的包装类型为Boolean。
7、 类型转换
Java是一个强类型的语言,即当不同类型之间的变量相互赋值的时候,会有严格的类型校验规则。
在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
(1)自动类型转换(隐式转换)
什么叫自动类型转换?自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
那么什么情况下会进行自动类型转换呢?
当我们将数据范围小的转为数据范围大的时候,编译器会自动进行类型转换。
比如下面的代码:
public class HelloWorld {public static void main(String[] args) {int a = 100;long b = 200;b = a;//将int赋值给long,int会自动转化为long}
}
那么如果我们反过来呢?我们将long赋值给int,那么此时由于是需要将long转换为int,即大范围转小范围的过程,所以此时不会发生自动类型转换,编译器会出现报错。
如下图所示:
(2)强制类型转换(显式转换)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的时候,需要我们手动将大类型转化为小类型,转化的语法即我们在被转变量前加上(小范围的数据类型)
。
示例如下:
public class HelloWorld {public static void main(String[] args) {int a = 1;long b = 2;a = (int)b;byte b1 = (byte) 12456;double d1 = 3.14;float f1 = (float)d1;}
}
(3)转换时的注意事项
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型。
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失。
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。
- 强制类型转换不一定能成功,不相干的类型不能互相转换(比如整型和布尔型)。
(4)类型提升
类型提升是指在进行表达式运算的时候,数据类型小的会被提升到数据类型大的。
int 与 long之间
public class HelloWorld {public static void main(String[] args) {int a = 10;long b = 20;long c = a + b;//int + long表达式,int会被提升到long类型,所以转化成了long+long,结果也为longint d = a + b;//结果也为long,但是long结果给int需要强制类型转换,不转换会报错。}
}
byte与byte之间
public class HelloWorld {public static void main(String[] args) {byte a = 30;byte b = 120;byte c = a + b;//出现报错,java: 不兼容的类型: 从int转换到byte可能会有损失}
}
为什么byte之间的运算还与int的转化有关呢?
byte 和 byte 都是相同类型, 但是出现编译报错。原因是,虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a和 b 都提升成 int, 再进行计算,得到的结果也是 int, 这时赋给 c, 就会出现上述错误。
从硬件运算效率的角度分析:
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据,为了硬件上实现方便,诸如 byte 和 short这种低于 4 个字节的类型,会先提升成 int, 再参与计算。
总结
- 不同类型的数据混合运算,范围小的会提升成范围大的。
- 对于 short,byte 这种比 4 个字节小的类型,会先提升成 4 个字节的 int , 再运算。
四、字符串变量
1、字符串拼接
public class HelloWorld {public static void main(String[] args) {String str1 = "ab";String str2 = "cd";String str3 = str1 + str2;System.out.println(str3);}
}
2、int转String
public class HelloWorld {public static void main(String[] args) {int num = 10;//方法1:String str1 = num + "";//方法2:String str2 = String.valueOf(num);}
}
其余类型的转化与之类似。
3、String转int
public class HelloWorld {public static void main(String[] args) {String str1 = "123";int a1 = Integer.parseInt(str1);System.out.println(a1+3);}
}
其余类型的转化与之类似。