项目一、踏上Java开发之旅

任务1、安装配置JDK并开发第一个Java程序

1.1.1安装JDK

-安装JDK11

1.1.2 配置JDK


1.1.3 开发Java程序

1.编写源程序
2.编译成字节码
3.解释执行类

任务2、搭建Java集成开发环境IntelliJ IDEA

1.2.1 安装IntelliJ IDEA


1.2.2 配置IntelliJ IDEA

1.2.3 创建项目、包、类

  • 项目:Java课程案例
  • 包:net.huawei.p01.t02
  • 类:HelloWorld
  • 不接收命令行参数

  • 接收多个命令行参数(字符串数组args,用for循环遍历)
  • 修改程序,再运行,查看结果

项目二、打好Java编程基础

  • 眼观百遍代码,不如手敲一遍~
  • 修炼编程功力,重在日积月累~

任务1、计算圆面积

  • 输入圆半径,计算圆面积,输出结果

(一)编程实现

版本1、程序员指定半径,计算圆面积

  • 缺点是跟用户之间没互动

版本2、用户来输入半径,程序来计算圆面积

  • 用户可以输入整数,也可以输入实数

  • 输入整数,用sc.nextInt()

版本3、设定结果的精度,满足用户的要求

  • 要求结果保留两位小数
  • 回想一下你们在Python里怎么实现这个用户要求的,利用round()函数可以搞定

  • 采用遮尾法,数据没变,只是显示两位小数
  • 采用剪尾法来处理

任务2、闰年判断

  • 什么是闰年?有两种情况:能被4整除但是不能被100整除;能被400整除的数
  • 解决闰年判断问题,涉及三种运算:算术运算、关系运算、逻辑运算
  • 第一种闰年情况:year % 4 == 0 && year % 100 ! = 0
  • 第二种闰年情况:year % 400 == 0

(一)编程实现

  • 在net.huawei.p02.t02包里创建Task02类
  • 闰年条件涉及到两种逻辑运算符,逻辑与&&和逻辑或||,但是没有用逻辑非!,请你修改闰年条件,能够将三种逻辑运算符都派上用场。(在Python里:not、and、or)

(二) 讲解知识点

(三)拓展练习

任务1、计算圆面积(选择结构版)

  • 利用选择结构防范用户输入负的半径
  • 单分支结构一般用于把关或过滤。
  • 当然,也可以用双分支结构,看个人喜好。

任务2、求解一元二次方程(选择结构版)

  • Δ ≥ 0 ,输出两个实数解,否则提示用户“此方程没有实根!”

项目三、探索面向对象编程

(一)编程实现

方法一、采用并列式多分支结构评定成绩等级

  • 思路:有多少种情况,就并列写多少个单分支

  • 第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.nieyourong.p02.t03.Task03_1

  • 怎么解决这个问题呢?很简单,在处理部分之前将level初始化为空字符串

  • 运行程序,查看结果(测试七种情况)






  • 总结:并列式多分支结构,优点是易于理解,但缺点是效率低(思考一下,为什么效率低)。

  • 其实,这个程序可以作点优化,因为成绩大于100分或小于0分都是超出范围,所以可以将这两个并列的分之合而为一

方法二、采用嵌套多分支结构评定成绩等级

  • 思路:从高分到低分来划分各个分数段

  • net.nieyourong.p02.t03Task03_2

  • 运行程序,查看结果(测试七种情况)






  • 总结:嵌套式多分支结构,优点是层次

方法三:采用延拓式多分支结构评定成绩等级

思路1:从高分到低分划分各个分数段

  • net.nieyourong.p02.t03包里创建Task03_3

  • 运行程序,查看结果






思路2:从高分到低分划分各个分数段

  • net.nieyourong.p02.t03包里创建Task03_3_

  • 运行程序,查看结果 (测试七种情况)






  • 总结:延拓式多分支结构,优点是只有一层,并且效率高。希望大家掌握这一种方式。

方法四、采用开关式多分支结构评定成绩等级

  • 关键点在于将成绩变量取整之后再整除10,以便将各个分数段转换成离散的整数值,这样才能用开关式多分支结构来进行处理

  • net.nieyourong.p02.t03包里创建Task03_4_

  • 运行程序,查看结果





  • 总结:开关式多分支结构,优点是书写简洁,并且效率高,但缺点是只能针对离散型的情况进行处理。

  • 开关式多分支结构里的测试表达式,类型可以是整数、字符、甚至可以是字符串

(二)讲解知识点

  • 多分支结构可有四种处理方式:并列式、嵌套式、延拓式、开关式

1、并列式多分支结构

if (条件1) {
语句组1
}
if (条件2) {
语句组2
}
……
if (条件n) {
语句组n
}

2、并列式多分支结构

if (条件1) {
语句组1
}
if (条件2) {
语句组2
}
……
if (条件n) {
语句组n
}

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、构建可进不可退的多级菜单系统

-名片管理系统包括:1.登录 2.退出
登录:1.添加名片 2.修改名片 3.查询名片 4.删除名片

  • 采用开关式多分支结构来实现菜单系统
  • net.nieyourong.p02.t03包里创建XExercise02
  • 先完成一级菜单
  • 运行程序,查看结果


  • 采用模块化思想,创建一个登录方法 - login(),然后再用户选择1菜单项时调用它
  • 编写login()方法
  • 运行程序,测试登录方法

  • 登录成功之后,定义名片管理方法-cardManagment
  • 编写cardManagement()方法代码
  • 运行程序,测试名片管理系统
  • 现在这个菜单系统是可进但是不可退,有一个入口,但有多个入口,等我们学了循环结构之后,我们可以改进这个菜单系统,使之成为可进可退的多级菜单系统,保证系统只有唯一的入口和唯一的出口。

