变量定义
变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。
语法
数据类型 变量名 [= 初始值];
示例:声明与初始化
public class VariableDemo {
public static void main(String[] args) {
int age; // 声明变量
age = 25; // 赋值
System.out.println("Age: " + age); // 输出:Age: 25
}
}
运行结果
Age: 25
代码解析
- Java源文件保存为“VariableDemo.java”。
- int age声明了一个整型变量age。
- age = 25将值25赋给age变量。
示例:未初始化错误
public class UninitializedError {
public static void main(String[] args) {
int number;
System.out.println(number); // 编译错误:未初始化
}
}
错误原因:局部变量必须初始化后才能使用。
变量的数据类型
Java是强类型语言,变量声明时必须明确变量的数据类型。常见数据类型分为两类:
1.基本数据类型
整数:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
浮点数:float(4字节)、double(8字节)
字符:char(2字节,Unicode)
布尔:boolean(1位,true/false)
2.引用数据类型
类(如String)、接口、数组等。
示例:基本类型使用
public class PrimitiveTypes {
public static void main(String[] args) {
byte b = 127; // -128~127
short s = 32767; // -32768~32767
int i = 2147483647; // -2^31~2^31-1
long l = 9223372036854775807L; // 添加L后缀
float f = 3.14f; // 添加f后缀
double d = 3.1415926535;
char c = 'A'; // Unicode字符
boolean bool = true;
System.out.println("byte: " + b);
System.out.println("short: " + s);
System.out.println("int: " + i);
System.out.println("long: " + l);
System.out.println("float: " + f);
System.out.println("double: " + d);
System.out.println("char: " + c);
System.out.println("boolean: " + bool);
}
}
运行结果
byte: 127
short: 32767
int: 2147483647
long: 9223372036854775807
float: 3.14
double: 3.1415926535
char: A
boolean: true
说明:Java源文件保存为“PrimitiveTypes.java”。
示例:引用类型(String)
public class StringDemo {
public static void main(String[] args) {
String greeting = "Hello, Java!";
System.out.println(greeting); // 输出:Hello, Java!
}
}
运行结果
Hello, Java!
说明:Java源文件保存为“StringDemo.java”。
变量的类型转换
类型转换分为自动类型转换和强制类型转换。
1.自动类型转换(隐式)
小范围类型 → 大范围类型。
int → long → float → double
char → int
2.强制类型转换(显式)
大范围类型 → 小范围类型(如 double → int),可能丢失精度。
示例:自动转换
public class AutoConversion {
public static void main(String[] args) {
int numInt = 100;
double numDouble = numInt; // int → double
System.out.println("numDouble: " + numDouble); // 输出:100.0
}
}
运行结果
numDouble: 100.0
说明:Java源文件保存为“AutoConversion.java”。
示例:强制转换
public class ForceConversion {
public static void main(String[] args) {
double pi = 3.14159;
int piInt = (int) pi; // double → int
System.out.println("piInt: " + piInt); // 输出:3
long bigNum = 123456789L;
int smallNum = (int) bigNum; // 可能溢出
System.out.println("smallNum: " + smallNum); // 输出:123456789(若未溢出)
}
}
运行结果
piInt: 3
smallNum: 123456789
说明:Java源文件保存为“ForceConversion.java”。
示例:字符串转换
public class StringConversion {
public static void main(String[] args) {
String numStr = "123";
int numInt = Integer.parseInt(numStr); // 字符串 → int
System.out.println("numInt: " + numInt); // 输出:123
String piStr = "3.14";
double piDouble = Double.parseDouble(piStr); // 字符串 → double
System.out.println("piDouble: " + piDouble); // 输出:3.14
}
}
运行结果
numInt: 123
piDouble: 3.14
说明:Java源文件保存为“StringConversion.java”。
3.常见错误与解决方法
- 类型不匹配:int x = "123";(编译错误)。→使用Integer.parseInt()或Double.parseDouble()转换字符串。
- 强制转换溢出:int y = (int) 1e20;(结果不可预测)。→检查数值范围避免溢出。
变量的作用域
变量的作用域决定了其可访问的范围。Java中常见作用域包括:
- 类变量(静态变量):用static修饰,类加载时初始化。
- 实例变量:属于对象,无static修饰。
- 局部变量:在方法或代码块中声明,仅在该范围内有效。
示例
public class ScopeDemo {
static String classVar = "Class Variable"; // 类变量
String instanceVar = "Instance Variable"; // 实例变量
public void printVariables() {
String localVar = "Local Variable"; // 局部变量
System.out.println(classVar);
System.out.println(instanceVar);
System.out.println(localVar);
}
public static void main(String[] args) {
ScopeDemo demo = new ScopeDemo();
demo.printVariables();
// System.out.println(localVar); // 错误:局部变量不可访问
}
}
运行结果
Class Variable
Instance Variable
Local Variable
代码解析
- Java源文件保存为“ScopeDemo.java”。
- classVar和instanceVar可在整个类中访问。
- localVar仅在printVariables方法内有效。
示例:代码块作用域
public class BlockScope {
public static void main(String[] args) {
int x = 10;
{
int y = 20; // y仅在此代码块内有效
System.out.println("x + y: " + (x + y)); // 输出:30
}
// System.out.println(y); // 错误:y不可访问
}
}
运行结果
x + y: 30
说明:Java源文件保存为“BlockScope.java”。
常见错误及解决方法
1.未初始化变量
错误:int x; System.out.println(x);(编译错误)。
解决方案:声明时初始化或赋值后使用。
2.作用域错误
错误:在方法外访问局部变量。
解决方案:确保变量在正确的作用域内访问。
3.类型不匹配
错误:String s = 123;(编译错误)。
解决方案:使用String.valueOf(123)或"" + 123。
知识总结
- 变量要先声明后使用,并且要指定数据类型和名称。
- 基本数据类型包括int、double、char等,引用类型如String。
- 类型转换分自动类型转换和强制类型转换,强制转换可能丢失精度。
- 变量作用域决定其可访问范围,包括类变量、实例变量和局部变量。
理论练习
选择题:以下哪项是合法的变量名?
A.123name B._age C.class D.int
答案:B
解析:变量名不能以数字开头,且不能是关键字。
填空题:String 类型属于____类型。
答案:引用
填空题:int 类型占____字节。
答案:4
代码分析:以下代码的输出是什么?
double d = 10.5;
int i = (int) d;
System.out.println(i);
答案:10
解析:强制转换会丢弃小数部分。
实操练习
练习:编写程序,声明并初始化一个String类型变量、一个int类型变量、一个double类型变量和一个 boolean 类型变量,输出它们的值。
答案:
public class Practice {
public static void main(String[] args) {
String name = "Bob";
int age = 30;
double price = 9.99;
boolean isAvailable = true;
System.out.println("Name: " + name + ", Age: " + age
+ "Price: " + price + ", Available: " + isAvailable);
}
}
运行结果
Name: Bob, Age: 30Price: 9.99, Available: true
说明:Java源文件保存为“Practice.java”。
练习:编写程序,将double类型变量3.14强制转换为int,并输出结果。
答案:
public class Practice {
public static void main(String[] args) {
double pi = 3.14;
int piInt = (int) pi;
System.out.println("piInt: " + piInt); // 输出:3
}
}
运行结果
piInt: 3
说明:Java源文件保存为“Practice.java”。
练习:编写程序,将String类型"123.45"转换为double类型,并输出结果。
答案:
public class Practice {
public static void main(String[] args) {
String numStr = "123.45";
double numDouble = Double.parseDouble(numStr);
System.out.println("numDouble: " + numDouble); // 输出:123.45
}
}
运行结果
numDouble: 123.45
说明:Java源文件保存为“Practice.java”。
练习:编写程序,演示局部变量和实例变量的作用域差异。
答案:
public class Practice {
String instanceVar = "Instance"; // 实例变量
public void printVars() {
String localVar = "Local"; // 局部变量
System.out.println(instanceVar);
System.out.println(localVar);
}
public static void main(String[] args) {
Practice p = new Practice();
p.printVars();
// System.out.println(localVar); // 错误:局部变量不可访问
}
}
运行结果
Instance
Local
说明:Java源文件保存为“Practice.java”。