前言

本篇适用于东油秦《面向对象程序设计》课程学习,教材已有知识点将不再过多解释

开发环境

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

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格式的安装包 ➡️ 推荐后两者

JDK 8 版本安装包无需考虑此问题

.msi 和.exe 安装包区别

  1. .msi 文件 适用于需要可靠的安装、维护和卸载功能的企业级应用,特别是在需要大规模部署的场景中。它提供了丰富的安装选项和维护功能,使得软件管理更加高效和可靠。
  2. .exe 文件 则适用于自定义需求较多的安装过程,或者当需要捆绑多个安装程序时。它的灵活性和自定义能力使得它在某些特定场景下非常有用。

正式安装 JDK

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

变量配置

打开变量管理界面

右键此电脑➡️属性➡️高级系统设置➡️环境变量

新建系统变量

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

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

新建环境变量

1.双击系统变量Path,或选中并点击下方编辑

1.`新建`➡️ 2.填入以下固定格式 ➡️3.`确定`
1
%JAVA_HOME%\bin

返回新建系统变量

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

1
2
变量名  CLASSPATH
变量值 .;%JAVA_HOME%\lib;

配置完成检验

win+R调出运行

输入cmd➡️确定➡️ 进入命令提示符 ➡️ 输入以下指令回车验证版本

1
java -version

显示 JDK 安装版本即环境变量配置成功

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

注意:破解仅用于学习交流,严禁商业用途

Eclipse 和 IDEA 官网及其版本安装包下载链接如上,访问受限可移至文末进群下载。🎈🎈🎈

项目创建与编译运行

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

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

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

1
2
3
4
5
public class Project {  //注意!文件名应与此处类名一致
public static void main(String[] args) {
System.out.println("Hello World");
}
}

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

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

输出“ Hello World ”表示编译运行成功

方式二:通过 Eclipse

见教材详解,不多做解释

若未找到创建Java project选项,在project选项中选择Java即可。

方式三:通过 IDEA

1.选择新建项目📄➡️ 2.选择空项目➡️3.点击创建

1.右键`项目文件夹`📄➡️ 2.选择`新建`➡️3.点击`Java类`➡️4.输入类名确定,或连包带类创建
1.输入`上文代码`📄➡️ 2.点击顶部`运行`➡️3.查看控制台输出

输出“ Hello World ”表示编译运行成功

程序获取

因多数官网服务器位于海外,下载受限可移步站长资源 QQ 群,不定时上传其他实用工具,欢迎学习交流。点击前往

课后习题题解分析

代码推荐学习参考,本文已开放复制权限,但请弄懂每一行代码

第二章 1. 求圆球体积

题目

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

思路

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

代码

1
2
3
4
5
6
7
8
9
10
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循环不断对当前格数的麦粒数目作自乘运算即可做出解答。

代码

1
2
3
4
5
6
7
8
9
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 判断枚举输出匹配答案。

代码

1
2
3
4
5
6
7
8
9
10
11
12
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 开始,下一分子为前一分子与分母和,下一分母为前一分子,最后转换成编程语言即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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. 打印菱形图案。

题目

1
2
3
4
5
6
7
   *
***
*****
*******
*****
***
*

思路

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();
}
}
}

注意

该题需分析清楚如何使用嵌套 for 循环。

第二章 6. 素数之和

题目

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

思路

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)为计算平方根,因为当被除数大于其平方根后,不肯能出现被整除情况,节省运算时间。

实验课题解

本篇只包含上节课02题目,复制需粘贴在类中,上机课03代码用记事本打开即可

判断闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//判断是否闰年方法
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+"年不是闰年");
}
}

判断某年某月多少天

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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+"天");
}

程序获取

因多数官网服务器位于海外,下载受限可移步站长资源 QQ 群,不定时上传其他实用工具,欢迎学习交流。点击前往

特别鸣谢