# Java环境配置与基础题解分析


# 前言

{{< note info flat >}}
本篇适用于东油秦《面向对象程序设计》课程学习，教材已有知识点将不再过多解释
{{< /note >}}

# 开发环境

对应教材第一章内容，部分定义已在教材中详细说明，不做详细解释说明。

## 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 的`长期支持版本`均可。
{{< note warning flat >}}
甲骨文官网下载会要求注册账号并登入，且部分路由节点对外网访问有限制，推荐移至文章尾部下载链接
{{< /note >}}
{{< link "JDK官网下载页面" "https://www.oracle.com/cn/java/technologies/downloads/" "https://www.oracle.com/a/tech/img/rc10-java-badge-3.png" >}}

选择 JDK 版本并进行如下操作下载
选择 windows 系统 ➡️ 从上到下依次是`压缩包`、`.exe`、`.msi`格式的安装包 ➡️ 推荐后两者
{{< note info flat >}}
JDK 8 版本安装包无需考虑此问题
{{< /note >}}

### .msi 和.exe 安装包区别

1. .msi 文件 适用于需要可靠的安装、维护和卸载功能的企业级应用，特别是在需要大规模部署的场景中。它提供了丰富的安装选项和维护功能，使得软件管理更加高效和可靠。
2. .exe 文件 则适用于自定义需求较多的安装过程，或者当需要捆绑多个安装程序时。它的灵活性和自定义能力使得它在某些特定场景下非常有用。
   {{< image "https://www.runoob.com/wp-content/uploads/2013/12/jdk-download.png" >}}

### 正式安装 JDK

- 安装 JDK 过程中无特殊要求，点击下一步即可，可以自定义安装目录等信息，例如我们选择安装目录为 C:\Program Files (x86)\Java\jdk1.8.0_91 该路径需要保存以便后续写入环境变量

## 变量配置

### 打开变量管理界面

右键`此电脑`➡️`属性`➡️`高级系统设置`➡️`环境变量`
{{< image "https://file.y1xuanyun.cn/posts/24xue01/1.png" >}}

### 新建系统变量

1.`新建`➡️ 2.`变量名`➡️3.`变量值`➡️4.`确定`

```
变量名  JAVA_HOME
// 变量名需为JDK安装路径，以下为默认安装路径示例
变量值  C:\Program Files (x86)\Java\jdk1.8.0_91
```

{{< image "https://file.y1xuanyun.cn/posts/24xue01/2.png" >}}

### 新建环境变量

1.双击系统变量`Path`,或选中并点击下方`编辑`
{{< image "https://file.y1xuanyun.cn/posts/24xue01/3.png" >}} 1.`新建`➡️ 2.填入以下固定格式 ➡️3.`确定`

```
%JAVA_HOME%\bin
```

{{< image "https://file.y1xuanyun.cn/posts/24xue01/4.png" >}}

### 返回新建系统变量

1.`新建`➡️ 2.`变量名`、`变量值`均填写以下固定格式 ➡️3.`确定`

```
变量名  CLASSPATH
变量值  .;%JAVA_HOME%\lib;
```

{{< image "https://file.y1xuanyun.cn/posts/24xue01/5.png" >}}

### 配置完成检验

{{< kbd >}}win{{< /kbd >}}+{{< kbd >}}R{{< /kbd >}}调出运行
输入`cmd`➡️`确定`➡️ 进入命令提示符 ➡️ 输入以下指令回车验证版本

```
java -version
```

{{< image "https://file.y1xuanyun.cn/posts/24xue01/6.png" >}}
{{< note success flat >}}
显示 JDK 安装版本即环境变量配置成功
{{< /note >}}

# 关于 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），或前往官网获取社区版免费使用。

{{< note warning flat >}}
注意：破解仅用于学习交流，严禁商业用途
{{< /note >}}

