1.3 java学习课前问题解决
java学习课前问题解决
1. 使用Java能编写哪些类型的程序?试举至少两个例子
Java是一门具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点的编程语言。
它的用途广泛且与我们日常生活息息相关,常见场景如下:
- Android移动应用:Android平台早期官方首选开发语言为Java(目前Kotlin(科特林,现代多平台应用的静态编程语言)为首选,但Java仍有大量存量项目)。而我们日常使用的手机端的微信、支付宝、抖音等APP,其早期版本或核心模块多基于Java开发。
- 桌面应用程序:通过Java Swing、JavaFX等图形用户界面(GUI)库,可开发跨平台的桌面软件。例如Eclipse、IntelliJ IDEA等Java开发工具,以及部分企业级数据可视化工具(如报表生成软件)。
- 嵌入式系统:作为Java ME(微型版)可用于开发嵌入式设备程序,如智能卡(校园卡、银行卡)的芯片逻辑、智能家居设备(智能门锁、环境检测器)的控制程序等不胜枚举。
2. 如何理解Java“一次编译、处处运行”?需安装什么才能运行编译后的程序?
(1)解读“一次编译、处处运行”
Java的跨平台特性核心依赖“源代码→字节码→JVM执行”的流程,具体逻辑如下:
- 编译阶段:Java源代码(
.java文件)通过编译器(javac)编译为字节码文件(.class文件)。
字节码是一种与操作系统、硬件无关的中间格式,不直接对应特定平台的机器码。
- 运行阶段:字节码文件不直接由操作系统执行,而是由Java虚拟机(JVM) 解释或编译执行。JVM是“平台适配层”——针对Windows、Linux等不同操作系统,有对应的JVM实现(如Windows版JVM、Linux版JVM),但所有JVM都能识别同一份字节码。
- 跨平台本质:只要目标操作系统安装了适配的JVM,同一份字节码文件无需修改即可运行,实现“一次编译,多平台通用”。
(2)需要安装的组件
要运行编译后的Java程序(字节码文件),需在目标操作系统上安装Java运行时环境(JRE):
- JRE包含两部分核心内容:① Java虚拟机(JVM):负责执行字节码;② 核心类库(如
java.lang、java.util):代码必须添加,提供Java程序运行所需的基础API(如字符串处理、集合操作)。
补充:若需开发Java程序(而非仅运行),需安装Java开发工具包(JDK) ——JDK包含JRE,同时额外提供编译器(javac)、调试工具(jdb)、文档生成工具(javadoc)等开发组件。
3. C语言与Java的HelloWorld代码对比
如以下图表所示:
| 对比维度 | C语言版本 | Java语言版本 |
|---|---|---|
| 代码示例 | 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!"); } } |
| 编程范式 | 面向过程(函数式):以“函数”为核心组织代码,关注“步骤”而非“对象” | 纯面向对象:所有代码必须封装在“类”中,以“对象”为核心,关注“数据与行为的封装” |
| 程序入口 | 独立的main函数(无类包裹),格式为int main() |
main方法必须包含在类中,格式为public static void main(String[] args)(静态、无返回值) |
| 编译与运行逻辑 | 编译器(如gcc)将源代码直接编译为平台相关的可执行文件(如Windows的.exe),由操作系统直接执行 |
编译器(javac)将源代码编译为字节码文件(.class),由JVM解释/编译执行,与平台无关 |
| 内存管理 | 手动管理:需通过malloc申请内存、free释放内存,易出现内存泄漏、野指针问题 |
自动管理:由JVM的垃圾回收器(GC)自动识别并释放无用内存,无需手动操作 |
| 核心差异总结 | 面向过程、平台相关、手动内存管理 | 纯面向对象、跨平台、自动内存管理 |
4. 如何比较两个字符串内容是否相同?能否直接用==?
(1)正确比较方法:使用String类的equals()方法
String是引用数据类型,其内容比较需通过equals()方法(该方法重写了Object类的equals(),专门用于比较字符串内容),示例如下:
String s2 = new String("hello");
// 正确:比较s1和s2的内容是否相同
if (s1.equals(s2)) {
System.out.println("内容相同"); // 执行结果:内容相同
}
(2)不能直接用==的原因
==的作用取决于变量类型,对字符串(引用类型)和基本类型的行为完全不同:
- 基本数据类型(如int、char):
==比较的是“变量存储的实际值”。例如int a=5; int b=5;,a==b结果为true,因为两者值相同。 - 引用数据类型(如String、自定义类):
==比较的是“变量存储的内存地址”(即变量是否指向同一个对象),而非对象的内容。
以上面的s1和s2为例:s1 = "hello":字符串常量“hello”存储在字符串常量池中,s1指向常量池中的该对象。s2 = new String("hello"):通过new关键字在堆内存中新建一个String对象,s2指向堆中的该对象。
因此s1 == s2结果为false(地址不同),但equals()比较内容时结果为true。
下图中结合课件剖析


