Java 使用说明与示例
编写完整的 Java 程序,逐步观察变量、对象引用和方法调用。在可视化工作台选择 Java,粘贴下方任一完整示例后运行,也可以直接在本页查看执行过程。
程序结构
- 每次提交一个源文件,其中必须且只能有一个
public static void main(String[] args) 入口。示例使用 Main,入口类也可以使用其他名称。
- 直接在程序中准备输入数据,并从
main 调用算法;不支持交互式输入。
- 辅助类和接口须与
Main 并列定义在顶层。不支持嵌套类,包括 static class ListNode 这类写法。
- 使用标准库时需要显式编写
import,不要添加 package 声明。不提供 Maven、Gradle 或外部依赖。
- Java 不预置
ListNode、TreeNode、buildLinkedList 或 buildTree 等辅助类型或函数。请像下方示例一样,在同一个源文件中定义节点类型并连接对象。
可运行示例
选择标签切换完整程序,使用播放控件逐步查看执行过程。
| 示例 | 观察重点 |
|---|
| 基础变量 | main 中的 result 变为 3。 |
| 数组 | total 变为 12,matrix[0][1] 更新为 12。 |
| 递归 | 逐层调用 factorial,最终返回 120。 |
| 链表 | 三个自定义节点通过引用连接,遍历后 total = 60。 |
| 二叉树 | 递归沿左右子节点访问,得到 result = 12。 |
| 集合 | 观察列表修改、映射条目和集合去重,最终 count = 6。 |
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
int result = a + b;
}
}
public class Main {
public static void main(String[] args) {
int[] values = {2, 4, 6};
int total = 0;
for (int value : values) {
total += value;
}
int[][] matrix = {{1, 2}, {3, 4}};
matrix[0][1] = total;
}
}
public class Main {
static int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
public static void main(String[] args) {
int result = factorial(5);
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class Main {
public static void main(String[] args) {
ListNode head = new ListNode(10);
head.next = new ListNode(20);
head.next.next = new ListNode(30);
ListNode current = head;
int total = 0;
while (current != null) {
total += current.val;
current = current.next;
}
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class Main {
static int sum(TreeNode node) {
if (node == null) {
return 0;
}
return node.val + sum(node.left) + sum(node.right);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(4);
root.left = new TreeNode(2);
root.right = new TreeNode(6);
int result = sum(root);
}
}
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(5);
numbers.set(0, 7);
LinkedHashMap<String, Integer> scores = new LinkedHashMap<>();
scores.put("Ada", 8);
scores.put("Lin", 10);
LinkedHashSet<Integer> unique = new LinkedHashSet<>();
unique.add(3);
unique.add(3);
unique.add(5);
int count = numbers.size() + scores.size() + unique.size();
}
}
正在生成交互式预览...
支持的数据与执行行为
- 基本类型、装箱类型、字符串、
BigInteger、null、一维和多维数组。
- 源码中定义的对象及其字段,包括继承字段、别名、共享引用和循环引用。
- 分支、循环、方法调用、重载、递归、继承、动态方法调用、构造函数、初始化、异常、
finally 和资源自动关闭。
- 可展开展示的集合包括
ArrayList、LinkedList、Arrays.asList、List.of、HashMap、LinkedHashMap、HashSet 和 LinkedHashSet。其他标准库对象可能可见,但无法展开内部内容。
LinkedHashMap 和 LinkedHashSet 保持插入顺序,不要依赖 HashMap 或 HashSet 的遍历顺序。源码中自定义的集合子类展示其源码字段,不会同时合并展示标准库私有的集合存储。
当前限制
Java 支持面向单线程算法可视化,并不覆盖所有 Java 特性或标准库类型。暂不支持包声明、嵌套类、局部类、匿名类、record、lambda、方法引用、模式绑定、自定义 native 方法、反射、动态加载和启动其他进程。在其他线程执行源码方法会终止本次运行并给出诊断。
请使用便于逐步观察的小规模输入。运行和可视化仍受资源限制;遇到限制时请缩小输入规模。编译错误或运行错误可根据提示的源码位置修正。观察变量和返回值不需要添加打印语句。
其他排查方法请参阅通用使用指南。