{{< btns wide rounded >}}
{{< cell "Eclipse官网下载页面" "https://www.eclipse.org/downloads/packages/" "https://www.eclipse.org/downloads/images/committers.png" >}}
{{< cell "Eclipse 2024.9 下载链接" "https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2024-09/R/eclipse-java-2024-09-R-win32-x86_64.zip" "https://www.eclipse.org/downloads/images/java.png" >}}
{{< cell "IDEA 官网下载页面" "https://www.jetbrains.com/idea/download/?section=windows" "https://tse4-mm.cn.bing.net/th/id/OIP-C.Xw8ijKwHW8yIYIU6GL3c_QAAAA?w=161&h=180&c=7&r=0&o=5&dpr=2&pid=1.7" >}}
{{< cell "IDEA 2023.2 下载链接" "https://download.jetbrains.com/idea/ideaIU-2023.2.exe?_gl=1*11ub9gj*_gcl_au*MTQ4NDM0NTUwMy4xNzI2MTQ1MjM1*_ga*NDM3NTY1OTQxLjE3MDA3ODgxODE.*_ga_9J976DJZ68*MTcyNjE0NTIzNy44LjEuMTcyNjE0NTQwMy4yMy4wLjA." "https://pic60.mac89.com/mac69/ico/202208/19103723_00a36122bc.png" >}}
{{< /btns >}}

{{< note info flat >}}
Eclipse 和 IDEA 官网及其版本安装包下载链接如上，访问受限可移至文末进群下载。🎈🎈🎈
{{< /note >}}

# 项目创建与编译运行

对应教材 P30 习题 4 和 5✨
需完成前置条件，即 JDK 安装与环境变量配置

## 方式一：通过控制台命令程序

1.`新建`.txt 文本文件 📄➡️ 2.`打开`输入以下代码 ➡️3.`保存`并关闭 ➡️4.修改后缀为`.java`

```java
public class Project {  //注意！文件名应与此处类名一致
public static void main(String[] args) {
    System.out.println("Hello World");
}
}
```

1.`右键`所在文件夹 📄➡️ 2.`在终端中打开`➡️3.输入以下代码

```PowerShell
javac Project.java  // 回车
// 该命令用于将 java 源文件编译为 class 字节码文件
java Project   // 回车
// java 后面跟着的是java文件中的类名,例如 Project 就是类名
```

{{< image "https://file.y1xuanyun.cn/posts/24xue01/c.png" >}}

{{< note success flat >}}
输出“ Hello World ”表示编译运行成功
{{< /note >}}

## 方式二：通过 Eclipse

见教材详解，不多做解释
{{< note info flat >}}
若未找到创建`Java project`选项，在`project`选项中选择`Java`即可。
{{< /note >}}

## 方式三：通过 IDEA

1.选择`新建项目`📄➡️ 2.选择`空项目`➡️3.点击`创建`
{{< image "https://file.y1xuanyun.cn/posts/24xue01/i1.png" >}} 1.右键`项目文件夹`📄➡️ 2.选择`新建`➡️3.点击`Java类`➡️4.输入类名确定，或连包带类创建
{{< image "https://file.y1xuanyun.cn/posts/24xue01/i2.png" >}} 1.输入`上文代码`📄➡️ 2.点击顶部`运行`➡️3.查看控制台输出
{{< image "https://file.y1xuanyun.cn/posts/24xue01/i3.png" >}}
{{< note success flat >}}
输出“ Hello World ”表示编译运行成功
{{< /note >}}

# 程序获取

