Java环境配置与基础题解分析
前言
开发环境
对应教材第一章内容,部分定义已在教材中详细说明,不做详细解释说明。
JDK 与 JRE
对应教材 P30 习题 3✨
- JRE 是 Java 的运行环境。面向 Java 程序的使用者,而不是开发者。JRE 是运行 Java 程序所必须环境的集合,包含 JVM 标准实现及 Java 核心类库。它包括 Java 虚拟机、Java 平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
- JDK 是 Java 开发工具包,它提供了 Java 的开发环境(提供了编译器 等工具,用于将 java 文件编译为 class 文件)和运行环境(提 供了 JVM 和 Runtime 辅助包,用于解析 class 文件使其得到运行)。JDK 是整个 Java 的核心,包括了 Java 运行环境(JRE),一堆 Java 工具 和 Java 标准类库。
官网下载安装 JDK
甲骨文 Oracle 官网
首先我们需要下载 java 开发工具包 JDK,在下载页面中根据自己的系统选择对应的版本,本文以 Windows 11 64位系统 JDK版本8为例,其他版本如 JDK 21/17/11/8 的长期支持版本均可。

选择 JDK 版本并进行如下操作下载
选择 windows 系统 ➡️ 从上到下依次是压缩包、.exe、.msi格式的安装包 ➡️ 推荐后两者
.msi 和.exe 安装包区别
- .msi 文件 适用于需要可靠的安装、维护和卸载功能的企业级应用,特别是在需要大规模部署的场景中。它提供了丰富的安装选项和维护功能,使得软件管理更加高效和可靠。
- .exe 文件 则适用于自定义需求较多的安装过程,或者当需要捆绑多个安装程序时。它的灵活性和自定义能力使得它在某些特定场景下非常有用。

正式安装 JDK
- 安装 JDK 过程中无特殊要求,点击下一步即可,可以自定义安装目录等信息,例如我们选择安装目录为 C:\Program Files (x86)\Java\jdk1.8.0_91 该路径需要保存以便后续写入环境变量
变量配置
打开变量管理界面
右键此电脑➡️属性➡️高级系统设置➡️环境变量

