2022年JAVA项目课程学习笔记
时间:2023-05-08 00:37:01
项目一
任务一、安装配置JDK并开发第一个JAVA程序
1.1.1 安装JDK
- 安装JDK
1.1.2 配置JDK
1.1.3 开发JAVA程序
一、编写源程序 编译成字节码 三、解释执行类
任务2,搭建JAVA综合开发环境IntelliJ IDEA
1.2.1 安装InteliJ IDEA
1.2.2 配置InteliJ IDEA
1.23 创建项目,包,类
- 项目:JAVA课程案例
- 包:
net.ouyangyi.p01.t02
- 类:HelloWorld
- 不接收命令行参数
- 操作程序,检查结果
- 接收多个命令行参数(字符串数组)
args
,用for
循环遍历)
- 修改程序,检查结果
项目二,打好JAVA编程基础
眼看百遍代码不如手敲一遍。~ 培养编程技能,注重日积月累~
任务1,计算圆的面积
- 输入圆半径,计算圆面积,输出结果
(一)实现编程
版本1,程序员指定半径计算圆的面积
- 缺点是跟用户之间没有互动
版本2,用户输入半径,程序计算圆面积
-
用户可以输入半径或实数
-
输入整数,使用
sc.netInt()
版本3,设定结果的精度,满足用户的要求
-
要求结果保留两位小数
-
回想你在这里Python如何实现这个用户要求,使用它
round()
函数可以完成
-
采用遮尾法,数据没有变化,只显示两位小数
版本4
- 采用剪尾法处理
任务2,闰年判断
- 什么是闰年?有两种情况:可以4整除,但不能100整除;可以400整除
- 解决闰年判断问题涉及算术操作、关系三种操作- 计算,逻辑操作
- 第一种闰年情况:
year % 4 == 0 && year % 100 != 0
- 第二种闰年情况:
year % 400 == 0
(一)实现编程
- 在net.ouyangyi.po2.t02包里面创建Task01类
- 操作程序,检查结果
- 闰年条件涉及逻辑和
&&
和逻辑或||
,但没有逻辑非!
,请你修改闰年条件,能够将三种逻辑运算符都派上用场。(在Python里:not、and、or)
(三)拓展练习
任务一,计算圆的面积(选择结构版)
- 利用选择结构防范用户输入负的半径
- 查看程序 运行结果
项目三,探索面向对象编程
(一)编程实现
方法一,采用并列式多分支结构评定成绩等级
-
思路:有多少种情况,就并列写多少个单分支
-
第1个分数段: s c o r e > 100 , s c o r e ∈ ( 100 , + ∞ ) score >100,score\in (100,+\infty) score>100,score∈(100,+∞) -超出范围
-
第2个分数段: 90 ≤ s c o r e ≤ 100 , s c o r e ∈ [ 90 , 100 ] 90 \le score \le 100,score \in [90,100] 90≤score≤100,score∈[90,100] -优秀
-
第3个分数段: 80 ≤ s c o r e < 90 , s c o r e ∈ [ 80 , 90 ] 80 \le score \lt 90,score \in [80,90] 80≤score<90,score∈[80,90] -良好
-
第4个分数段: 70 ≤ s c o r e < 80 , s c o r e ∈ [ 70 , 80 ] 70 \le score \lt 80,score \in [70,80] 70≤score<80,score∈[70,80] -中等
-
第5个分数段: 60 ≤ s c o r e < 70 , s c o r e ∈ [ 60 , 70 ] 60 \le score \lt 70,score \in [60,70] 60≤score<70,score∈[60,70] -及格
-
第6个分数段: 0 ≤ s c o r e < 60 , s c o r e ∈ [ 0 , 60 ] 0 \le score \lt 60,score \in [0,60] 0≤score<60,score∈[0,60] -不及格
-
第7个分数段: s c o r e < 0 , s c o r e ∈ ( − ∞ , 0 ) score \lt 0,score \in (-\infty,0) score<0,score∈(−∞,0) -超出范围
-
在
net.ouyangyi.p02.t03
创建Task03_1
-
怎么解决这个问题呢?很简单,在处理部分之前将level初始化为空字符串
-
运行程序,查看结果
- 总结:并列式多分支结构,优点是易于理解,但缺点是效率低(思考一下,为什么效率低)
- 其实,这个程序可以做点优化,因为成绩大于100分或小于0 分都是超出范围,所以可以将这两个并列的分支合二为一。
方法二、采用嵌套式多分支结构评定成绩等级
思路1:从高分到低分来划分各个分数段
- 在
net,ouyangyi.p02.t03
包里面创建Task03_2
类
- 运行程序,查看结果(测试七种情况)
方法三、采用延拓式多分支结构评定成绩等级
- 在
·net.ouyangyi.po2.t03
·包里创建Task02_3
类
- 运行程序,查看结果(测试七种情况)
- 总分:延拓式多分支结构,优点是只有一层,并且效率高。希望同学们务必掌握这一种多分支处理方式。
方法四、采用开关式多分支结构评定成绩等级
- 关键点在于将成绩变量取整之后再整除10,以便将各个分数段转换成离散的整数值,这样才能用开关式多分支结构来进行处理。
- 在
net.ouyangyi.p02.t03
包里面创建Task03_4
类
- 运行程序,查看结果(测试七种情况)
- 总结:开关式多分支结构,优点是书面简洁,并且效率高,但缺点是只能针对离散型的情况进行处理。
- 开关式多分支结构里的测试表达式,类型可以是整数、字符、甚至可以是字符串。
(二)讲解知识点
- 多分支结构可有四种处理方式:并列式、嵌套式、延拓式、开关式
1、并列式多分支结构
if (条件1) {
语句组1
}
if (条件2) {
语句组2
}
……
if (条件n) {
语句组n
}
2、嵌套式多分支结构
if (条件) {
if (条件1) {
语句组1
} else {
……
}
} else {
if (条件2) {
语句组2
} else {
……
}
}
3、延拓式多分支结构
if (条件1) {
语句组1
} else if (条件2) {
语句组2
}
……
} else if (条件n) {
语句组n
} else {
语句组n+1
}
4、开关式多分支结构
switch (测试表达式) {
case 值1:
语句组1
break;
case 值2:
语句组2
break;
……
case 值n:
语句组n
break;
default:
语句组n+1
}
(三)拓展练习
1、确定给定日期是一年的第几天
- 要求输入年、月、日,最好能判断用户输入的是否是合法日期
- 比如2022年3月31日,那是今年的第90天(31+28+31=90)
- 比如2000年3月31日,那是2000年的第91天 (31+29+31=91)
2、构建可进不可退的多级菜单系统
- 采用开关式多分支结构来实现菜单系统
- 在
net.ouyangyi.p02.t03
包里面创建XExercise02
类
- 先完成一级菜单
- 运行程序,查看结果
- 采用模块化思想,创建一个登陆方法-
login()
,然后再用户选择1
菜单项时调用它
- 编写
login()
方法
- 运行程序,测试登陆方法
- 登陆成功之后,定义名片管理方法-
cardManagmen()
- 编写
cardManagement()
方法代码
- 运行程序,测试名片管理方法
- 现在这个菜单系统是可进但是不可退,有一个入口,但有多个入口,等我们学了循环结构之后,我们可以改进这个菜单系统,使之成为可进可退的多级菜单系统,保证系统只有唯一的入口和唯一的出口
任务4,等差数列求和
- 任务:计算1+2+3+······+100的值
(一)编程实现
-
创建
new.ouyangyi.p02.t04
包,然后在包里创建Task04
类
-
i++ :后自增,先用后增
-
运行程序,查看结果
-
其实1 + 2 + 3 + …… + 100跟100 + 99 + …… + 3 + 2 + 1是等值的,因此for循环可以从100递减循环到1来计算
-
大家不妨编程计算1+3+5+······+99的值
-运行代码,查看结果
-
第1种和第2种方法都循环100次,但是第3种方法只循环了50次,效率高一些。
(二)讲解知识点
1、for循环
(1)语法格式
for(初始化表达式; 循环条件; 操作表达式){
执行语句
…
break | continue
…
}
(2)执行流程
- 当循环条件成立时,执行循环,直到循环条件不成立时,终止循环。
2、自增自减运算
(1)自增运算
- 后自增:先用后增
- 签字增:先增后用
(2)自减运算
- 后自减:先用后减
- 前自减:先减后用
(三)拓展练习
任务1、打印水仙花数
- 所谓水仙花数,是指等于其各位数字立方和的三位数
- 运行代码,查看结果
任务5、打印乘法九九表
(一)编程实现
- 在
net,ouyangyi,t05
包里创建Task05
类
- 运行程序,查看结果
任务6、猜数小游戏
- 游戏规则:程序产生一个[1, 100]之间的随机整数,用户输入整数进行猜测,如果猜对了,就结束游戏;如果猜错了,程序会提示你是猜高了还是猜低了,然后让你继续输入整数进行猜测
(一)编程实现
- 在
net.ouyangyi.p02.t06
包里创建Task06
类
- 运行程序,查看结果
(二)拓展练习
任务1、构建可进可退的多级菜单系统
-
在
net.ouyangyi.p02.t06
包里创建XExercise02
类
-
给一级菜单添加循环
-
运行程序,测试结果
-
编写登录方法 -login()
-
运行程序,测试结果
-
编写名片管理方法 - cardManagement()
-
运行程序,查看结果
-
查看完整源代码
任务7、统计一组学生成绩
- 统计一组学生成绩的总分、平均分、最高分和最低分
- 假如一组学生100个人,利用前面所学的知识,程序就需要声明10个变量s c o r e 1 , s c o r e 2 , . . . , s c o r e 100 \mathrm{score1, score2, …, - score100}score1,score2,…,score100,来分别记住每位学生的成绩,计算平均分
(一)编程实现
- 在
net.ouyangyi.p02.t07
包里面创建Task07
类
- 运行程序,查看结果
- 可以利用增强for循环来遍历数组
任务8、打印杨辉三角形
- 杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书出现。在欧洲,帕斯卡(1623 ~ 1662)在1654年发现这一规律。所以这个表又叫做
帕斯卡三角形
。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
- 二项式定理,又称为牛顿二项式定理,有艾萨克牛顿与1664-1665年提出。
(一)编程实现
-
思路:用二维数组来保存杨辉三角形的元素
-
边界:
-
内部:
-
在
net.ouyangyi.p02.t08
包里创建Task08
类
-
运行程序,查看结果
-
杨辉三角形的数据没有问题,但是格式不好看,需要处理一下,使之显示为三角形。
-
在运行程序,查看结果
-
将杨辉三角形显示为等腰三角形
-
利用循环耗时来实现打字机效果
-
这种实现动画效果的不好,浪费支援,应该使用多线程来实现动画效果。
项目三、探索面向对象编程
- 面向对象程序设计(
object Oriented Programming
)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化
任务1、采用面向对象方式求三角形面积
- 采用面向过程的思路:定义一个计算三角形面积的函数
calcuateTriangleArea(double a, double b, double c)
,输入a、b、c,把输入的a、b、c作为参数传入calcuateTriangleArea()
函数,得到计算结果。 - 采用面向对象的思路:创建Triangle类,包含a、b、c私有属性,提供无参与有参构造方法,提供getters和setters,重写toString()方法,提供getArea()方法
- 创建TestTriangle类,创建Triangle对象,设置对象属性a、b、c,调用对象方法,计算出三角形面积
(一)编程的实现
- 创建
net.ouyangyi.p03.t01
包,然后再包里面创建Triangle
类
- 定义三个
缺省权限
的双精度属性a、b、c,定义计算三角形面积的方法getArea(),返回值是双精度
(1)利用三边关系定理判断能否构成三角形 - 三边关系定理:任意两边之和大于第三边
(2)如果能构成三角形,利用海伦公式来计算 - 三边为 a , b , c a,b,c a,b,c,半周长 p = a + b + c 2 p=\displaystyle \frac{a+b+c}{2} p=2a+b+c
- 面积 a r e a = p ( p − a ) ( p − b ) ( p − c ) area=\displaystyle \sqrt{p(p-a)(p-b)(p-c)} area=p(p−a)(p−b)(p−c)
public class Triangle {
// 缺省权限属性
double a, b, c;
/** * @return 三角形面积 */
public double getArea() {
double s = 0, p;
//判断a、b、c能否构成三角形
if (a + b > c && b + c > a && c + a > b) {
p = (a + b +c) / 2;
s = Math.sqrt(p * (p - a) * (p - b) * (p - c));
} else {
s = -1;
}
return s;
}
}
-
类Triangle封装了数据(a、b、c)和操作(getArea()),封装(
Encapsulation
)是面向对象三大特性之一。 -
创建一个测试类
TestTriangle
类,在其主方法里,创建Triangle对象,设置其属性,调用其方法,计算得到三角形面积
public class TestTriangle {
public static void main(String[] args) {
double a, b, c,s;
Scanner sc = new Scanner(System.in);
// 利用无参数构造方法创建三角形
Triangle triangle = new Triangle();
System.out.print("a = ");
a = sc.nextDouble();
System.out.print("b = ");
b = sc.nextDouble();
System.out.print("c = ");
c = sc.nextDouble();
//设置三角形对象属性
triangle.a = a;
triangle.b = b;
triangle.c = c;
//调用三角形对象方法
s = triangle.getArea();
//判断是否构成三角形
if (s != -1) {
System.out.println("area = " + s);
} else {
System.out.println("提示:构不成三角形!");
}
}
}
-
运行程序,查看结果
-
缺省权限属性的不足:由于a、b、c是缺省权限属性,可以通过
对象.属性名
直接访问,比如triangle.a = -10;
,边长不能为负,这样直接访问属性显然不合理,因此,我们应该将属性私有化,外界不能直接访问,而必须通过公共方法来设置和获取属性,于是私有属性得到有效的保护。 -
如何实现类的封装:在定义一个类时,将类中的属性私有化,即使用
private
关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public
修饰的公有方法,其中包括用于获取属性值的getXXX()
方法(简称getter)和设置属性值的setXXX()
方法(简称sette
r)。 -
修改Triangle类,将a、b、c属性设置为私有属性
-
为了让triangle对象能设置私有属性a、b、c,我们就要提供setXXX()方法(setter方法)
-
此时,triangle对象可以设置私有属性a、b、c,但是无法获取私有属性值,我们还需定义getXXX()方法 - getter方法
-
修改TestTriangle类,通过setter方法来设置对象属性
-
运行程序,查看结果
-
演示对象调用getXXX()方法
-
在TestTriangle类主方法里打印三角形对象,会不会显示三角形的数据信息呢?
-
显示的是对象的路径.类名@地址,其实地址就是对象的哈希码。
-
如何才能打印对象时显示对象的数据信息呢,我们需要去重写(Override)Trigle类的toString()方法,类似于__str__()方法的功能。
-
采用IDEA自动生成toString()方法
-
再次运行TestTriangle,看看直接打印对象的效果
-
其实,打印对象时,默认就会调用对象的toString()方法
-
下面我们来给三角形类定义一个有参构造方法
-
此时,切换到TestTriangle类,会发现创建对象出错
-
为什么会报错呢?当我们创建了有参构造方法时,系统就不会自动添加无参构造方法,除非手动添加无参构造方法
-
把蓝色光条一道类名上,表明不初始化任何成员变量
-
我们给构造方法写点代码
-
此时,你再去看看TestTriangle类,你会发现错误消失了
-
运行TestTrigle类,查看结果
-
创建
TestTriangle2
类来测试有参构造方法
package net.ouyangyi.p03.t01;
import java.util.Scanner;
/** * 功能: * 作者:欧阳怡 * 日期:2022年04月28日 */
public class TestTriangle2 {
public static void main(String[] args) {
double a, b, c, s;
Scanner sc = new Scanner(System.in);
Triangle triangle = new Triangle();
System.out.print("a = ");
a = sc.nextDouble();
System.out.print("b = ");
b = sc.nextDouble();
System.out.print("c = ");
c = sc.nextDouble();
//基于有参构造方法来创建三角形对象
Triangle_1 triangle_1 = new Triangle_1(a, b, c);
//调用三角形对象方法
s = triangle_1.getArea();
//打印三角形对象
System.out.println(triangle_1);
//判断是否构成三角形
if (s != -1) {
System.out.println("area = " + s);
} else {
System.out.println("提示:构不成三角形!");
}
}
}
- 运行程序,查看结果
(二)讲解知识点
- 本案例的Triangle类提供了无参构造方法与有参构造方法,这就是构造方法的重载(Overloading),当然普通方法也是允许重载的。比如Student类的
learn()
方法与learn(String subject)
方法就是重载的普通方法。
任务2、创建笔记本电脑类(继承一个类,实现多个接口)
- 创建NetCard接口和USB接口,创建Computer抽象类,然后继承Computer类,实现NetCard接口和USB接口,创建笔记本电脑类Laptop。
- Java简化了C++的多重继承,是单根继承,只能继承一个类,但是作为补偿,Java允许实现多个接口,让一个类可以实现更多的特性。
- 在Java里,继承一个类,实现多个接口,就好比是只有一个父亲,可以有多个叔叔。
(一)编程实现
1、创建NetCard接口
- 在
net.ouyangyi.p03.t02
包里创建NetCard
接口
2、创建USB接口
- 在
ouyangyi.p03.t02
包里创建USB
接口
3、创建Computer抽象类
- 在ouyanyi.p03.t02包里创建Conputer抽象类
package net.ouyangyi.p03.t02; /** * 功能:计算机抽象类 * 作者:欧阳怡 * 日期:2022年05月05日 */ public abstract class Computer { public abstract void computer(); // 抽象方法,必须要有abstract关键字 public abstract void computer元器件数据手册
、IC替代型号,打造电子元器件IC百科大全!