任务4、等差数列求和

  • 任务:计算1 + 2 + 3 + …… + 100的值

(一)编程实现

  • 创建net.nieyourong.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次,效率高一些。

任务5、打印九九乘法表

(一)编程实现

  • net.nieyourong.t05包里创建Task05

  • 运行程序,查看结果

任务6、猜数小游戏(单次版)

  • 游戏规则:程序产生一个[1, 100]之间的随机整数,用户输入整数进行猜测,如果猜对了,就结束游戏;如果猜错了,程序会提示你是猜高了还是猜低了,然后让你继续输入整数进行猜测。

(一)编程实现

net.nieyourong.p02.t06包里创建Task06

  • 运行程序,查看结果
  • net.nieyourong.p02.t06包里创建Task06_

  • 运行程序,查看结果

(二)拓展练习

任务1、猜数小游戏(多次版)

任务2、构建可进可退的多级菜单系统

  • net.nieyourong.p02.t06包里创建XExercise02
  • 给一级菜单添加循环
  • 运行程序,测试效果
  • 编写登录方法 - login()
  • 运行程序,测试效果

  • 编写名片管理方法 - cardMannagement()

  • 运行程序,查看效果

  • 查看完整源代码

任务3、模拟微信拼手气红包程序产生指定个数的随机红包

  • 输入总金额与红包数,随机给每个红包分配金额

任务7、统计一组学生成绩

  • 统计一组学生成绩的总分、平均分、最高分和最低分

(一)编程实现

  • net.nieyourong.p02.t07包里创建Task07

  • 运行程序,查看结果

(三)拓展练习

任务1、蓝桥杯竞赛题:回文日期问题

  • 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按“yyyymmdd”的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021年 12月2日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212即2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。
  • 给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
  • 输入描述:输入包含一个八位整数 N,表示日期。
    对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数
  • 输出描述:输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型
    的回文日期。

任务2、数组排序(升序和降序排列)

1、选择法排序

(1)选择法排序含义
  • 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
(2)选择法排序实现步骤
  • 选择法排序(降序):n nn个数排序,经过n − 1 n-1n−1轮比较。
    – 第1 11轮是第1 11个数跟剩下的( n − 1 ) (n-1)(n−1)个数比较,让第1 11个数成为本轮最大者,要比较( n − 1 ) (n-1)(n−1)次;
    – 第2 22轮是第2 22个数跟剩下的( n − 2 ) (n-2)(n−2)个数比较,让第2 22个数成为本轮最大者,要比较( n − 2 ) (n-2)(n−2)次;
    – ……
    – 第( n − 1 ) (n-1)(n−1)轮是第( n − 1 ) (n-1)(n−1)个数与剩下的1 11个数比较,让第( n − 1 ) (n-1)(n−1)个数成为本轮最大者,要比较1 11次。
    – 总比较次数:(n−1)(n−2)+…+2+1= n(n−1)/2=O(n *n )

2、冒泡法排序

(1)冒泡法排序含义

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。

(2)冒泡法排序实现步骤
  • 冒泡法排序(降序):n nn个数排序,经过n − 1 n-1n−1轮比较。
    – 第1 11轮是n nn个数里相邻两个数比较,如果后者比前者大就交换,要比较( n − 1 ) (n-1)(n−1)次,本轮最小者“浮”到第n nn个位置;
    – 第2 22轮是前( n − 1 ) (n-1)(n−1)个数里相邻两个数比较,如果后者比前者大就交换,要比较( n − 2 ) (n-2)(n−2)次,本轮最小者“浮”到第( n − 1 ) (n-1)(n−1)个位置;
    – ……
    – 第( n − 1 ) (n-1)(n−1)轮是前2 22个数里相邻两个数比较,如果后者比前者大就交换,要比较1 11次,本轮最小者“浮”到第2 22个位置;
    – 总比较次数:(n−1)+(n−2)+…+2+1= n(n−1)/2

任务8、打印杨辉三角形

  • 杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623 ~ 1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

  • 二项式定理,又称牛顿二项式定理,由艾萨克牛顿于1664-1665年提出。

(一) 编程实现

  • 思路:用二维数组来保存杨辉三角形的元素
    KaTeX parse error: Undefined control sequence: \stop at position 62: …1&4 &6 &4 &1\\ \̲s̲t̲o̲p̲{matrix}
  • 边界:a[i][0]=1,a[i][i]=1,i∈[0,n−1]a[i][0] = 1, a[i][i] =1, i\in[0, n-1]a[i][0]=1,a[i][i]=1,i∈[0,n−1]
  • 内部:a[i][j]=a[i−1][j−1]+a[i−1][j],i∈[2,n],j∈[1,i−1]a[i][j]=a[i-1][j-1]+a[i-1]
  • net.nieyourong.p02.t08包里创建Task08

  • 运行和谐,查看结果
  • 将杨辉三角形显示为等腰三角形
  • 打字机程序
  • 运行程序效果

项目三、探索面向对象编程

任务1、采用面向对象方式求三角形面积

(一)编程实现

  • 利用IDEA的工具
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.println("a = ");a = sc.nextDouble();System.out.println("b = ");b = sc.nextDouble();System.out.println("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("温馨提示:构不成三角形!");}}
}
  • 运行程序,查看结果

项目三、探索面向对象编程

  • 面向对象程序设计(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.nieyourong.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) ​

