1.字面常量
2.数据类型
3.变量
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
在我们运行的第一个Java的程序中,System.Out.println("Hello, World");
语句,不管怎么运行,最后的输出结果都是Hello,World,其实就是说明了Hello,World就是一个字面常量。常量顾名思义就是指程序在运行的时候,固定不变的量。
public class ConstantExamples {
public static void main(String[] args) {
// 1. 字符串常量,用双引号括起来
String str1 = "你好";
String str2 = "123456";
String str3 = "Hello, World";
System.out.println("字符串常量示例:" + str1 + "," + str2 + "," + str3);
// 2. 整形常量,即整数
int int1 = 520;
int int2 = 1314;
System.out.println("整形常量示例:" + int1 + "," + int2);
// 3. 浮点型常量,即小数,这里float类型需加f后缀,double类型可直接写
float floatNum = 1.1f;
double doubleNum = 13.14;
System.out.println("浮点型常量示例:" + floatNum + "," + doubleNum);
// 4. 字符常量,用单引号括起来,且只能有一个字符
char char1 = 'A';
char char2 = '2';
System.out.println("字符常量示例:" + char1 + "," + char2);
// 5. 布尔常量,值为true或false
boolean bool1 = true;
boolean bool2 = false;
System.out.println("布尔常量示例:" + bool1 + "," + bool2);
// 6. 空常量null,一般用于引用数据类型的初始化等
String nullStr = null;
System.out.println("空常量示例:" + nullStr);
// 注意:直接打印nullStr可能输出"null"字符串,实际代表引用为空,后续使用要避免空指针异常
}
}
字面常量分为常见的六类:
1.字符串常量:一般都会被“ ”括起来,比如:“你好”,“123456”,“Hello,World”
2.整形常量:程序中的整数,比如:520,1314
3.浮点数常量:程序中的小数,比如:1.1,13.14
4.字符常量:一般是由‘’括起来,比如:‘A’,‘2’
5.布尔常量:分别为true和false
6.空常量:null
注意⚠️:字符串,整形,浮点型,字符型以及布尔型都在Java中被称为基本数据类型
在Java中,数据类型分为两种基本数据类型和应用数据类型。
基本数据类型有八种:
数据类型 | 关键字 | 内存占用 | 范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128 ~ 127 |
短整型 | short | 2 字节 | -32768 ~ 32767 |
整型 | int | 4 字节 | −231-2^{31}−231 ~ 231−12^{31} - 1231−1 |
长整型 | long | 8 字节 | −263-2^{63}−263 ~ 263−12^{63} - 1263−1 |
单精度浮点数 | float | 4 字节 | 有范围,一般不关注 |
双精度浮点数 | double | 8 字节 | 有范围,一般不关注 |
字符型 | char | 2 字节 | 0 ~ 65535 |
布尔型 | boolean | 没有明确规定 | true 和 false |
注意⚠️:
1.无论是在16位还是32位的系统,int都占用4字节,long都占用8个字节
2.整形和浮点型都是有符号的
3.整形默认是int类型,浮点型默认是double类型
4.字符串String为引用数据类型,而不是基本数据类型
在程序中除了存在一成不变的常量,自然也会存在经常发生变化的内容。对于这些经常发生变化的内容,我们一般称为变量。然而数据类型就是用来定义不同类型的变量
语法格式: 数据类型 变量名 = 初始值;
int a = 10;
// 声明并初始化
int num1 = 10;
// 先声明,后赋值
int num2;
num2 = 20;
注意⚠️:
1.int不管是在什么系统下都是4字节
2.设置初始值的时候,不要超过范围
3.int的包装类为Integer(Integer为引用数据类型)
// 使用大写L标识为long类型
long num1 = 100L;
// 使用小写l标识为long类型
long num2 = 200l;
System.out.println("num1的值:" + num1);
System.out.println("num2的值:" + num2);
注意⚠️:
1.长整型变量初始化的时候,需要在具体的值后面加L或l
2.长整型变量不管在什么系统下都是8个字节
3.long的包装类为Long(Long为引用数据类型)
// 声明并初始化一个short类型变量
short num1 = 100;
System.out.println("num1的值:" + num1);
注意⚠️:
1.短整型变量不管在什么系统下都是2个字节
2.short的包装类为Short(Short为引用数据类型)
// 声明并初始化一个byte类型变量
byte num1 = 100;
System.out.println("num1的值:" + num1);
注意⚠️:
1.字节型变量不管在什么系统下都是1个字节
2.byte的包装类为Byte(Byte为引用数据类型)
double num1 = 3.14; // 直接赋值(默认被视为double)
double num2 = 2.71828d; // 后缀d/D(可选,但建议明确)
double num3 = 1.23e5; // 科学计数法:1.23×10⁵ = 123000.0
float num1 = 3.14f; // 必须加后缀f/F
float num2 = 2.71828F; // 大小写均可
float num3 = 1.23e-2f; // 科学计数法:1.23×10⁻² = 0.0123
注意⚠️:
1.double在任何系统下都占8个字节
2. 浮点数与整数在内存中的存储方式不同,不能单纯使用2ⁿ的形式来计算
3. double的包装类型为Double(Double为引用数据类型)
4. double类型的内存布局遵守 IEEE 754标准和C语言一样,尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值
5. float则是占4个字节
6. float同样遵守IEEE 754标准。由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑double,不太推荐使用float
7. float的包装类型为Float(Float为引用数据类型)
// 初始化一个英文字符
char letter = 'A';
System.out.println("letter的值:" + letter);
// 初始化一个中文字符
char chineseChar = '中';
System.out.println("chineseChar的值:" + chineseChar);
// 初始化一个特殊字符
char specialChar = '$';
System.out.println("specialChar的值:" + specialChar);
注意⚠️:
1.Java中使用单引号➕单个字母的形式表示字符字面值
2.计算机中的字符本质上是一个整数,在C语言中通过ASCII进行转码解码,在Java中则是通过Unicode进行转码和解码
3.char的包装类型为Character(Character为引用数据类型)
// 声明并初始化一个布尔型变量,值为true
boolean flag1 = true;
System.out.println("flag1的值:" + flag1);
// 声明并初始化一个布尔型变量,值为false
boolean flag2 = false;
System.out.println("flag2的值:" + flag2);
注意⚠️:
1.布尔类型的变量只有两种取值,true表示真,false表示假
2.Java的布尔类型不能与整形(int)相互转化,不存在1表示true,0表示false这样的用法
3.在java虚拟机的规范中,并没有明确表示布尔类型占多少个字节,也没有专门用来处理布尔类型的字节码指令,但是在Oracle公司的虚拟机实现中,布尔类型占1个字节
4.boolean的包装类为Boolean(Boolean为引用数据类型)
Java作为一个强类型编程语言,不同类型的变量通过转换的时候,需要通过严格的校验。当参与运算的变量,类型不一致的时候,就需要进行类型转换。在Java中,类型的转换主要分为两类:自动类型转换和强制类型转换
// byte类型自动转换为int类型
byte byteNum = 10;
int intNum = byteNum;
System.out.println("byte转换为int后的值:" + intNum);
// short类型自动转换为long类型
short shortNum = 20;
long longNum = shortNum;
System.out.println("short转换为long后的值:" + longNum);
// char类型自动转换为float类型
char charValue = 'A';
float floatValue = charValue;
System.out.println("char转换为float后的值:" + floatValue);
概念:
当把一个取值范围小的数据类型赋值给取值范围大的数据类型时,Java 会自动进行类型转换,这种转换是安全的,不会丢失数据。
适用情况:
从低精度类型向高精度类型转换,如byte -> short -> int -> long -> float -> double。
char类型可以自动转换为int、long、float、double。
// int类型强制转换为byte类型
int num1 = 130;
byte byteResult = (byte)num1;
System.out.println("int强制转换为byte后的值:" + byteResult);
// 这里130超出了byte的取值范围 -128 ~ 127,会发生数据溢出
// double类型强制转换为int类型
double doubleNum = 3.14;
int intResult = (int)doubleNum;
System.out.println("double强制转换为int后的值:" + intResult);
// 小数部分会被直接舍去,结果为3
// 将字符串转换为数字类型时,也可能需要强制类型转换(结合对应的转换方法)
String str = "123";
int parsedInt = Integer.parseInt(str);
// 如果需要转换为byte类型,再进行强制类型转换
byte byteFromStr = (byte)parsedInt;
System.out.println("从字符串转换并强制转换为byte后的值:" + byteFromStr);
概念:
把一个取值范围大的数据类型赋值给取值范围小的数据类型,或者在不满足自动类型转换规则的情况下进行类型转换时,需要使用强制类型转换。强制类型转换可能会导致数据丢失或精度降低。
语法:(目标数据类型) 要转换的值
注意⚠️:
1将一个字面值常量进行赋值的时候,java会自动针对数值范围进行检查
2.强制类型转换不一定会成功,不相干的类型不能互相转换
不同类型的变量转化的时候,会由数据类型小的被提升到数据类型大的
1.int与long之间
// int 类型变量
int numInt = 10;
// long 类型变量
long numLong = 20L;
// 类型提升:int(小类型)自动提升为 long(大类型),运算结果是 long 类型
long result = numInt + numLong;
// 输出结果:30,类型是 long
System.out.println("结果:" + result);
2.byte与byte之间
byte a = 10; // byte类型,范围-128~127
byte b = 20; // byte类型
// 错误:编译不通过
// byte result = a + b; // 报错:不兼容的类型,需要byte,但得到int
// 正确:必须使用int类型接收结果,或强制类型转换
int result = a + b; // 结果为int类型
byte castResult = (byte) (a + b); // 强制转换回byte
System.out.println("int结果: " + result); // 输出30
System.out.println("byte结果: " + castResult); // 输出30(未溢出时正确)
3.int与String之间
int num = 123;
String str = "" + num; // "123"
int num = 123;
String str = String.valueOf(num); // "123"
String str = "456";
int num = Integer.parseInt(str); // 456
String str = "456";
int num = Integer.valueOf(str); // 456(自动拆箱为int)
总结:
1.不同数据类型混合计算,范围小的会提升成范围大的
2.对于小于四个字节的类型(short,byte等),会优先提升成四个字节的int进行运算