Java 学习笔记:变量、字面值与类型转换
这是一篇 Java 入门笔记,主要整理变量相关的基础知识:基本数据类型、字面值、类型转换、变量命名规则以及作用域。
Java 的类型系统比较严格。理解这些基础规则之后,再看方法、类、对象和集合时会轻松很多。
1. Java 的 8 种基本数据类型
Java 中有 8 种基本数据类型,可以分成 4 类:
1. 整型: byte、short、int、long
2. 字符型: char
3. 浮点型: float、double
4. 布尔型: boolean
变量的类型决定了它能保存什么样的数据,也决定了它的取值范围。
2. 整型
整型变量用于保存整数。byte、short、int、long 的区别主要在于占用空间和取值范围不同。
byte : 8 位, 1 字节,范围 -128 ~ 127
short : 16 位, 2 字节,范围 -32768 ~ 32767
int : 32 位, 4 字节,范围 -2147483648 ~ 2147483647
long : 64 位, 8 字节,范围 -9223372036854775808 ~ 9223372036854775807
示例:
public class HelloWorld {
public static void main(String[] args) {
byte b = 1;
short s = 200;
int i = 300;
long l = 400L;
// byte 的最大值是 127,下面这一行会编译报错
// byte b2 = 128;
}
}
如果给变量赋的值超出了类型范围,编译器会直接报错。必要时可以做类型转换,但需要注意溢出风险。
3. 字符型 char
char 用来保存一个字符,值需要放在单引号里。
public class HelloWorld {
public static void main(String[] args) {
char c = '中';
// char 只能保存一个字符,下面两行都会编译报错
// char c2 = '中国';
// char c3 = 'ab';
}
}
注意:单引号表示字符,双引号表示字符串。
char c = 'A'; // 字符
String s = "ABC"; // 字符串
4. 浮点型
浮点数用于保存小数,Java 中有两种浮点类型:
float : 32 位,赋值时通常需要在数字后加 f 或 F
double : 64 位,小数字面值默认就是 double
示例:
public class HelloWorld {
public static void main(String[] args) {
double d = 123.45;
// 54.321 默认是 double,不能直接赋给 float
// float f = 54.321;
float f2 = 54.321F;
}
}
如果一个小数没有额外标记,Java 默认把它当成 double。要声明 float,需要在数字后加 f 或 F。
5. 布尔型 boolean
boolean 用来表示真假,只有两个值:
true
false
示例:
public class HelloWorld {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
// Java 不能直接用 0 或 1 给 boolean 赋值
// boolean b3 = 1;
}
}
虽然在很多语言或底层实现里真假可以和 0、1 联系起来,但 Java 语法层面不允许这样赋值。
6. String 不是基本类型
String 使用非常频繁,所以容易被误以为是基本类型。实际上它是一个类,不属于 8 种基本数据类型。
public class HelloWorld {
public static void main(String[] args) {
String str = "Hello Java";
}
}
另外,String 是不可变对象。字符串一旦创建,其内容本身不会被修改;看似修改字符串,通常是创建了新的字符串对象。
7. 整数字面值
整数字面值默认是 int 类型。如果以 L 或 l 结尾,则表示 long 类型。实际写代码时建议用大写 L,因为小写 l 容易和数字 1 混淆。
Java 支持多种进制写法:
十进制: 26
十六进制: 0x1a
八进制: 032
二进制: 0b11010
示例:
public class HelloWorld {
public static void main(String[] args) {
long val = 26L; // long 类型
int decVal = 26; // 十进制
int hexVal = 0x1a; // 十六进制
int octVal = 032; // 八进制
int binVal = 0b11010; // 二进制,Java 7 开始支持
System.out.println(decVal);
System.out.println(hexVal);
System.out.println(octVal);
System.out.println(binVal);
}
}
8. 浮点数字面值
浮点数字面值默认是 double。如果以 F 或 f 结尾,就表示 float。
浮点数也可以使用科学计数法:
1.234e2 = 1.234 x 10^2 = 123.4
示例:
public class HelloWorld {
public static void main(String[] args) {
float f1 = 123.4F;
double d1 = 123.4;
double d2 = 1.234e2;
System.out.println(f1);
System.out.println(d1);
System.out.println(d2);
}
}
9. 字符与字符串字面值
字符使用单引号,字符串使用双引号。
如果需要表示制表符、换行、引号、反斜杠等特殊字符,需要用转义符 \。
public class HelloWorld {
public static void main(String[] args) {
String name = "SF";
char a = 'c';
char tab = '\t'; // 制表符
char carriageReturn = '\r'; // 回车
char newLine = '\n'; // 换行
char doubleQuote = '\"'; // 双引号
char singleQuote = '\''; // 单引号
char backslash = '\\'; // 反斜杠
}
}
10. 类型转换
Java 的类型转换可以简单记成一句话:
从小到大,自动转换;从大到小,强制转换。
可以把低精度类型理解成小杯子,高精度类型理解成大杯子。小杯子里的水倒进大杯子,通常没问题;大杯子倒进小杯子,就可能装不下。
常见转换方向:
byte -> short -> int -> long -> float -> double
char -> int -> long -> float -> double
需要注意:char 和 short 虽然都是 16 位,但它们之间不能直接互相赋值,仍然需要强制转换。
10.1 char 和 short 的转换
public class HelloWorld {
public static void main(String[] args) {
char c = 'A';
short s = 80;
c = (char) s;
// short 和 char 不能直接互相赋值
// s = c;
s = (short) c;
}
}
10.2 低精度向高精度转换
低精度类型赋值给高精度类型时,通常可以自动转换。
public class HelloWorld {
public static void main(String[] args) {
int i = 50;
long l = i;
System.out.println(l);
}
}
这里 int 是 32 位,long 是 64 位,int 放进 long 没有问题。
10.3 高精度向低精度转换
高精度类型赋值给低精度类型时,需要强制转换。
public class HelloWorld {
public static void main(String[] args) {
byte b;
int i1 = 10;
int i2 = 300;
b = (byte) i1;
System.out.println(b); // 10
b = (byte) i2;
System.out.println(b); // 44
System.out.println(Integer.toBinaryString(i2));
}
}
i2 的值是 300,已经超过了 byte 的范围。强制转换后会发生截断,结果不再是原来的 300,所以强制转换要谨慎使用。
11. 变量命名规则
Java 变量命名需要遵守这些规则:
1. 只能使用字母、数字、$、_
2. 第一个字符不能是数字
3. 不能直接使用 Java 关键字
4. 可以包含关键字,例如 className 可以,但 class 不可以
5. 中文也可以作为变量名,但实际项目中不建议这样写
示例:
int age = 18;
int userAge = 20;
int _count = 1;
int $value = 2;
// int 1name = 1; // 错误:不能以数字开头
// int class = 5; // 错误:class 是关键字
int class5 = 5; // 可以,但不推荐这样命名
实际写代码时,建议使用有意义的英文单词,并遵循驼峰命名法:
int userAge = 18;
String userName = "Tom";
12. 变量作用域
变量能在哪些地方被访问,取决于它声明的位置。
12.1 成员变量
声明在类中、方法外的变量,叫成员变量,也可以叫字段、属性或 Field。
public class HelloWorld {
int i = 1;
int j = i;
public void method1() {
System.out.println(i);
}
public void method2() {
System.out.println(i);
}
}
成员变量从声明位置开始,在当前对象的各个方法中都可以访问。
12.2 参数
声明在方法括号里的变量叫参数。参数只能在当前方法内部使用。
public class HelloWorld {
public void method1(int i) {
System.out.println(i);
}
public void method2() {
// method2 不能访问 method1 的参数 i
// System.out.println(i);
}
}
12.3 局部变量
声明在方法内部的变量叫局部变量。它的作用域从声明位置开始,到所在代码块结束。
public class HelloWorld {
public void method() {
int i = 5;
System.out.println(i);
{
System.out.println(i);
int j = 6;
System.out.println(j);
}
// j 的作用域只在上面的子代码块内
// System.out.println(j);
}
}
小结
这篇笔记主要记录了 Java 变量相关的基础知识:
基本数据类型 -> 字面值 -> 类型转换 -> 命名规则 -> 作用域
这些规则看起来细碎,但都是后续学习 Java 语法、面向对象和集合框架的基础。入门阶段不需要死记所有取值范围,先理解“类型限制”和“转换风险”会更重要。