新建系统变量
1.新建➡️ 2.变量名➡️3.变量值➡️4.确定
变量名 JAVA_HOME
// 变量名需为JDK安装路径,以下为默认安装路径示例
变量值 C:\Program Files (x86)\Java\jdk1.8.0_91
新建环境变量
1.双击系统变量Path,或选中并点击下方编辑
1.新建➡️ 2.填入以下固定格式 ➡️3.确定
%JAVA_HOME%\bin
返回新建系统变量
1.新建➡️ 2.变量名、变量值均填写以下固定格式 ➡️3.确定
变量名 CLASSPATH
变量值 .;%JAVA_HOME%\lib;
配置完成检验
win
+R
调出运行
输入cmd➡️确定➡️ 进入命令提示符 ➡️ 输入以下指令回车验证版本
java -version
关于 IDE
IDE 的作用和特性
IDE(Integrated Development Environment)是一个集成开发环境,为开发者提供了包括代码编辑、编译、调试、测试在内的一站式服务。IntelliJ IDEA 作为一款流行的 Java IDE,具备智能代码补全、版本控制工具集成、代码重构等高级功能。 使用 IDE 可以大大提高开发效率,减少手动配置和环境搭建的时间,同时提供更为友好的用户界面和错误提示,帮助开发者更快地定位和解决问题。
JDK 与 IDE 的依赖关系
虽然 IDE 提供了许多便捷的开发工具,但它本身并不包含 JDK。因此,在使用 IDE 如 IntelliJ IDEA 进行 Java 开发前,需要先安装并配置 JDK。在 IDE 中,可以通过设置来指定使用的 JDK 版本,确保项目能够在正确的环境中编译和运行。
配置和使用
安装 JDK 后,通常需要配置环境变量,如 JAVA_HOME,以便系统能够识别 JDK 的安装路径。 在 IDE 中,通过“Settings”或“Preferences”菜单,可以配置项目的 JDK 路径,选择已安装的 JDK 版本作为项目的编译和运行环境
安装常用 IDE
Eclipse 和 IntelliJ IDEA(简称 IDEA)是两种广泛使用的集成开发环境(IDE),它们在界面设计、代码编辑以及重构工具等方面存在区别。
Eclipse
Eclipse 的代码编辑器支持多种语言,如 Java、C++、Python 等,但其代码提示和自动补全功能略显不足,可能需要手动输入更多的代码。Eclipse 提供了一些基本的重构功能,但相对较少,可能无法满足一些高级重构需求。
IDEA
IDEA 具有现代化和直观的用户界面设计,提供清晰的组织结构和菜单选项,使用户能够快速找到所需的功能。这种设计对于追求高效率的开发者来说是一个加分项。同时提供了丰富的重构工具,使代码重构变得更加方便和安全。这些工具包括重命名、提取方法、改变方法签名等常见操作,大大提高了开发效率。 IDEA 旗舰版为收费制软件,联系站长可获取破解工具(仅对 2023 版本及之前有效,推荐 2023.2),或前往官网获取社区版免费使用。
项目创建与编译运行
对应教材 P30 习题 4 和 5✨ 需完成前置条件,即 JDK 安装与环境变量配置
方式一:通过控制台命令程序
1.新建.txt 文本文件 📄➡️ 2.打开输入以下代码 ➡️3.保存并关闭 ➡️4.修改后缀为.java
public class Project { //注意!文件名应与此处类名一致
public static void main(String[] args) {
System.out.println("Hello World");
}
}1.右键所在文件夹 📄➡️ 2.在终端中打开➡️3.输入以下代码
javac Project.java // 回车
// 该命令用于将 java 源文件编译为 class 字节码文件
java Project // 回车
// java 后面跟着的是java文件中的类名,例如 Project 就是类名
方式二:通过 Eclipse
见教材详解,不多做解释
Java project选项,在project选项中选择Java即可。方式三:通过 IDEA
1.选择新建项目📄➡️ 2.选择空项目➡️3.点击创建
1.右键项目文件夹📄➡️ 2.选择新建➡️3.点击Java类➡️4.输入类名确定,或连包带类创建
1.输入上文代码📄➡️ 2.点击顶部运行➡️3.查看控制台输出