package net.nieyourong.p03.t01;/*** 功能:三角形类* 作者:聂友蓉* 日期:2022年04月21日*/
public class Triangle {//缺省权限属性(同一个包里的对象都可以访问)double a, b, c;/*** 面积计算方法* * @return 三角形面积*/public double getArea() {// 不需要参数,直接访问属性double s, 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对象,设置其属性,调用其方法,计算得到三角形面积
package net.nieyourong.p03.t01;import java.util.Scanner;/*** 功能:测试三角形类* 作者:聂友蓉* 日期:2022年04月21日*/
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()方法(简称setter)。

  • 修改Triangle类,将a、b、c属性设置为私有属性

  • 为了让triangle对象能设置私有属性a、b、c,我们就要提供setXXX()方法(setter方法)

  • 参数名与成员变量名相同时,给成员变量名加个this前缀,this这个特殊变量代表的当前类的实例,相当于Python类当中的self

  • 此时,triangle对象可以设置私有属性a、b、c,但是无法获取私有属性值,我们还需定义getXXX()方法 - getter方法

  • 修改TestTriangle类,通过setter方法来设置对象属性

  • 运行程序,查看结果

  • 演示对象调用getXXX()方法

  • 操作技巧:利用IDES自动 生成类的getters和setters

任务2、创建笔记本电脑类(继承一个类,实现多个接口)

  • 创建NetCard接口和USB接口,创建Computer抽象类,然后继承Computer类,实现NetCard接口和USB接口,创建笔记本电脑类Laptop。
  • Java简化了C++的多重继承,是单根继承,只能继承一个类,但是作为补偿,Java允许实现多个接口,让一个类可以实现更多的特性。
  • 在Java里,继承一个类,实现多个接口,就好比是只有一个父亲,可以有多个叔叔。

(一)编程实现

1、创建NetCard接口
  • net.nieyourong.p03.t02包里创建NetCard接口
package net.nieyourong.p03.t02;/*** 功能:网卡接口* 作者:聂友蓉* 日期:2022年05月05日*/
public interface NetCard {public  abstract void  connectNetwork();//抽象方法,默认是public权限default void speak() {//缺省方法(从JDK8开始)System.out.println("网卡用于连接网络……");}static void tell() {//静态方法(从JDK8开始)System.out.println("我是一张网卡");}
}
2、创建USB接口
  • net.nieyourong.p03.t02包里创建USB接口
package net.nieyourong.p03.t02;/*** 功能:USB接口(Universal)* 作者:聂友蓉* 日期:2022年05月05日*/
public interface USB {String TYPE = "3.0";//接口只能定义常量void connectUSB();//抽象方法
}
创建Computer抽象类
  • net.nieyourong.p03.t02包里创建Computer抽象类
package net.nieyourong.p03.t02;/*** 功能:计算机抽象类* 作者:聂友蓉* 日期:2022年05月05日*/
public abstract class Computer {public abstract void compute();//抽象方法,必须要有abstract关键字(加上public)public abstract void compute(String item);//重载(Overload)的抽象方法public void speak() {//普通方法System.out.println("我是一台计算机……");}
}
4、创建笔记本电脑类 - Laptop
  • net.nieyourong.p03.t02包里创建Laptop
  • Laptop继承Computer抽象类,实现NetCardUSB接口

package net.nieyourong.p03.t02;/*** 功能:笔记本电脑类* 作者:聂友蓉* 日期:2022年05月05日*/
public class Laptop extends Computer implements NetCard, USB{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void compute() {System.out.println("笔记本电脑[" + name + "]正在计算中……");}@Overridepublic void compute(String item) {System.out.println("笔记本电脑[" + name + "]正在计算[" + item + "]。");}@Overridepublic void connectNetwork() {System.out.println("笔记本电脑[" + name + "]正在连接网络……");}@Overridepublic void connectUSB() {System.out.println("笔记本电脑[" + name + "]正在连接USB接口……");}
}
  • 此时,查看类的层次结构图,按组合键<Ctrl> +<H>
  • 查看一下Laptop的类图
  • 我们可以看一看比较复杂的类图(继承JFrame,创建LoginFrame)
5、创建笔记本电脑测试类
  • net.nieyourong.p03.t02包里创建TestLaptop
package net.nieyourong.p03.t02;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/*** 功能:测试笔记本电脑* 作者:聂友蓉* 日期:2022年05月05日*/
public class TestLaptop {public static void main(String[] args) throws IOException {String name, item;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//BufferedReader缓冲字符流System.out.print("笔记本电脑名:");name = br.readLine();System.out.print("计算的项目名:");item = br.readLine();//基于无参构造方法创建对象Laptop laptop = new Laptop();//设置对象属性laptop.setName(name);//调用对象方法(只能用父类的方法)laptop.speak();laptop.connectUSB();laptop.connectNetwork();laptop.compute();laptop.compute(item);}
}
  • 运行程序,查看结果
  • 代码说明:Computer类除了两个重载的抽象方法之外,还有一个普通方法speak(),这个方法不是私有的,因此它的子类Laptop就能继承这个方法,于是laptop.speak()方法会输出“我是一台计算机……”

(二)讲解知识点

1、知识点说明
  • 抽象类不能实例化
  • 使用抽象类的匿名子类

  • 创建一个类,如果没有显式地继承某个类,那么它就是Object类的子类

(二)拓展拓展练习

任务1、创建Animal类,继承Animal类创建 Cat类、Dog类和Bird类
  • Animal的类图
  • Cat的类图
  • Dog的类图
  • Bird的类图
任务2、显示一个Swing窗口
  • 创建LoginFram类,继承JFrame


