应用程序接口(英语:Application Programming Interface,简称:API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。
API主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。
1、Math类概述
2、Math中方法的调用方式
3、Math类的常用方法
| 方法名 方法名 | 说明 |
|---|---|
| public static int abs(int a) | 返回参数的绝对值 |
| public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
| public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
| public static int round(float a) | 按照四舍五入返回最接近参数的int |
| public static int max(int a,int b) | 返回两个int值中的较大值 |
| public static int min(int a,int b) | 返回两个int值中的较小值 |
| public static double pow (double a,double b) | 返回a的b次幂的值 |
| public static double random() | 返回值为double的正值,[0.0,1.0) |
实例:
package com.com.object_11.MathTest_01;
//Math类常用方法
public class MathDemo {
public static void main(String[] args) {
//public static int abs(int a)返回参数的绝对值
System.out.println(Math.abs(66)); //66
System.out.println(Math.abs(-66)); //66
System.out.println("---------------");
// public static double ceil(double a)返回大于或等于参数的最小double值,等于一个整数
System.out.println(Math.ceil(6.18)); //7.0
System.out.println(Math.ceil(6.65)); //7.0
System.out.println("---------------");
// public static double floor(double a)返回小于或等于参数的最大double值,等于一个整数
System.out.println(Math.floor(6.18)); //6.0
System.out.println(Math.floor(6.65)); //6.0
System.out.println("---------------");
// public static int round(float a)按照四舍五入返回最接近参数的int
System.out.println(Math.round(6.18)); //6
System.out.println(Math.round(6.65)); //7
System.out.println("---------------");
// public static int max(int a,int b)返回两个int值中的较大值
System.out.println(Math.max(6,9)); //9
System.out.println("---------------");
// public static int min(int a,int b)返回两个int值中的较小值
System.out.println(Math.min(6,9)); //6
System.out.println("---------------");
// public static double pow (double a,double b)返回a的b次幂的值
System.out.println(Math.pow(2,7)); // 128 2^7
System.out.println("---------------");
// public static double random()返回值为double的正值,[0.0,1.0)
System.out.println(Math.random()); //0.14007993398889917 [0.0,1.0)随机取不到1
System.out.println(Math.random()*100); //55.15963738381813 [0.0,100.0)随机取不到100
System.out.println((int)(Math.random()*100)); //7 强制转化为int型 0-99随机
System.out.println((int)(Math.random()*100)+1); //27 强制转化为int型 加一后0-100随机
}
}
System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作。System类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象。System类中的都是static方法,类名访问即可。
| 方法名 | 说明 |
|---|---|
| public static void exit(int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 |
| public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值 |
package com.com.object_11.APITest_01;
public class SystemDemo {
public static void main(String[] args) {
// System.out.println("开始");
public static void exit(int status):终止当前运行的Java虚拟机,非零表示异常终止
// System.exit(0); //原本应该输出 “开始 结束”,exit将其终止,所以只会输出“开始”
// System.out.println("结束");
// public static long currentTimeMillis():返回当前时间(以毫秒为单位)
// 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值
System.out.println(System.currentTimeMillis()); // 2022/6028 17:48 1656409731638
System.out.println(System.currentTimeMillis() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");
// 换算过来是52.524408030124306年 1000ms = 1 s
}
}
public class SystemDemo {
public static void main(String[] args) {
// 获取开始的时间节点
long start = System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) {
System.out.println(i);
}
// 获取代码运行结束后的时间节点
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
}
Object类概述
查看方法源码的方式
重写toString方法的方式
toString方法的作用:
示例代码:
package com.com.object_11.APITest_01;
//定义Student类
public class ObjectStudent extends Object {
//因为测试类使用了Object类的toString方法,所以相当于继承了Object
// 有4个属性:
private String name;
private int age;
private String school;
private String major;
// 空参构造
public ObjectStudent(){}
// 有参构造
public ObjectStudent(String name,int age){
this.name = name;
this.age = age;
}
public ObjectStudent(String name,int age,String school){
this.name = name;
this.age = age;
this.school = school;
}
public ObjectStudent(String name,int age,String school,String major){
this.name = name;
this.age = age;
this.school = school;
this.major = major;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
//打印
public void show(){
System.out.println("学生"+name+"年龄"+age+"岁,就读于"+school+major+"专业");
}
@Override //toString方法重写Alt+Insert,toString方法
public String toString() {
return "ObjectStudent{" +
"name='" + name + '\'' +
", age=" + age +
", school='" + school + '\'' +
", major='" + major + '\'' +
'}';
}
}
package com.com.object_11.APITest_01;
public class ObjectDemo {
public static void main(String[] args) {
ObjectStudent s = new ObjectStudent();
s.setName("李小狼");
s.setAge(10);
s.setSchool("友枝中学");
s.setMajor("魔法专业");
System.out.println(s); //com.com.object_11.APITest_01.ObjectStudent@6bdf28bb
System.out.println(s.toString()); //com.com.object_11.APITest_01.ObjectStudent@6bdf28bb
// ObjectStudent{name='李小狼', age=10, school='友枝中学', major='魔法专业'}
// ObjectStudent{name='李小狼', age=10, school='友枝中学', major='魔法专业'}
/* public void println(Object x) {
String s = String.valueOf(x);
synchronized(this) {
this.print(s);
this.newLine();
}
}
*/
/* public static String valueOf(Object obj) {
return obj == null ? "null" : obj.toString();
}*/
/* public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}*/
}
}
ObjectStudent{name='李小狼', age=10, school='友枝中学', major='魔法专业'}
ObjectStudent{name='李小狼', age=10, school='友枝中学', major='魔法专业'}
equals方法的作用
重写equals方法的场景
重写equals方法的方式
示例代码:
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
//this -- s1
//o -- s2
比较地址是否相同,如果相同,直接返回true
if (this == o) return true;
```java
//判断参数是否为null
//判断两个对象是否来自于同一个类
if (o == null || getClass() != o.getClass()) return false;
// 向下转型
Student student = (Student) o; //student -- s2
//比较年龄是否相等
if (age != student.age) return false;
//比较姓名是否相等
return name != null ? name.equals(student.name) : student.name == null;
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
Student s2 = new Student();
s2.setName("林青霞");
s2.setAge(30);
//需求:比较两个对象的内容是否相同
System.out.println(s1.equals(s2));
}
}
/*
冒泡排序:
一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,
依次对所有的数据进行操作,直至所有数据按要求完成排序
*/
public class ArrayDemo {
public static void main(String[] args) {
//定义一个数组
int[] arr = {24, 69, 80, 57, 13};
System.out.println("排序前:" + arrayToString(arr));
// 这里减1,是控制每轮比较的次数
for (int x = 0; x < arr.length - 1; x++) {
// -1是为了避免索引越界,-x是为了调高比较效率
for (int i = 0; i < arr.length - 1 - x; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
System.out.println("排序后:" + arrayToString(arr));
}
//把数组中的元素按照指定的规则组成一个字符串:[元素1, 元素2, ...]
public static String arrayToString(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]);
} else {
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s = sb.toString();
return s;
}
}
Arrays的常用方法
| 方法名 | 说明 |
|---|---|
| public static String toString(int[] a) | 返回指定数组的内容的字符串表示形式 |
| public static void sort(int[] a) | 按照数字顺序排列指定的数组 |
工具类设计思想
1、构造方法用 private 修饰
为了防止外界创建对象
2、成员用 public static 修饰
为了使用类名来访问该成员方法
package com.com.object_11.APITest_01.Arrays;
import java.util.Arrays;
//public static String toString(int[] a) 返回指定数组的内容的字符串表示形式 |
//public static void sort(int[] a) 按照数字顺序排列指定的数组 |
public class ArraysDemo {
public static void main( String[] args) {
//定义一个数组
int[] arr = {24,69,80,57,13};
System.out.println("排序前:" + Arrays.toString(arr));
//排序前:[24, 69, 80, 57, 13]
Arrays.sort(arr) ;
System.out.println("排序后:" + Arrays.toString(arr));
//排序后:[13, 24, 57, 69, 80]
}
}
Date类概述
Date 代表了一个特定的时间,精确到毫秒
Date类构造方法
| 方法名 | 说明 |
|---|---|
| public Date() | 分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 |
| public Date(long date) | 分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 |
示例代码
package com.com.object_11.APITest_01.Date;
import java.util.Date;
public class DateDemo001 {
public static void main(String[] args) {
// public Date()分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
Date d1 = new Date(); //用的是java.util创建的Date
System.out.println(d1);
//public Date(long date)分配一个 Date对象,
// 并将其初始化为表示从标准基准时间起指定的毫秒数
// 如果给定的毫秒值包含时间信息,则驱动程序将将时间组件设置为对应于零GMT的默认时区(运行应用程序的Java虚拟机的时区)。
//date - 1970年1月1日以来的毫秒数,00:00:00 GMT不超过8099年的毫秒表示。负数表示1970年1月1日00:00:00 GMT之前的毫秒数。
long date = 1000*60*60; //小时,所以是整时,1970年1月1日1:00,带时区
Date d2 = new Date(date);
System.out.println(d2);
}
}
//Wed Jun 29 09:35:17 CST 2022
//Thu Jan 01 09:00:00 CST 1970

常用方法
| 方法名 | 说明 |
|---|---|
| public long getTime() | 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 |
| public void setTime(long time) | 设置时间,给的是毫秒值 |
public void setTime(long time) 如果给定的毫秒值包含时间信息,则驱动程序将将时间组件设置为对应于零GMT的默认时区(运行应用程序的Java虚拟机的时区)。
date - 1970年1月1日以来的毫秒数,00:00:00 GMT不超过8099年的毫秒表示。负数表示1970年1月1日00:00:00 GMT之前的毫秒数。
package com.com.object_11.APITest_01.Date;
import java.util.Date;
public class DateDemo002 {
public static void main(String[] args) {
//创建日期对象
Date d = new Date();
//public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
System.out.println(d.getTime());
System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");
//1656469559780
//52.5263051680619年
// public void setTime(long time); 设置时间,给的是毫秒值
// long time = 1000 * 60 * 60;
long time = System.currentTimeMillis();
d.setTime(time);
System.out.println(d);
// Wed Jun 29 10:21:40 CST 2022
}
}
SimpleDateFormat类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。
我们重点学习日期格式化和解析
SimpleDateFormat类构造方法
| 方法名 | 说明 |
|---|---|
| public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认模式和日期格式 |
| public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 |
SimpleDateFormat类的常用方法
代码
package com.com.object_11.APITest_01.Date;
//有毒毒
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*SimpleDateFormat类构造方法
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期格式
- SimpleDateFormat类的常用方法
- 格式化(从Date到String)
- public final String format(Date date):将日期格式化成日期/时间字符串
- 解析(从String到Date)
- public Date parse(String source):从给定字符串的开始解析文本以生成日期*/
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
// 格式化(从Date到String)
// 无参构造创建对象
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(); //无参构造
//创造方法 sdf.format(d);然后Ctrl+Alt+v自动生成
String s = sdf.format(d);
// 输出这个字符串
System.out.println(s);
//2022/6/29 上午11:03 (默认的模式)
System.out.println("-----------");
//格式化(从Date到String)
// 无参构造创建对象
Date d1 = new Date();
// SimpleDateFormat sdf = new SimpleDateFormat();
// 去掉无参构造,自己写
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //年月日时分秒
//创造方法 sdf.format(d1);然后Ctrl+Alt+v自动生成
String s1 = sdf.format(d1);
// 输出这个字符串
System.out.println(s1);
// (默认的模式)
System.out.println("-----------");
// (从String到Date)
String ss = "2025-06-29 11:20:00";
//ParseException 报错,解析异常
// SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(ss);
System.out.println(dd);
}
}
案例需求
定义一个日期工具类(DateUtils),包含两个方法:把日期转换为指定格式的字符串;把字符串解析为指定格式的日期,然后定义一个测试类(DateDemo),测试日期工具类的方法
代码实现
package com.com.object_11.APITest_01.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
// 构造方法私有(外界无法创建对象)
private DateUtils() {
}
// 成员方法静态(将来通过类名来调用)
// 把日期转换为指定格式的字符串
// 返回值类型:String
//参数:Date date,String format
public static String dataToString(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String s = sdf.format(date);
return s;
}
/*把字符串解析为指定格式的日期
返回值类型:Date
参数:string s, String format*/
public static Date stringToDate(String s, String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d = sdf.parse(s);
return d;
}
}
package com.com.object_11.APITest_01.Date;
import java.text.ParseException;
import java.util.Date;
//测试类
public class DateUtilsDemo {
public static void main(String[] args) throws ParseException {
// 创建日期对象
Date d = new Date();
String s1 = DateUtils.dataToString(d, "yyyy年MM月dd日 HH:mm:ss");
System.out.println(s1);
String s2 = DateUtils.dataToString(d, "yyyy年MM月dd日");
System.out.println(s2);
String s3 = DateUtils.dataToString(d, "HH:mm:ss");
System.out.println(s3);
System.out.println("------------");
String s = "2025-06-29 11:20:00";
Date dd = DateUtils.stringToDate(s, "yyyy-MM-dd HH:mm:ss");
System.out.println(dd);
}
}
Calendar类概述
Calendar 为特定瞬间与一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法
Calendar 提供了一个类方法 getInstance 用于获取这种类型的一般有用的对象。
该方法返回一个Calendar 对象。
其日历字段已使用当前日期和时间初始化:Calendar rightNow = Calendar.getInstance();
Calendar类常用方法
| 方法名 | 说明 |
|---|---|
| public int get(int field) | 返回给定日历字段的值 |
| public abstract void add(int field, int amount) | 根据日历的规则,将指定的时间量添加或减去给定的日历字段 |
| public final void set(int year,int month,int date) | 设置当前日历的年月日 |
示例代码
public class CalendarDemo {
public static void main(String[] args) {
//获取日历类对象
Calendar c = Calendar.getInstance();
//public int get(int field):返回给定日历字段的值
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; //因为月份是从0开始,所以计算第几月要+1
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//public abstract void add(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
//需求1:3年前的今天
// c.add(Calendar.YEAR,-3);
// year = c.get(Calendar.YEAR);
// month = c.get(Calendar.MONTH) + 1;
// date = c.get(Calendar.DATE);
// System.out.println(year + "年" + month + "月" + date + "日");
//需求2:10年后的10天前
// c.add(Calendar.YEAR,10);
// c.add(Calendar.DATE,-10);
// year = c.get(Calendar.YEAR);
// month = c.get(Calendar.MONTH) + 1;
// date = c.get(Calendar.DATE);
// System.out.println(year + "年" + month + "月" + date + "日");
//public final void set(int year,int month,int date):设置当前日历的年月日
c.set(2050,10,10);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
}
}
案例需求
获取任意一年的二月有多少天
代码实现
public class CalendarTest {
public static void main(String[] args) {
//键盘录入任意的年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年:");
int year = sc.nextInt();
//设置日历对象的年、月、日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1);
//3月1日往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);
//获取这一天输出即可
int date = c.get(Calendar.DATE);
System.out.println(year + "年的2月份有" + date + "天");
}
}
异常的概述
异常就是程序出现了不正常的情况
异常的体系结构

如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行
定义格式
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
执行流程
示例代码
public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) {
// System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
e.printStackTrace();
}
}
}
常用方法
| 方法名 | 说明 |
|---|---|
| public String getMessage() | 返回此 throwable 的详细消息字符串 |
| public String toString() | 返回此可抛出的简短描述 |
| public void printStackTrace() | 把异常的错误信息输出在控制台 |
示例代码
public class ExceptionDemo02 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
// e.printStackTrace();
//public String getMessage():返回此 throwable 的详细消息字符串
// System.out.println(e.getMessage());
//Index 3 out of bounds for length 3
//public String toString():返回此可抛出的简短描述
// System.out.println(e.toString());
//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//public void printStackTrace():把异常的错误信息输出在控制台
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
// at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)
}
}
}
编译时异常
运行时异常
定义格式
public void 方法() throws 异常类名 {
}
示例代码
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
// method();
try {
method2();
}catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
//编译时异常
public static void method2() throws ParseException {
String s = "2048-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
注意事项

throws
用在方法声明后面,跟的是异常类名
表示抛出异常,由该方法的调用者来处理
表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
表示抛出异常,由方法体内的语句处理
执行throw一定抛出了某种异常
如果 Java 提供的内置异常类型不能满足程序设计的需求,这时我们可以自己设计 Java 类库或框架,其中包括异常类型。实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。
自定义异常的语法形式为:
<自定义异常名>
在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
例如,以下代码创建一个名称为 IntegerRangeException 的自定义异常类:
class IntegerRangeException extends Exception {
public IntegerRangeException() {
super();
}
public IntegerRangeException(String s) {
super(s);
}
}
以上代码创建的自定义异常类 IntegerRangeException 类继承自 Exception 类,在该类中包含两个构造方法。
自定义异常类
public class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message) {
super(message);
}
}
老师类
public class Teacher {
public void checkScore(int score) throws ScoreException {
if(score<0 || score>100) {
// throw new ScoreException();
throw new ScoreException("你给的分数有误,分数应该在0-100之间");
} else {
System.out.println("成绩正常");
}
}
}
测试类
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
int score = sc.nextInt();
Teacher t = new Teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}