5. 分析代码意图、运行结果及获取trim()方法说明的方式
代码片段
String x = null;
int length = x.length();
System.out.println("x.length = " + length);
(1)代码本意
试图获取字符串变量x的长度,并将长度值打印输出。
(2)代码做了什么?
声明了字符串类型变量x,可存储字符串类型的引用
x现在未引用任何对象,即没有指向任何对象
(3)能否运行成功?为什么?
不能运行成功,会抛出NullPointerException(空指针异常)。
原因:x被赋值为null,表示x不指向任何String对象(无实际内存地址)。而length()是String对象的成员方法,必须通过“有效对象”调用——对null引用调用方法时,JVM无法找到对应的对象,会直接抛出空指针异常,导致程序崩溃。
(4)如何获取String的trim()方法说明?
trim()方法的作用是“去除字符串两端的空白字符(空格、制表符、换行符等)”,获取其详细说明的方式如下:
-
官方文档(最权威):访问Oracle官方Java文档(如Java 8 String文档),搜索
String类后找到trim()方法,可查看参数、返回值、功能描述及异常说明。 - IDE工具提示:在IntelliJ IDEA、Eclipse等开发工具中,将鼠标悬停在代码中的
trim()方法上,会自动显示方法的简要文档(包括功能、参数、返回值)。 - 本地文档生成:若已安装JDK,可通过
javadoc工具生成本地String类文档。例如在命令行执行javadoc -d doc java.lang.String,会在doc目录下生成HTML格式的文档,打开后可查看trim()方法详情。
6. 分析代码使用的技术
代码片段
Integer x = Integer.valueOf("10"); // x是Integer对象
Integer y = x + 1; // Integer对象 + int基本类型
int z = x + y; // Integer对象 + Integer对象
核心技术:Java的自动装箱(Autoboxing) 与自动拆箱(Unboxing)
这是Java 5引入的语法糖,用于简化“基本类型”与“对应包装类”之间的转换,无需手动调用
valueOf()(装箱)或intValue()(拆箱)等方法。
(1)各步骤技术分析
-
Integer x = Integer.valueOf("10"):显式装箱
通过Integer.valueOf()方法将字符串“10”转换为Integer对象(装箱操作),x是Integer类型的引用。 -
Integer y = x + 1:自动拆箱 → 加法运算 → 自动装箱- 第一步(自动拆箱):
x是Integer对象,与int类型的1运算时,JVM自动将x拆箱为int基本类型(相当于执行x.intValue(),结果为10)。 - 第二步(加法运算):拆箱后的
int值(10)与1执行加法,结果为int类型的11。 - 第三步(自动装箱):将加法结果(11)自动装箱为
Integer对象(相当于执行Integer.valueOf(11)),赋值给y。
- 第一步(自动拆箱):
-
int z = x + y:自动拆箱 → 加法运算- 第一步(自动拆箱):
x和y均为Integer对象,运算时JVM自动将两者拆箱为int基本类型(分别为10和11)。 - 第二步(加法运算):拆箱后的两个
int值执行加法,结果为int类型的21,直接赋值给int类型的z(无需装箱)。
- 第一步(自动拆箱):
(2)技术总结
代码通过自动拆箱将Integer对象转换为int基本类型以支持加法运算,通过自动装箱将int结果转换为Integer对象以适配变量类型。该特性简化了代码编写,避免了手动转换的繁琐操作。

浙公网安备 33010602011771号