  • 希望在窗口里添加一个按钮,单击它会弹出一个消息框,网页设计里通过脚本来实现,如下图所示。

package net.nieyourong.p03.t02;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;/*** 功能:登录窗口* 作者:聂友蓉* 日期:2022年05月05日*/
public class LoginFrame extends JFrame {private JButton btnLogin;/*** 构造方法*/public LoginFrame(String title) {super((title));//super表示父类的实例initGUI();//初始化用户界面eventHandling();//进行事件处理}/*** 事件处理 匿名内部类*/private void eventHandling() {//给登录按钮注册动作监听器btnLogin.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(null, "哈哈,今天立夏,欢迎登录~");}});}/*** 初始化图形用户界面*/private void initGUI() {//创建按钮对象btnLogin = new JButton("登录");btnLogin.setFont(new Font("楷体",Font.PLAIN,20));//获取窗口的内容面板(Container --> JPanel)JPanel panel = (JPanel) this.getContentPane();//设置内容面板布局 - 流式布局panel.setLayout(new FlowLayout());//将按钮对象添加到内容面板panel.add(btnLogin);//设置窗口属性this.setVisible(true);this.setBounds(200,200, 400, 300);//设置窗口边界(位置与大小)this.setLocationRelativeTo(null);//让窗口屏幕居中this.setResizable(false);//让窗口不能调整尺寸this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口里退出应用程序(3)}public static void main(String[] args) {//创建登录窗口匿名对象new LoginFrame("用户登录");}
}
  • 运行程序,查看结果

任务3、学生喂养三种宠物:猫、狗和鸟

  • 动物类(Animal):属性(name、age)、方法(speak、move、eat)
  • 猫类(Cat)继承动物类,添加新方法(play)
  • 狗类(Dog)继承动物类,添加新方法(play)
  • 鸟类(Bird)继承动物类,添加新方法(play)
  • 学生类(Student):属性(name)、方法(feed(animal))

(一)编程实现

1、创建动物类
  • net.nieyourong.p03.t03包里创建Animal
package net.nieyourong.p03.t03;/*** 功能:动物类* 作者:聂友蓉* 日期:2022年05月12日*/
public class Animal {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void segAge(int age) {this.age = age;}public void speak() {System.out.println(name + "今年" + age + "岁了。");}public void move() {System.out.println(name + "在动……");}public void eat() {System.out.println(name + "在吃……");}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2、继承动物类,创建猫类
  • net.nieyourong.p03.t03包里创建Cat
package net.nieyourong.p03.t03;/*** 功能:猫类* 作者:聂友蓉* 日期:2022年05月12日*/
public class Cat extends Animal{/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("猫咪[" + getName() + "]在走路。");}@Overridepublic void eat() {System.out.println("猫咪[" + getName() + "]爱吃鱼虾。");}/*** 子类添加新的方法*/public  void play() {System.out.println("猫咪[" + getName() + "]玩老鼠。");}
}
3、继承动物类,创建狗类
  • net.nieyourong.p03.t03包里创建Dog
package net.nieyourong.p03.t03;/*** 功能:狗类* 作者:聂友蓉* 日期:2022年05月12日*/
public class Dog extends Animal {/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("狗崽[" +getName() + "]在蹦跳。");}/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void eat() {System.out.println("狗崽[" +getName() + "]爱吃骨头。");}/*** 子类改写父类的同名同参方法(纵向多态)*/public void play() {System.out.println("狗崽[" +getName() + "]在玩飞盘。");}
}
4、继承动物类,创建鸟类
  • net.nieyourong.p03.t03包里创建Bird
package net.nieyourong.p03.t03;/*** 功能:鸟类* 作者:聂友蓉* 日期:2022年05月12日*/
public class Bird extends Animal{/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("鸟儿[" + getName() + "]在飞翔。");}/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void eat() {System.out.println("鸟儿[" + getName() + "]爱吃小虫。");}/*** 子类改写父类的同名同参方法(纵向多态)*/public void play() {System.out.println("鸟儿[" + getName() + "]在玩羽毛。");}
}
5、创建学生类
  • net.nieyourong.p03.t03包里创建Student

  • 应该定义一个喂养方法,传入的是动物对象,而不是具体的猫对象、狗对象或鸟对象
  • Studen类的feed()方法,参数是Animal对象,可以指向狗、可以指向猫、也可以指向鸟,然后调用animal.move()animal.eat()时就会根据传入的不同动物而呈现不同的形态。Java提供了一个关键字instanceof,用来判断一个对象是否是某个类(或接口)的实例或者子类实例。
package net.nieyourong.p03.t03;/*** 功能:学生类* 作者:聂友蓉* 日期:2022年05月05日*/
public class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void feed(Animal animal) {if (animal instanceof Cat) { // 判断是否是猫实例System.out.println(name + "喂养猫咪[" + animal.getName() + "]。");            } else if (animal instanceof Dog) { // 判断是否是狗实例System.out.println(name + "喂养狗崽[" + animal.getName() + "]。");} else if (animal instanceof Bird) { // 判断是否是鸟实例System.out.println(name + "喂养鸟儿[" + animal.getName() + "]。");} else {System.out.println(name + "喂养动物[" + animal.getName() + "]。");}animal.move(); // 体现多态animal.eat(); // 体现多态}
}
6、创建测试学生类
  • net.nieyourong.p03.t03包里创建TestStudent
package net.nieyourong.p03.t03;/*** 功能:测试学生类* 作者:聂友蓉* 日期:2022年05月12日*/
public class TestStudent {public static void main(String[] args) {//创建学生对象Student student = new Student();student.setName("张小明");//创建第一个动物Animal animal1 = new Cat();animal1.setName("黄虎");animal1.setAge(4);//创建第二个动物Animal animal2 = new Cat();animal2.setName("咪咪");animal2.setAge(5);//创建第三个动物Animal animal3 = new Cat();animal3.setName("丁丁");animal3.setAge(3);//调用学生对象的喂养方法,传入不同的动物对象student.feed(animal1);student.feed(animal2);student.feed(animal3);}
}
7、运行程序,查看 结果
  • 运行TestStudent