{{< note info flat >}}
因多数官网服务器位于海外，下载受限可移步站长资源 QQ 群，不定时上传其他实用工具，欢迎学习交流。[点击前往](https://qm.qq.com/q/y3HWkaDGhi)
{{< /note >}}

# 课后习题题解分析

{{< note warning flat >}}
代码推荐学习参考，本文已开放复制权限，但请弄懂每一行代码
{{< /note >}}

## 第二章 1. 求圆球体积

### 题目

已知圆球体积公式为 V=4/3πr3，编写程序，设计一个求圆球体积的方法，并在主程序中调用它，求出当 r=3 时圆球的体积值。

### 思路

> 题目中涉及`π`和`4/3`，所以我们选择`double`浮点型处理带有小数的运算，并在`Math`类中调用相关数学方法，`Math.PI`表示`π`，`Math.pow(a, b)`用于处理幂函数`a的b次方`，再将计算返回值输出即可。

### 代码

```java
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中的方法
    }
}
```

### 注意

{{< note warning flat >}}
函数`fun_v`的返回值类型为浮点型，三分之四必须书写为`4.0/3.0`
{{< /note >}}

## 第二章 2. 棋盘麦粒问题

### 题目

曾有一位印度国王要奖赏他聪明能干的宰相达依尔。达依尔只要求在国际象棋的 64 个棋盘格上放置小麦粒，第一格放 1 粒，第二格放 2 粒，第三格放 4 粒，第四格放 8 粒……问最后一格需要放多少粒小麦粒呢？

### 思路

> 简洁的指数递增问题，可借助`Math.pow(a, b)`快速实现，不再多说，以下则利用`for循环`不断对当前格数的麦粒数目作自乘运算即可做出解答。

### 代码

```java
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);
    }
}
```

### 注意

{{< note warning flat >}}
虽然结果为整数，但不可选用长整型`long`,其范围为`-2^63~2^63-1`会产生溢出问题。
{{< /note >}}

## 第二章 3. 水仙花数

### 题目

打印出所有的"水仙花数"。"水仙花数"是指一个 3 位数，其各位数字的立方和等干该数本身。例如，153 是一个"水仙花数"，因为 153=1^3+5^3+3^3。

### 思路

该题可先`遍历`100-1000 内的数，并将三位数分别提取，作 if 判断`枚举`输出匹配答案。

### 代码

```java
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);
            }
        }
    }
}
```

### 注意

{{< note warning flat >}}
弄清`%`取余符号的用法，不可与`/`作除符号弄混。
{{< /note >}}

## 第二章 4. 分数序列之和

### 题目

有一分数序列：2/1,3/2,5/3,8/5,13/8,21/13,…，求出这个数列的前 20 项之和。

### 思路

分析数学问题，找到规律是关键，序列以 2/1 开始，下一分子为前一分子与分母和，下一分母为前一分子，最后转换成编程语言即可。

### 代码

```java
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);
    }
}
```

### 注意

{{< note warning flat >}}
循环中变量`x`引用的变量`s`已经完成累加，原数据已`被覆盖`，所以作`s-x`运算。
{{< /note >}}

## 第二章 5. 打印菱形图案。

### 题目

```java
   *
  ***
 *****
*******
 *****
  ***
   *
```

### 思路

不考虑用 7 个`print`的方法输出，将菱形拆分为两个三角形状嵌套循环输出，外循环控制行数，内循环处理内容。

### 代码

```java
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();
        }
    }
}
```

### 注意

{{< note warning flat >}}
该题需分析清楚如何使用嵌套 for 循环。
{{< /note >}}

## 第二章 6. 素数之和

### 题目

求出 100~200 之间的所有素数。

### 思路

素数————在大于 1 的自然数中，除了 1 和它本身以外不再有其他因数的自然数。且范围 100~200，所以特殊情况`1`不考虑，站长在这道题采用的是循环`枚举`，调用`布尔类型方法`进行判断，输出符合条件结果。

### 代码

```java
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;
    }
}
```

### 注意

{{< note warning flat >}}
判断方法中`Math.sqrt(i)`为计算平方根，因为当被除数大于其平方根后，不肯能出现被整除情况，节省运算时间。
{{< /note >}}

# 实验课题解

{{< note warning flat >}}
本篇只包含上节课 02 题目，复制需粘贴在类中，上机课 03 代码用记事本打开即可
{{< /note >}}

## 判断闰年

```java
//判断是否闰年方法
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+"年不是闰年");
    }
}
```

## 判断某年某月多少天

```java
    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+"天");
    }

```

# 程序获取

{{< note info flat >}}
因多数官网服务器位于海外，下载受限可移步站长资源 QQ 群，不定时上传其他实用工具，欢迎学习交流。[点击前往](https://qm.qq.com/q/y3HWkaDGhi)
{{< /note >}}

# 特别鸣谢

{{< note default flat >}}
参考：[Java 程序设计[王茱]](https://www.nepu.edu.cn/) ; [Java 程序设计[MOOC][东北大学]](https://www.icourse163.org/course/NEU-1205915818)
{{< /note >}}

