一、标识符
1、标识符的概念
Java所有的组成部分都需要名字,如类名、变量名以及方法名,所有这些名称所使用的字符串序列即被称为标识符。
2、标识符规则
2.1、基本规则
- 所有的标识符都应该以字母(A-Z或者a-z)、美元符($)、或者下划线(_)开始。
- 首字符之后可以是字母(A-Z或者a-z)、美元符($)、下划线(_)或数字的任何字符组合。
- 关键字不能用作标识符。
- 标识符是大小写敏感的。
2.2、常见约定
- 标识符要符合语义信息,即见名知意。
- 包名所有字母小写。
- 类名每个单词首字母大写,其它小写,如:
CollegeStudent
。 - 变量和方法的第一个单词小写,从第二个单词开始首字母大写,如:
collegeStudent
。 - 类名和变量通常为名词或名词性短语,方法名通常为动词或动宾短语。
- 常量的所有字母大写,每个单词之间用下划线(_)连接。
2.3、Java中关键字汇总
下面将列出了Java 关键字(保留字),共50个,这些保留字不能用于任何标识符。
关键字 | 说明 |
---|---|
abstract | 抽象方法,抽象类的修饰符 |
assert | 断言条件是否满足 |
boolean | 布尔数据类型 |
break | 跳出循环或者label代码段 |
byte | 8-bit 有符号数据类型 |
case | switch语句的一个条件 |
catch | 和try搭配捕捉异常信息 |
char | 16-bit Unicode字符数据类型 |
class | 定义类 |
const | 未使用 |
continue | 不执行循环体剩余部分 |
default | switch语句中的默认分支 |
do | 循环语句,循环体至少会执行一次 |
double | 64-bit双精度浮点数 |
else | if条件不成立时执行的分支 |
enum | 枚举类型 |
extends | 表示一个类是另一个类的子类 |
final | 表示一个值在初始化之后就不能再改变了,表示方法 |
finally | 为了完成执行的代码而设计的,主要是为了程序的健 |
float | 32-bit单精度浮点数 |
for | for循环语句 |
goto | 未使用 |
if | 条件语句 |
implements | 表示一个类实现了接口 |
import | 导入类 |
instanceof | 测试一个对象是否是某个类的实例 |
int | 32位整型数 |
interface | 接口,一种抽象的类型,仅有方法和常量的定义 |
long | 64位整型数 |
native | 表示方法用非java代码实现 |
new | 分配新的类实例 |
package | 一系列相关类组成一个包 |
private | 表示私有字段,或者方法等,只能从类内部访问 |
protected | 表示字段只能通过类或者其子类访问,子类或者 |
public | 表示共有属性或者方法 |
return | 方法返回值 |
short | 16位数字 |
static | 表示在类级别定义,所有实例共享的 |
strictfp | 浮点数比较使用严格的规则 |
super | 表示基类 |
switch | 选择语句 |
synchronized | 表示同一时间只能由一个线程访问的代码块 |
this | 表示调用当前实例,或者调用另一个构造函数 |
throw | 抛出异常 |
throws | 定义方法可能抛出的异常 |
transient | 修饰不要序列化的字段 |
try | 表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码 |
void | 标记方法不返回任何值 |
volatile | 标记字段可能会被多个线程同时访问,而不做同步 |
while | while循环 |
二、基本数据类型
1、基本数据类型的概念
数据是描述客观事物的数字、字母以及能够输入到计算机中的符号。
在Java中数据类型分为两大类:基本数据类型和引用数据类型。
2、基本数据类型
Java提供的基本数据类型包括八种,分别是byte
、short
、int
、long
、float
、double
、boolean
、char
,如下:
具体说明如下:
数据类型 | 占位空间 | 保存范围 | 使用范围 |
---|---|---|---|
boolean | 布尔型 | 1字节,8位 | true 或false |
char 字符型 | 2字节,16位 | 0~65535 | 一个单一的 16 位 Unicode 字符,保存单个字母或汉字时使用 |
byte 字节型 | 1字节,8位 | -128(-2^7) ~ 127(2^7 - 1) | 对字节操作时使用,如文件读写,也可以用在大型数组中以节约空间 |
short 短整型 | 2字节,16位 | -32768(-2^15) ~ 32767(2^15 - 1) | 保存较小的整数时使用 |
int 整型 | 4字节,32位 | -2147483648(-2^31) ~ 2147483647(2^31 - 1) | 保存一般的整数时使用 |
long 长整型 | 8字节,64位 | -9223372036854775808(-2^63) ~ 9223372036854775807(2^63 -1) | 保存较长的整数时使用 |
float 浮点型(单精度) | 4字节,32位 | -3.403e38 ~ 3.403e38 | 符合IEEE 754标准的浮点数,保存小数时使用 |
double 浮点型(双精度) | 8字节,64位 | -1.798e308 ~ 1.798e308 | 符合IEEE 754标准的浮点数,保存精度较高的小数时使用 |
3、引用数据类型
Java中,除了以上提到的8种基本数据类型外,其他的数据类型都是引用数据类型,包括数组、接口、类等。
三、字面量
字面量即我们所能看到的真实具体的字面值。
注意:
- 长整型(
long
)的字面量后面必须有字母l
或L
,为了和数字1区分,一般使用大写字母L
。 - 单精度浮点型(
float
)的字面量后面必须有字母f或F,一般使用大写字母F。 - 字符型(
char
)的字面量必须使用单引号。 - 字符串型的字面量必须使用双引号。
四、变量
1、变量的概念
变量是指在程序运行过程中其值可以改变的量。本质上,变量就是计算机内存中存放数据的单元,定义变量的本质就是分配内存。当把数值赋给变量时,实际上就是将数值存储到变量代表的内存单元中。
2、Java中的变量
声明变量的基本语法为:
[修饰符] 数据类型 变量名称 [= 值] [, 变量名称 [= 值] ...];
例如:
public class Test {
public static void main(String[] args) {
int num1 = 10;
short num2 = 15, num3 = 20;
byte num4, num5;
num4 = 25;
int num6 = num2 * num3;
long num7 = 3000000000L;
double num8 = 2.5;
float num9 = 6.18F;
String str = "hello";
System.out.println(str);
}
}
说明:
- 变量必须先声明,然后初始化(赋值),最后才能使用。变量只在申明它的{}内有效。
- 初始化
byte
、int
、long
、和short
类型的变量时,均可以用十进制、八进制以及十六进制的数字,前缀0
表示 八进制数字,前缀0x
代表 十六进制数字, 例如:
public class Test {
public static void main(String[] args) {
int decimal = 100; // 十进制数100
int octal = 0144; // 八进制数0144,即十进制数100
int hexa = 0x64; // 十六进制数0x64,即十进制数100
}
}
char
类型是一个单一的16位Unicode字符,可以保存一个字母
或汉字
等,最小值是\u0000
(对应的10进制数字是0
),最大值是\uffff
(对应的10进制数字是65535
),初始化char
类型变量时,可以直接使用具体的字符,另外,也支持一些特殊字符序列,例如:
public class Test {
public static void main(String[] args) {
char c1 = '汉';
char c2 = '字';
char c3 = '\u6C49';
char c4 = '\u5B57';
char c5 = '\n'; // '\n'表示换行 (0x0a)
char c6 = '\t'; // '\t'表示制表符 (0x09)
char c7 = '\"'; // '\"'表示双引号" (0x22)
char c8 = '\''; // '\''表示单引号' (0x27)
char c9 = '\\'; // '\\'表示斜杠\ (0x5c)
char c10 = 'A';
char c11 = 65; // 表示字母A,使用十进制数字为char类型变量赋值
char c12 = 0101; // 表示字母A ,使用八进制数字为char类型变量赋值
char c13 = '\101'; // 表示字母A ,使用\ddd的形式表示八进制数ddd
char c14 = 0x41; // 表示字母A,使用十六进制数字为char类型变量赋值
char c15 = '\u0041';// 表示字母A,使用十六进制Unicode编码为char类型变量赋值
System.out.println("c1 = " + c1);
System.out.println("c2 = " + c2);
System.out.println("c3 = " + c3);
System.out.println("c4 = " + c4);
System.out.println("c5 = " + c5);
System.out.println("c6 = " + c6);
System.out.println("c7 = " + c7);
System.out.println("c8 = " + c8);
System.out.println("c9 = " + c9);
System.out.println("c10 = " + c10);
System.out.println("c11 = " + c11);
System.out.println("c12 = " + c12);
System.out.println("c13 = " + c13);
System.out.println("c14 = " + c14);
System.out.println("c15 = " + c15);
}
}
五、常量
常量是指不可改变的变量,通常用final
修饰。
比如:
public class Test {
public static void main(String[] args) {
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
}
}
基本类型中数值类型的取值范围都已经以常量的形式定义在对应的包装类中了。比如:
public class PrimitiveTypeTest {
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE);
}
}
六、表达式和运算符
1、表达式
对数据进行加工和处理称为运算,表示各种运算的符号称为运算符,参与运算的数据称为操作数。
表达式是运算符和操作数的有效组合,操作数可以是变量、常量、方法调用的返回值等。例如表达式 z = x + y
中z
、x
、y
是操作数,=
、+
是运算符。如图:
2、运算符
表示各种运算的符号称为运算符,Java中运算符大致分为赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、复合赋值运算符等等。
2.1、赋值运算符
赋值运算符的作用即是为变量赋值,比如int a = 3
。
2.2、算数运算符
算术运算符用来完成数学上的加、减、乘、除四则运算。例如:
运算符 | 说明 |
---|---|
+ | 加法运算符,求两个操作数的和 |
- | 减法运算符,求两个操作数的差 |
* | 乘法运算符,求两个操作数的积 |
/ | 除法运算符,求两个操作数的商 |
% | 求余运算符,求两个整数的余数 |
++ | 自增运算符,相当于 num = num + 1 |
-- | 自减运算符,相当于 num = num - 1 |
示例:
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 25;
System.out.println("num1 + num2 = " + (num1 + num2));
System.out.println("num1 - num2 = " + (num1 - num2));
System.out.println("num1 * num2 = " + (num1 * num2));
System.out.println("num1 / num2 = " + (num1 / num2)); // 两个整型的操作数进行除法运算,结果也会是整型,小数部分会丢失
System.out.println("num1 % num2 = " + (num1 % num2));
}
}
说明:两个整型的操作数进行除法运算,结果也会是整型,小数部分会丢失。
自增运算符++
和自减运算符--
出现在操作数前面或者后面时会有所不同。
下面是另一个示例:
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
int num3 = 25;
int num4 = 25;
System.out.println("num1 ++ = " + (num1 ++));
System.out.println("num1 = " + num1);
System.out.println("++ num2 = " + (++ num2));
System.out.println("num2 = " + num2);
System.out.println("num3 -- = " + (num3 --));
System.out.println("num3 = " + num3);
System.out.println("-- num4 = " + (-- num4));
System.out.println("num4 = " + num4);
}
}
说明:
- 表达式
num ++
和表达式++ num
都会使num
的值加上1
,区别在于表达式num ++
的返回值为num
,而表达式++ num
的返回值为num + 1
。 - 表达式
num --
和表达式-- num
都会使num的值减去1
,区别在于表达式num --
的返回值为num
,而表达式-- num
的返回值为num - 1
。
2.3、关系运算符
运算符 | 示例 | 说明 |
---|---|---|
> | num1 > num2 | 如果num1 > num2成立,结果为true,否则结果为false |
>= | num1 >= num2 | 如果num1 >= num2成立,结果为true,否则结果为false |
< | num1 < num2 | 如果num1 < num2成立,结果为true,否则结果为false |
<= | num1 <= num2 | 如果num1 <= num2成立,结果为true,否则结果为false |
== | num1 == num2 | 如果num1 == num2成立,结果为true,否则结果为false |
!= | num1 != num2 | 如果num1 != num2成立,结果为true,否则结果为false |
实例:
public class Test {
public static void main(String[] args) {
int num1 = 15;
int num2 = 30;
System.out.println("num1 == num2 = " + (num1 == num2));
System.out.println("num1 != num2 = " + (num1 != num2));
System.out.println("num1 > num2 = " + (num1 > num2));
System.out.println("num1 < num2 = " + (num1 < num2));
System.out.println("num2 >= num1 = " + (num2 >= num1));
System.out.println("num2 <= num1 = " + (num2 <= num1));
}
}
2.4、逻辑运算符
逻辑运算符是对布尔类型的操作数进行与、或、非的运算。例如:
运算符 | 示例 | 说明 |
---|---|---|
&& | true && true | 两个操作数均为true ,结果为true ,否则结果为false |
|| | true||false | 两个操作数中有一个为true ,结果为true,否则结果为false |
! | !(false) | 操作数为false ,结果为true ,否则结果为false |
实例:
public class Test {
public static void main(String[] args) {
// 逻辑运算符基本示例
boolean b1 = true;
boolean b2 = false;
System.out.println("(b1 && b2) = " + (b1 && b2));
System.out.println("(b1 || b2) = " + (b1 || b2));
System.out.println("!(b1 && b2) = " + !(b1 && b2));
// 逻辑运算符和关系运算符一起使用的例子
int num1 = 15;
int num2 = 10;
int num3 = 30;
System.out.println("(num1 > num2 && num1 > num3) = " + (num1 > num2 && num1 > num3));
System.out.println("(num1 > num2 || num1 > num3) = " + (num1 > num2 || num1 > num3));
System.out.println("!(num1 > num2 && num1 > num3) = " + !(num1 > num2 && num1 > num3));
}
}
逻辑运算会出现短路的情形,即当使用&&
运算符,第一个操作数为false
时,不再判断第二个操作数;当使用||
运算符,第一个操作数为true
时,不再判断第二个操作数。
下面是一个示例:
public class Test {
public static void main(String[] args) {
int num1 = 5;
int num2 = 5;
boolean b1 = (num1 < 4) && (num1 ++ < 10);
boolean b2 = (num2 > 4) || (num2 ++ > 10);
System.out.println("b1 = " + b1);
System.out.println("b2 = " + b2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
说明:
- 输出结果中
num1
和num2
的值均仍然为5
,num1 ++
和num2 ++
均没有被执行。
2.5、位运算符
位运算是对整数类型的操作数进行的二进制运算,总共7个,例如:
运算符 | 说明 |
---|---|
& (位与) | 如果相对应位都是1,则结果为1,否则为0 |
| (位或) | 如果相对应位都是0,则结果为0,否则为1 |
^ (位异或) | 如果相对应位值相同,则结果为0,否则为1 |
〜 (位反) | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 |
<< (左位移) | 左操作数按位左移右操作数指定的位数 |
>> (右位移) | 左操作数按位右移右操作数指定的位数 |
>>> (无符号右位移 ) | 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 |
实例:
public class Test {
public static void main(String[] args) {
int num1 = 60; /* 60 = 0011 1100 */
int num2 = 13; /* 13 = 0000 1101 */
int num3 = 0;
num3 = num1 & num2; /* 12 = 0000 1100 */
System.out.println("num1 & num2 = " + num3 );
num3 = num1 | num2; /* 61 = 0011 1101 */
System.out.println("num1 | num2 = " + num3 );
num3 = num1 ^ num2; /* 49 = 0011 0001 */
System.out.println("num1 ^ num2 = " + num3 );
num3 = ~num1; /*-61 = 1100 0011 */
System.out.println("~num1 = " + num3 );
num3 = num1 << 2; /* 240 = 1111 0000 */
System.out.println("num1 << 2 = " + num3 );
num3 = num1 >> 2; /* 15 = 1111 */
System.out.println("num1 >> 2 = " + num3 );
num3 = num1 >>> 2; /* 15 = 0000 1111 */
System.out.println("num1 >>> 2 = " + num3 );
}
}
2.6、复合赋值运算符
复合赋值运算符是将算术运算和赋值运算同时进行的计算。(num的初始值是10)
表达式 | 等价的Java代码 | 运行结果 |
---|---|---|
num += 3 | num = num + 3 | num 的结果是 13 |
num -= 3 | num = num - 3 | num 的结果是 7 |
num *= 3 | num = num * 3 | num 的结果是 30 |
num /= 3 | num = num / 3 | num 的结果是 3 |
num %= 3 | num = num % 3 | num 的结果是 1 |
实例:
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
int num3 = 10;
int num4 = 10;
int num5 = 10;
System.out.println("(num1 += 3) = " + (num1 += 3));
System.out.println("(num2 -= 3) = " + (num2 -= 3));
System.out.println("(num3 *= 3) = " + (num3 *= 3));
System.out.println("(num4 /= 3) = " + (num4 /= 3));
System.out.println("(num5 %= 3) = " + (num5 %= 3));
}
}
2.7、条件运算符(三元运算符)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要作用是决定哪个值应该赋值给变量。
条件运算符的语法如下:
[数据类型 变量名称 = ](布尔表达式) ? 值 if true : 值 if false;
实例:
public class Test {
public static void main(String[] args) {
int num1 , num2, num3;
num1 = 10;
// 如果 num1 等于 1 成立,则设置 num2 为 20,否则为 30
num2 = (num1 == 1) ? 20 : 30;
System.out.println( "Value of num2 is : " + num2 );
// 如果 num1 等于 10 成立,则设置 num3 为 20,否则为 30
num3 = (num1 == 10) ? 20 : 30;
System.out.println( "Value of num3 is : " + num3 );
}
}
3、运算符的优先级
当表达式中有多个运算符参与运算时,必须为每种运算符规定一个优先级,以决定运算符在表达式中的运算次序。优先级高的先运算,优先级低的后运算,优先级相同的由结合性确定计算次序。运算符的优先级及结合性如下表所示:
运算符 | 优先级 | 结合性 |
---|---|---|
() 、[] 、. (点操作符) | 1 | 从左向右 |
+ (一元运算)、- (一元运算)、++ 、-- 、! 、~ | 2 | 从右向左 |
* 、/ 、% | 3 | 从左向右 |
+ 、- | 4 | 从左向右 |
>> 、>>> 、<< | 5 | 从左到右 |
> 、>= 、< 、<= | 6 | 从左到右 |
== 、!= | 7 | 从左到右 |
& | 8 | |
^ | 9 | |
| | 10 | |
&& | 11 | |
|| | 12 | |
? : | 13 | 从右到左 |
= 、+= 、-= 、*= 、/= 、%= | 14 | 从右到左 |
4、案例
下面是一个接收控制台输入数据,并综合运用表达式和运算符的案例。
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int xb_java;
int xb_html;
int lb_java;
int lb_html;
System.out.println("请输入新兵的java成绩");
xb_java = input.nextInt();
System.out.println("请输入新兵的html成绩");
xb_html = input.nextInt();
System.out.println("请输入老兵的java成绩");
lb_java = input.nextInt();
System.out.println("请输入老兵的html成绩");
lb_html = input.nextInt();
System.out.println("新兵的平均成绩是:" + (xb_java + xb_html) / 2);
System.out.println("老兵的平均成绩是:" + (lb_java + lb_html) / 2);
System.out.println("新兵java成绩追上老兵了吗? " + ((xb_java >= lb_java) ? "是的" : "没有"));
System.out.println("新兵html成绩超过老兵了吗? " + ((xb_html > lb_html) ? "是的" : "没有"));
System.out.println("新兵的平均成绩追上老兵了吗? " + ((((xb_java + xb_html) / 2) >= ((lb_java + lb_html) / 2)) ? "是的" : "没有"));
System.out.println("新兵每门课成绩都追上老兵了吗? " + (((xb_html > lb_html) && (xb_java > lb_java)) ? "是的" : "没有"));
}
}
说明:
- 本例中涉及了如何从键盘上输入数据。JDK中提供了很多已经开发好的类库,在程序开发过程中可以直接使用。
java.util.Scanner
类提供了获取用户在控制台中输入的数据的功能。使用时分为两步:
// 1.创建Scanner对象,该对象用于接收用户在控制台中输入的数据
java.util.Scanner input = new java.util.Scanner(System.in);
// 2.使用Scanner对象提供的方法获取用户输入的数据
int score = input.nextInt();
java.util.Scanner
类的实例拥有多种方法用于输入不同类型的数据
,如下表:
方法 | 方法说明 |
---|---|
next() | 输入字符串 |
nextInt() | 输入int 类型整数 |
nextShort() | 输入short 类型整数 |
nextLong() | 输入long 类型整数 |
nextFloat() | 输入float 类型浮点数 |
nextByte() | 输入byte 类型数据 |
七、数据类型转换
Java中,整型、常量、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换顺序从低级到高级。如下:
低 ----------------------------------------> 高
byte,short,char —> int —> long —> float —> double
需要注意:
- 不能对
boolean
类型进行类型转换。 - 转换过程中可能导致溢出或损失精度。
- 浮点数到整数的转换是通过舍弃小数得到。
1、自动类型转换
当将低级别的值赋给高级别的变量时,系统会自动完成数据类型的转换。
实例:
public class Test {
public static void main(String[] args) {
long num1 = 333333333; // 末尾没有字母l或L的整型字面量,通常会被当作int类型,赋值给long型的变量时,会进行自动数据类型转换
double num2 = 12.34F; // 12.34F是一个float型的浮点数,赋值给double型的变量时,会进行自动数据类型转换
int num3 = 52;
float num4;
num4 = num3; // 将int类型的变量num3的值赋值给float类型的变量num4,会进行自动数据类型转换
}
}
2、强制类型转换
当将高级别的值赋给低级别的变量时,需要进行强制类型转换。形式如下:
(数据类型) 待转换的值;
实例:
public class Test {
public static void main(String[] args) {
float num1 = (float) 12.34; // 末尾没有字母f或F的浮点型字面量,会被当作double类型,赋值给float型的变量时,需要强制类型转换
int num2 = (int) 3333333L; // 3333333L是一个long类型的整数,赋值给int类型的变量时,需要强制类型转换
float num3 = 1.6F;
int num4 = (int) num3; // 将float类型的变量num3的值赋值给int类型的变量num4,需要强制类型转换
}
}
public class Test {
public static void main(String[] args) {
float num1 = (float) 12.34; // 末尾没有字母f或F的浮点型字面量,会被当作double类型,赋值给float型的变量时,需要强制类型转换
int num2 = (int) 3333333L; // 3333333L是一个long类型的整数,赋值给int类型的变量时,需要强制类型转换
float num3 = 1.6F;
int num4 = (int) num3; // 将float类型的变量num3的值赋值给int类型的变量num4,需要强制类型转换
}
}
3、表达式返回结果的数据类型
表达式返回结果的数据类型一般由表达式中占用字节空间最大的类型决定。
实例:
public class Test {
public static void main(String[] args) {
int num1 = 5;
float num2 = 6f;
double num3 = 7.8;
double result = num1 + num2 + num3;
System.out.println("result = " + result);
}
}
字符串String
与其他数据类型进行==+==运算时,都会将其他数据类型先转换为String
,然后两个字符串进行 拼接。
实例:
public class Test {
public static void main(String[] args) {
int num1 = 15;
float num2 = 13.24F;
String str = "hello";
System.out.println("(num1 + num2 + str) = " + (num1 + num2 + str));
System.out.println("(num1 + str + num2) = " + (num1 + str + num2));
System.out.println("(str + num1 + num2) = " + (str + num1 + num2));
}
}
byte
类型的变量值之间、short
类型的变量值之间、或者byte
类型的变量值和short
类型的变量值,它们在进行运算时,结果为int
类型。
实例:
public class Test {
public static void main(String[] args) {
byte num1 = 1;
short num2 = 1;
//short num3 = num1 + num2; // 本行会报错,因为byte类型的变量值与short类型的变量值进行+运算,结果为int类型
int num4 = num1 + num2;
System.out.println("num4 = " + num4);
}
}
4、案例
4.1、案例一
public class Test {
public static void main(String[] args) {
int num1 = 15, num2 = 4, num3;
float num4, num5;
num3 = num1 / num2;
num4 = num1 / num2;
num5 = (float) num1 / num2;
System.out.println("num3 = " + num3);
System.out.println("num4 = " + num4);
System.out.println("num5 = " + num5);
}
}
说明:
num3
的值为3
,因为两个int
类型的操作数进行除法运算,结果仍然是整数,会丢失小数部分,故num1 / num2
的结果为3
,之后,将数值3
赋值给int
类型的变量num3
,打印num3
的结果即为3
。num4
的值为3.0
,同上,num1 / num2
的结果为3
,将整数3
赋值给float
型的变量num4
时,会自动进行数据类型转换,整型的3
转换为浮点型的3.0
。num5
的值为3.75
,因为表达式中先将num1
进行了强制类型转换,整形的num1
保存的值15
在强制转换为float
型后值为15.0
,此时进行15.0 /num2
运算,表达式返回结果的数据类型由表达式中占用字节空间最大的类型决定,故结果为float
型,值为3.75
,再将浮点数3.75
赋值给float
类型的变量num5
,最终,num5
的打印结果为3.75
。
4.2、案例二
public class Test {
public static void main(String[] args) {
short s1 = 18;
short s2;
//s2 = s1 + 1; // 本行会报错,因为1会被认为是int类型,所以s1 + 1的值会是int类型,无法直接赋值给short类型的变量
short s3;
s3 = 18 + 1; // 本行没有错误,表达式18 + 1在编译时确定了其值在short范围内,因此可以赋值
System.out.println("s3 = " + s3);
}
}
说明:
- 表达式
s2 = s1 + 1
报错,因为1
会被认为是int
类型,所以s1 + 1
的值会是int
类型,无法直接赋值给short
类型的变量s2
。 - 表达式
s3 = 18 + 1
没有报错,表达式18 + 1
在编译时确定了其值19
在short
范围内,因此可以赋值。