  • 在第15行、第20行与第25行分别创建猫、狗与鸟对象,注意,指向的都是父类Animal变量animal1animal2animal3,传入学生对象的feed()方法,在feed()方法调用参数对象的move()eat()方法时,程序在编译时自动识别具体的子类对象,从而选择性地调用对应的方法,这就是Java多态性的体现。由此可见,多态不仅解决了方法同名的问题,而且还使程序变得更加灵活,从而有效地提高程序的可扩展性和可维护性。

  • 美中不足之处:运行结果当中没有显示出各种动物的玩法

  • 修改Student类,直接添加一句animal.play(),但是要报错,怎么办呢

    -此时,我们要利用对象的向下转型(downcasting)

  • 再次运行测试学生类,查看结果

(二)知识点讲解

  • 定义: 在Java中,多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。
  • 说明: 通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。
  • 作用: 通过多态,消除了类之间的耦合关系,大大提高了程序的可扩展性和可维护性。
  • 注意: Java的多态性是由类的继承、方法重写以及父类引用指向子类对象体现的。由于一个父类可以有多个子类,多个子类都可以重写父类方法,并且多个不同的子类对象也可以指向同一个父类。这样,程序只有在运行时程序才能知道具体代表的是哪个子类对象,这就体现了多态性。

任务4、司机开不同的车

  • 创建Car接口

  • 创建Driver类

  • 创建测试类TestDriver

  • 基于Car接口创建匿名内部类对象作为参数传给驾驶员对象的driver()方法

  • 基于Car接口创建成员内部类对象作为参数传给驾驶员对象的driver()方法

(一)编程实现

1、创建汽车接口
  • net.nieyourong.p03.t04包里创建Car接口
package net.nieyourong.p03.t04;/*** 功能:汽车接口* 作者:聂友蓉* 日期:2022年05月12日*/
public interface Car {void start();void run();void stop();
}
2、创建司机类
  • net.nieyourong.p03.t04包里创建Driver
  • Driver类里创建成员内部类Benz
package net.nieyourong.p03.t04;/*** 功能:司机类* 作者:聂友蓉* 日期:2022年05月12日*/
public class Driver {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void drive(Car car) {if (car instanceof Benz) {Benz benz = (Benz) car;benz.speak();}car.start();car.run();car.stop();}/*** 成员内部类*/class Benz implements Car {private String model;private double price;private String color;public String getModel() {return model;}public void setModel(String model) {this.model = model;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic void start() {System.out.println("奔驰[" + model + "]起步……");}@Overridepublic void run() {System.out.println("奔驰[" + model + "]行驶……");}@Overridepublic void stop() {System.out.println("奔驰[" + model + "]停止……");}public void speak() {System.out.println(color + "色奔驰[" + model + "]单价:" + price + "万~");}}
}
  • DriverBenz的外部类,Benz就是Driver成员内部类
  • Driver类添加name属性和drive(Car car)方法
3、创建测试司机类
  • net.nieyourong.p03.t04包里创建TestDriver
package net.nieyourong.p03.t04;/*** 功能:测试司机类* 作者:聂友蓉* 日期:2022年05月12日*/
public class TestDriver {public static void main(String[] args) {//创建司机对象(外部类对象)Driver driver = new Driver();//设置司机对象属性driver.setName("唐小刚");//基于司机对象(外部类对象)创建奔驰对象(内部类对象)Driver.Benz benz = driver.new Benz();//设置奔驰对象属性benz.setModel("梅赛德斯-AMG A 35 L 4MATIC");benz.setPrice(45);benz.setColor("蓝");//调用司机对象的驾驶方法driver.drive(benz);}}
4、运行程序,查看结果
  • 运行TestDriver
5、修改TestDriver类,演示匿名内部类
  • 匿名内部类是直接基于接口创建对象
package net.nieyourong.p03.t04;/*** 功能:测试司机类* 作者:聂友蓉* 日期:2022年05月12日*/
public class TestDriver {public static void main(String[] args) {//创建司机对象(外部类对象)Driver driver = new Driver();//设置司机对象属性driver.setName("唐小刚");//基于司机对象(外部类对象)创建奔驰对象(内部类对象)Driver.Benz benz = driver.new Benz();//设置奔驰对象属性benz.setModel("梅赛德斯-AMG A 35 L 4MATIC");benz.setPrice(45);benz.setColor("蓝");//调用司机对象的驾驶方法driver.drive(benz);System.out.println("==================================");//司机驾驶白色宝马车driver.drive(new Car() {private String model = "全新BMW Z4敞篷跑车";private double price = 55;private String color = "红";@Overridepublic void start() {System.out.println("宝马[" + model + "]起步……");}@Overridepublic void run() {System.out.println("宝马[" + model + "]行驶……");}@Overridepublic void stop() {System.out.println("宝马[" + model + "]停止……");}public void speak() {System.out.println(color + "色宝马[" + model + "]单价:" + price + "万~");}});}
}
6、运行程序,查看结果
  • 运行TestDriver

(二)知识点讲解

1、成员内部类

在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。其实我们可以将内部类理解为国中之国。

2、局部内部类定义

局部内部类,也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。

3、静态内部类定义

所谓静态内部类,就是使用static关键字修饰的成员内部类。静态内部类在成员内部类前增加了static关键字,在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员。

4、匿名内部类

匿名内部类其实就是没有名称的内部类。在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。

(三)拓展练习

任务1、使用成员内部类实现学生使用各种类型计算机的场景
  • Computer接口(speak()方法、compute()方法)
  • Student类(name属性、use(Computer computer)方法、Desktop成员-内部类、Laptop成员内部类、iPad成员内部类)
  • TestStudent类(使用台式机、使用笔记本、使用平板电脑)
任务2、使用匿名内部类实现学生使用各种类型计算机的场景
  • Computer接口(speak()方法、compute()方法)
  • Student类(name属性、use(Computer computer)方法)
  • TestStudent类(使用台式机、使用笔记本、使用平板电脑)

任务5、知识点讲解

