第01周 预习、实验与作业:绪论与Java基本语法
第01周 预习、实验与作业:绪论与Java基本语法
1. Java能编写哪些类型的程序?
- 桌面应用程序 - 使用JavaFX或Swing库开发跨平台的图形界面软件
- Web应用程序 - 基于Java EE(Jakarta EE)技术开发服务器端Web应用
- 移动应用程序 - Android应用开发的主要语言
- 大数据技术 - Hadoop、Spark等大数据框架使用Java开发
2. 理解"一次编译、处处运行"
Java号称“一次编译、处处运行”(Write Once, Run Anywhere!),怎么理解这句话?
- Java源代码只需编译一次,生成字节码(.class文件)
- 这些字节码可以在任何安装了Java虚拟机(JVM)的平台上运行
- 不需要针对不同操作系统重新编译源代码
为使编译好的程序能运行,需先在操作系统安装什么?
- Java虚拟机(JVM) - 负责执行字节码
- Java类库 - 提供标准API和支持功能
对于开发环境,需要安装Java开发工具包(JDK),它除了包含JRE外,还提供了编译器(javac)和其他开发工具。
3. 对比c版本的与Java版本HelloWorld代码
C语言:
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
有何不同?
- 结构差异:Java必须包含在类中(面向对象),C是过程式语言
- 编译方式:C编译为机器码,Java编译为字节码由JVM执行
- 内存管理:C手动管理,Java自动垃圾回收
- 平台依赖:C代码平台相关,Java字节码平台无关
- 输出语句:C用
printf()
,Java用System.out.println()
- 头文件:C需要
#include
,Java用import
4. 怎么比较两个字符串内容是否相同?
怎么比较两个字符串内容是否相同?可以直接用==吗?
不可以,应该使用equals()
方法而不是==
操作符:
为什么对基本数据类型可以直接使用?对引用数据类型不行?
- 对于基本数据类型(int, char, boolean等),
==
比较的是存储在变量中的实际值 - 对于引用数据类型(String, 数组, 对象等),
==
比较的是对象引用(内存地址),而不是对象内容
5. 代码分析
String x = null;
int length = x.length();
System.out.println("x.length = "+length +", content = "+x.trim());
下面这段代码,本意是要达到什么效果?
获取字符串x的长度和字符串x去除首尾空格后的内容并打印。
能运行成功吗?
不能运行成功,会抛出NullPointerException
异常。
为什么?
- 变量
x
被赋值为null
,表示它不引用任何对象 - 调用
x.length()
和x.trim()
试图在null引用上调用方法,导致空指针异常
怎么获得String的trim()
String x = " Hello World "; // 赋予实际值
if (x != null) { // 添加null检查
int length = x.length();
String trimmed = x.trim();
System.out.println("x.length = " + length + ", content = " + trimmed);
}
6. 代码分析
Integer x = Integer.valueOf("10"); // 装箱:将String转换为Integer对象
Integer y = x + 1; // 拆箱→计算→装箱
int z = x + y; // 拆箱→计算→赋值
x是Integer类型,1是int类型,为什么他们可以相加,使用了什么技术?
这里使用了Java的自动拆箱(Unboxing)机制。当Integer对象与基本类型int进行运算时,Java会自动将Integer对象转换为基本int值(相当于调用x.intValue()
),然后进行数学运算。
z是int,x与y是Integer类型,却可以直接将x + y 赋给z,使用了什么技术?
- 自动拆箱:x和y都被自动转换为int基本类型
- 加法运算:在两个int值上进行数学加法
- 结果赋值:将int结果直接赋给int变量z
自动装箱(Autoboxing):将基本类型自动转换为对应的包装类对象
int a = 5;
Integer b = a; // 自动装箱,相当于 Integer.valueOf(a)
自动拆箱(Unboxing):将包装类对象自动转换为对应的基本类型
Integer c = Integer.valueOf(10);
int d = c; // 自动拆箱,相当于 c.intValue()