程序获取
课后习题题解分析
第二章 1. 求圆球体积
题目
已知圆球体积公式为 V=4/3πr3,编写程序,设计一个求圆球体积的方法,并在主程序中调用它,求出当 r=3 时圆球的体积值。
思路
题目中涉及
π和4/3,所以我们选择double浮点型处理带有小数的运算,并在Math类中调用相关数学方法,Math.PI表示π,Math.pow(a, b)用于处理幂函数a的b次方,再将计算返回值输出即可。
代码
public class Project {
public static void main(String[] args) {
double r = 3;
double v = fun_v(r);
System.out.println("当r=" + r + "时,圆球的体积为:" + v);
}
public static double fun_v(double r) {//形参变量名可与实参变量名重复
return (4.0 / 3.0) * Math.PI * Math.pow(r, 3);//调用Math中的方法
}
}注意
fun_v的返回值类型为浮点型,三分之四必须书写为4.0/3.0第二章 2. 棋盘麦粒问题
题目
曾有一位印度国王要奖赏他聪明能干的宰相达依尔。达依尔只要求在国际象棋的 64 个棋盘格上放置小麦粒,第一格放 1 粒,第二格放 2 粒,第三格放 4 粒,第四格放 8 粒……问最后一格需要放多少粒小麦粒呢?
思路
简洁的指数递增问题,可借助
Math.pow(a, b)快速实现,不再多说,以下则利用for循环不断对当前格数的麦粒数目作自乘运算即可做出解答。
代码
public class Project {
public static void main(String[] args) {
double last = 1; //其他数据类型可能会产生溢出问题
for (int i = 1; i <= 63; i++) {//第一格为1粒,相当于2的0次方
last *= 2;
}
System.out.println("最后一格需要麦粒数量为:" + last);
}
}注意
long,其范围为-2^63~2^63-1会产生溢出问题。第二章 3. 水仙花数
题目
打印出所有的"水仙花数"。“水仙花数"是指一个 3 位数,其各位数字的立方和等干该数本身。例如,153 是一个"水仙花数”,因为 153=1^3+5^3+3^3。
思路
该题可先遍历100-1000 内的数,并将三位数分别提取,作 if 判断枚举输出匹配答案。
代码
public class Project {
public static void main(String[] args) {
for (int i = 100; i < 1000; i++) {
int a = i / 100; //提取百分位
int b = (i % 100) / 10; //提取十分位
int c = i % 10; //提取个位数
if (i == (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3))) {
System.out.println(i);
}
}
}
}注意
%取余符号的用法,不可与/作除符号弄混。第二章 4. 分数序列之和
题目
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…,求出这个数列的前 20 项之和。
思路
分析数学问题,找到规律是关键,序列以 2/1 开始,下一分子为前一分子与分母和,下一分母为前一分子,最后转换成编程语言即可。
代码
public class Project {
public static void main(String[] args) {
double sum = 0; //总和
double s = 2; //分子
double x = 1; //分母
for (int i = 0; i < 20; i++) {
sum += s / x;
s += x;
x = s - x;
}
System.out.println("数列前20项和为:" + sum);
}
}注意
x引用的变量s已经完成累加,原数据已被覆盖,所以作s-x运算。第二章 5. 打印菱形图案。
题目
*
***
*****
*******
*****
***
*思路
不考虑用 7 个print的方法输出,将菱形拆分为两个三角形状嵌套循环输出,外循环控制行数,内循环处理内容。
代码
public class Project {
public static void main(String[] args) {
int n = 4; // 上半三角形行数
// 上半三角形输出
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {//中轴线无空格
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();//单行输出完成换行
}
// 下半三角形输出
for (int i = n - 1; i >= 1; i--) {//反向循环,加变减
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();
}
}
}注意
第二章 6. 素数之和
题目
求出 100~200 之间的所有素数。
思路
素数————在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。且范围 100~200,所以特殊情况1不考虑,站长在这道题采用的是循环枚举,调用布尔类型方法进行判断,输出符合条件结果。
代码
public class Project {
public static void main(String[] args) {
for (int i = 100; i <= 200; i++) {
if (fun_if(i)) {//调用方法作判断条件
System.out.println(i);
}
}
}
public static boolean fun_if(int i) {
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {//找到能被其他数整除
return false;
}
}
return true;
}
}注意
Math.sqrt(i)为计算平方根,因为当被除数大于其平方根后,不肯能出现被整除情况,节省运算时间。实验课题解
判断闰年
//判断是否闰年方法
public static boolean isLeapYear(int year){
if((year%4==0)&&(year%100!=0) || (year%400==0)){
return true;
}else {
return false;
}
}
//main 方法
public static void main(String []args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year=sc.nextInt();
if(isLeapYear(year)){
System.out.println(year+"年是闰年");
}else {
System.out.println(year+"年不是闰年");
}
}判断某年某月多少天
public static boolean isLeapYear(int year){
if((year%4==0)&&(year%100!=0) || (year%400==0)){
return true;
}else {
return false;
}
}
public static int daysInMonth(int year, int month){
int days = 0;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2://特殊月份需调用方法判断是否为闰年
if(isLeapYear(year)){
days= 29;
}else {
days=28;
}
}
return days;
}
//main方法
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year =sc.nextInt();
System.out.println("请输入月份:");
int month = sc.nextInt();
int days = daysInMonth(year,month);
System.out.println(year+"年"+month+"月"+"有"+days+"天");
}