  • String类常见操作思维导图

(一)知识点:字符拼接

(1)字符直接用+拼接
  • 演示直接用+连接两个字符串
  • 这样会有三个内存单元来存放字符串,浪费内存空间,建议采用StringBuffer(线程安全)或者StringBuilder(线程不安全)来实现字符串拼接。
(2)使用StringBuffer来拼接字符串
  • 利用append()方法添加字符串,利用toString()得到缓冲区的字符串数据
(3)使用StringBuilder来拼接字符串
  • 利用append()方法添加字符串,利用toString()得到缓冲区的字符串数据

(二)拓展练习

任务1、编程实现字符串大小写转换并倒序输出
  • 例如:abThRx ⟹ XrHtBA
任务2、编写一个简单的字符串加密和解密程序
  • 自定义加密规则,比如a→d, b→ e, c→ f…

任务六、输出指定要求的回文日期

  • 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按“yyyymmdd”的格式写成一个8 位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期(palindromic date)。有人表示20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021年 12月2日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个ABABBABA型的回文日期:21211212即2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。
  • 给定一个 8 位数的日期,请你计算该日期之后下一个回文日期下一个 ABABBABA 型回文日期各是哪一天。
  • 输入描述:输入包含一个八位整数 N,表示日期。对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数
  • 输出描述:输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA型回文日期。

(一)编程实现

  • net.nieyourong.p03.t06包里创建PalindromicDate
1、判断输入日期是否合法
  • 创建静态方法isLegalDate(String strDate)
package net.nieyourong.p03.t06;/*** 功能:输出指定要求的回文日期* 作者:聂友蓉* 日期:2022年05月19日*/
public class PalindromicDate {/*** 判断日期是否合法* * @param strDate* @return true-合法,false-非法*/private static boolean isLegalDate(String strDate) {int year, month, day;year = Integer.parseInt(strDate.substring(0, 4));month = Integer.parseInt(strDate.substring(4, 6));day = Integer.parseInt(strDate.substring(6));// 利用反向思维来处理if (year < 1000 || year > 8999) return false;if (month < 1 || month > 12) return false;if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {if (day < 1 || day > 31) return false;} else if (month == 2) {if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 闰年判断if (day < 1 || day > 29) return false;} else {if (day < 1 || day > 28) return false;}} else {if (day < 1 || day > 30) return false;}return true;}
}
2、创建主方法,测试输入日期是否合法
  • 判断输入日期是否合法,给出相应的提示
public static void main(String[] args) {                        String strDate;                                             int year, month, day;                                       Scanner sc = new Scanner(System.in);  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");                     System.out.print("输入8位数构成的日期:");                            strDate = sc.next();                                        if (isLegalDate(strDate)) {                                 System.out.println("[" + strDate + "]是合法日期~");          } else {                                                    System.out.println("[" + strDate + "]是非法日期~");          }
}                                                               
  • 运行程序,查看结果
  • 月份和天日都不对

  • 年份、月份和天日都对,但是长度不对
3、判断日期是否是回文日期
  • 定义静态方法isPalindromicDate()方法
/**                                                                           * 判断是否是回文日期                                                                  *                                                                            * @param strDate                                                             * @return true-回文日期,false-非回文日期                                              */
private static boolean isPalindromicDate(String strDate) {                    for (int i = 0; i < 4; i++) {                                             // 采用反向思维                                                             if (strDate.charAt(i) != strDate.charAt(7 - i)) return false;         }                                                                         return true;
}                                                                                                                                    
4、修改主方法,输出该日期之后的第一个回文日期
  • 完成第一个任务:输出该日期之后的第一个回文日期
// 将用户输入的合法日期作为日期循环的起点
year = Integer.parseInt(strDate.substring(0, 4));
month = Integer.parseInt(strDate.substring(4, 6));
day = Integer.parseInt(strDate.substring(6));
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, day);
// 任务1、输出该日期之后的第一个回文日期
String strDate1 = strDate;
Calendar calendar1 = calendar;
while (true) {                                                    calendar1.add(Calendar.DAY_OF_MONTH, 1); // 往后推1天             strDate1 = sdf.format(calendar1.getTime());                   if (isPalindromicDate(strDate1)) {                            break; // 找到一个回文日期就跳出循环                                   }
}
System.out.println("该日期之后的第一个回文日期:" + strDate1);                                                                ``
- 运行程序,查看结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/a8245717578648618a92928a87551c13.png#pic_center)
##### 判断是否是ABABBABA型回文日期
- 定义静态方法`isABABBABAPalindromicDate()`
![在这里插入图片描述](https://img-blog.csdnimg.cn/b7d69ebb108d402f8e7d7594f247dee4.png#pic_center)```java
/**                                                                                                        * 判断是否是ABABBABA型回文日期                                                                                      *                                                                                                         * @param strDate                                                                                          * @return true-ABABBABA型回文日期,false-非ABABBABA型回文日期                                                         */
private static boolean isABABBABAPalindromicDate(String strDate) {                                         if (isPalindromicDate(strDate)) {                                                                      if (strDate.charAt(0) == strDate.charAt(2) && strDate.charAt(1) == strDate.charAt(3)) return true; }                                                                                                      return false;
}                                                                                                          
6、修改主方法,输出该日期之后的第一个ABABBABA型回文日期
  • 完成第二个任务:输出该日期之后的第一个ABABBABA型回文日期
// 任务2、输出该日期之后的第一个ABABBABA型回文日期
String strDate2 = strDate;
Calendar calendar2 = calendar;
while (true) {                                              calendar2.add(Calendar.DAY_OF_MONTH, 1); // 往后推1天       strDate2 = sdf.format(calendar2.getTime());             if (isABABBABAPalindromicDate(strDate2)) {              break; // 找到一个回文日期就跳出循环                             }
}
System.out.println("该日期之后的第一个ABABBABA型回文日期:" + strDate2);   
7、查看完整源代码
package net.nieyourong.p03.t06;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;/*** 功能:输出指定要求的回文日期* 作者:聂友蓉* 日期:2022年05月19日*/
public class PanlindromicDate {public static void main(String[] args) {String strDate = "";int year, month, day;Calendar calendar = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Scanner sc = new Scanner(System.in);System.out.print("输入八位数构成的日期:");strDate = sc.next();//判断日期是否合法if (isLegalDate(strDate)) {System.out.println(strDate + "是合法日期~");//用户输入的日期作为起点year = Integer.parseInt(strDate.substring(0,4));month = Integer.parseInt(strDate.substring(4,6));day = Integer.parseInt(strDate.substring(6));calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,month - 1);calendar.set(Calendar.DAY_OF_MONTH,day);//输出此日期之后的第一个回文日期String strDate1 = "";while (true) {calendar.add(Calendar.DAY_OF_MONTH,1);//后推1天strDate1 = sdf.format(calendar.getTime());if (isPalindromicDate(strDate1)) {break;}}System.out.println("此日期之后的第一个回文日期:" + strDate1);\//用户输入的日期作为起点year = Integer.parseInt(strDate.substring(0,4));month = Integer.parseInt(strDate.substring(4,6));day = Integer.parseInt(strDate.substring(6));calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,month - 1);calendar.set(Calendar.DAY_OF_MONTH,day);//输出此日期之后的第一个回文日期String strDate2 = "";while (true) {calendar.add(Calendar.DAY_OF_MONTH,1);//后推1天strDate1 = sdf.format(calendar.getTime());if (isPalindromicDate(strDate2)) {break;}}System.out.println("此日期之后的第一个ABABBABA型回文日期:" + strDate2);} else {System.out.println(strDate + "是非法日期~");}}/*** 判断日期是否合法** @param strDate* @return true - 合法, false - 非法*/private static boolean isLegalDate(String strDate) {int year, month, day;year = Integer.parseInt(strDate.substring(0,4));month = Integer.parseInt(strDate.substring(4,6));day = Integer.parseInt(strDate.substring(6));if(year < 1000 || year > 8999) return false;if(month < 1 || month > 12) return false;if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {if (day < 1 || day > 31) return false;}else if(month == 2) {if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {if (day < 1 || day > 29) return false;}else {if(day < 1 || day > 28) return false;}}else {if(day < 1 || day > 28) return false;}return true;}/***判断是否是回文日期** @param strDate* @return true - 回文,false - 非回文*/public static boolean isPalindromicDate(String strDate) {for (int i = 0; i < 4; i++) {if (strDate.charAt(i) != strDate.charAt(7-i)) return false;}return true;}/*** 判断是否是ABABBABA型回文日期** @param strDate* @return*/private static boolean isABABBABADate(String strDate) {if(isPalindromicDate(strDate)) {if(strDate.charAt(0) == strDate.charAt(2) && strDate.charAt(1) == strDate.charAt(3)) {return true;}}return false;}
}
8、运行程序,查看结果
  • 输入一个合法日期
  • 输入一个非法日期

(二)知识点讲解

案例:计算中华人民共和国成立了多少天

  • net.nieyourong.t06包里创建LifeOfPRC
package net.nieyourong.t06;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** 功能:计算中华人民共和国成立了多少天* 作者:聂友蓉* 日期:2022年05月19日*/
public class LifeOfPRC {public static void main(String[] args) {//创建简单日期格式对象System.out.println("方法一、采用Date类");SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");Date foundDate = new Date(1949-1900,9,1,8,0,0);//1949-10-1System.out.println("成立日期:" + sdf.format(foundDate));Date currentDate = new Date();System.out.println("当前日期:" + sdf.format(currentDate));long interval = 0;//时间间隔(毫秒数)interval = currentDate.getTime() - foundDate.getTime();System.out.println("中国人民共和国成立了" + interval + "毫秒");System.out.println("中国人民共和国成立了" + (interval / 1000) + "秒");System.out.println("中国人民共和国成立了" + (interval / 1000/60) + "分");System.out.println("中国人民共和国成立了" + (interval / 1000/60/60) + "小时");System.out.println("中国人民共和国成立了" + (interval / 1000/60/24) + "天");System.out.println("=================================");System.out.println("方法二、采用Calendar类");Calendar calendar1 = Calendar.getInstance();calendar1.set(Calendar.YEAR,1949);calendar1.set(Calendar.MARCH,10);calendar1.set(Calendar.DAY_OF_MONTH,1);calendar1.set(Calendar.HOUR,8);calendar1.set(Calendar.MINUTE,0);calendar1.set(Calendar.SECOND,0);System.out.println("成立日期:" + sdf.format(calendar1.getTime()));Calendar calendar2 = Calendar.getInstance();System.out.println("当前日期:" + sdf.format(calendar2.getTime()));interval = calendar2.getTime().getTime()-calendar1.getTime().getTime();System.out.println("中国人民共和国成立了" + interval + "毫秒");System.out.println("中国人民共和国成立了" + (interval / 1000) + "秒");System.out.println("中国人民共和国成立了" + (interval / 1000/60) + "分");System.out.println("中国人民共和国成立了" + (interval / 1000/60/60) + "小时");System.out.println("中国人民共和国成立了" + (interval / 1000/60/24) + "天");}
}
  • 运行程序,查看结果
  • 语句calendar1.set(1949, 9, 1, 8, 0, 0);相当于以下6条语句
calendar1.set(Calendar.YEAR, 1949);
calendar1.set(Calendar.MONTH, 9);
calendar1.set(Calendar.DAY_OF_MONTH, 1);
calendar1.set(Calendar.HOUR, 8);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);

(三)拓展练习

任务1、日期前推和日期后推
  • 当前日期100天前是哪年哪月哪日星期几,当前日期100天后是哪年哪月哪日星期几
任务2、计算你活过的时间
  • 计算你活了多少秒,多少分,多少小时,多少天,要求利用Calendar类来完成任务

2022 学习Java项目课程笔记相关推荐

  1. 2022年Java项目课程目录

    一.2022Java项目课程目录 Java项目课程01:课程概述 Java项目课程02:系统概述 Java项目课程03:涉及知识点 Java项目课程04:需求分析 Java项目课程05:系统设计 Ja ...

  2. Yann Lecun纽约大学《深度学习》2020课程笔记中文版,干货满满!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]Yann Lecun在纽约大学开设的2020春季<深度学习>课 ...

  3. 【CS224n】2斯坦福大学深度学习自然语言处理课程笔记——词向量、词义和神经分类器

    Natural Language Processing with Deep Learning 课程笔记2 1. 词向量和word2vec 2. 优化基础知识 3. 我们能否通过计数更有效地抓住词义的本 ...

  4. 收藏 | Yann Lecun纽约大学《深度学习》2020课程笔记中文版

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:专知 AI博士笔记系列推荐 周志华<机器学习>手推笔 ...

  5. Java项目课程02:系统概述

    文章目录 一.项目结构思维导图 二.JAVA项目结构截图 三.系统运行效果图 演示登录系统之后的操作 (一)登录窗口 (二)注册窗口 (三)主窗口 (四)[系统设置]功能模块 1.设置学校信息 2.设 ...

  6. 大数据学习——Java项目实战-吃货联盟订餐系统

    吃货联盟订餐系统 项目需求 项目环境准备 项目覆盖技能点 阶段划分 难点分析 使用数组对象保存订单信息 访问订单信息 删除订单信息 计算订单的总金额 项目实现思路 数据初始化 实现菜单切换 实现查看餐 ...

  7. java樱花_初步学习java专业课程

    初步学习java编程一. 终于触碰到专业课了(有点小兴奋) 计算机语言:人类与计算机交流的语言! 特点:简洁.准确. 计算机语言分为1.二进制语言2.汇编语言3.C/C++{Java之父   Jame ...

  8. Java项目:课程在线学习与测试系统(java+SSM+redis+Bootstrap+Tomcat+mysql)

    源码获取:博客首页 "资源" 里下载! 基于B/S架构的课程在线学习与测试系统 启动说明 项目为maven管理,最近集成了redis,所以在运行项目是先要下载redis并启动客户端 ...

  9. 重磅!李沐「动手学深度学习」中文课程笔记来了!

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 机器之心报道 markdown笔记与原课程视频一一对应,Jupyter代码均有详细中文注释,这份学习笔记值得收藏. 亚马逊资深首席科 ...

最新文章

  1. spfa(还不懂--)
  2. stella forum v 2.0 的两款主题样式
  3. 图像对象paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决...
  4. 满二叉树各种节点数目的计算
  5. Eureka简介与Eureka Server上
  6. POJ - 3635 Full Tank?(bfs)
  7. python爬贴吧回复内容_Python 基础语法+简单地爬取百度贴吧内容
  8. HDFS SnapShot原理
  9. S5PV210裸机之SD卡
  10. android factory,“工厂映像”(factory image)是什么?你所不知道的Android问题
  11. tomcat集群的failover机制
  12. MacBook telnet安装
  13. repo/git提交代码
  14. mysql如何源码安装_MySQL源码安装
  15. 一文看懂张小龙 2018 微信公开课演讲
  16. 2019年博客之星评选活动之晋级TOP20博主名单
  17. djyvp计算机电缆参数,DJYVP计算机电缆2x2x1.5型号规格含义
  18. 吉他指弹入门——日式指弹的pm技巧
  19. 黎曼 zeta 函数与黎曼猜想
  20. 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)

热门文章

  1. React 对组件props限制 ( prop-types 依赖)
  2. 前端工程师需要掌握哪些知识?
  3. 生活片段(3)我所见过的母亲2
  4. 2014年1月微软MVP申请开始了!
  5. rosdep init 错误解决终极方法(药到病除)
  6. TCP 为什么三次握手而不是两次握手(正解版)
  7. 智慧出行/spark Streaming-Dstream流优化:1.消费并行度,2.序列化,3.限流,压背,冷启4.cpu空转时间,5.不要在代码中判断这个表是否存在,6.推测执行7.开启动态资源分配
  8. 手写模拟器-将文档文字改成拟人手写字
  9. 如何使用loadrunner录制脚本
  10. 这么多年终于可以在2月14号过一回节了