常用API就是要学习一些常用的类和类中的方法
特点:方法多,概念少,就和背单词一样。
java.lang.Object是java语言中的根类, 祖宗类。所有的类都直接或间接的继承自Object。
在对象实例化的时候,最终找到的父类就是Object。
判断相等:
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 10;
Student s1 = new Student("柳岩",37);
Student s2 = new Student("柳岩",37);
/*
==号:
判断基本数据类型时判断的是值是否相等
判断引用数据类型是判断的是地址值是否相等
*/
System.out.println(a == b); //true
System.out.println(s1 == s2); //false
/*
Object类中有一个equals()方法,作用是判断两个对象是否相同
*/
//按住键盘的ctrl+鼠标左键可以查看底层源代码
System.out.println(s1.equals(s2)); //false
}
}
查看Object中equals的源码:
public boolean equals(Object obj) {
return (this == obj);
}
idea重写equals()方法:
因为父类的equals()方法没有实际意义,所以在子类中需要自己重写equals方法,只不过也不需要我们自己写,idea是可以帮我们生成的。
重写的equals()方法是判断成员变量
//重写方法
//alt + insert
//生成的是两个方法,但是后面那个hashCode()我们现在不用所以可以删掉
@Override
public boolean equals(Object o) {
//比如说再测试类中 s1.equals(s2) this就是s1 o就是s2
//如果两个对象的地址值是相同的,那么说明姓名年龄肯定相同,直接返回true
if (this == o) {
return true;
}
//getClass()的意思是获取对象的实际类型
//判断o是空 或者 两个对象不是同种类型,就直接返回false
if (o == null || this.getClass() != o.getClass()) {
return false;
}
//向下转型
//Object是父类 Student是子类
//使用o不能调用子类的特有方法和属性,所以需要向下转型
Student student = (Student) o;
//判断两个对象的年龄是否相同 并且 两个对象的姓名是否相同
return age== student.age &&
//Objects是什么鬼?一会单独讲解
Objects.equals(name, student.name);
}
输出语句和toString()的关系:
在输出对象的时候,会自动调用对象的toString()方法
查看源码:
public String toString() {
//获取类全名 + @ + 哈希值的十六进制(地址值)
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
使用idea完成方法重写:
Object类中的toString()方法打印的效果没有什么意义
我们可以在子类中重写toString()方法,用来打印类型和成员变量值
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
Objects的equals()方法:
作用:
判断两个对象是否相同。
优点:
可以避免空指针异常。
代码演示:
public class Demo_Objects {
public static void main(String[] args) {
//这个equals()是一个静态方法,所以可以使用类名直接调用
//参数可以传入两个对象,可以判断两个对象是否相同
//这个方法的优点是:可以避免空指针异常
String s1 = null;
String s2 = "柳演";
System.out.println(Objects.equals(s1,s2));//false
System.out.println(s1.equals(s2)); //报错!
}
}
虽然这个方法比较好,但是这个功能挺鸡肋的,我们自己在写代码时候也不需要用。
native可以用来修饰方法,被native修饰的方法叫做本地方法。
这些方法由于调用非java的代码,所以在java中无法显示。
也就是说,native的方法是无法查看源码的。
我们自己写代码是一定不会用这个东西的,学他是告诉你在底层是如果看到了这个关键字,表示没有源码。
public native int hashCode();
概述:
java.util.Date表示日期类。可以精确的表示某一个时刻,用毫秒为单位。
构造方法:
方法 | 说明 |
---|---|
public Date() | 将当前的系统时间,转换成Date对象 |
public Date(long date) | 将指定参数的毫秒值date,转换成Date对象 |
标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)
示例代码:
public class DemoDate的构造方法 {
public static void main(String[] args) {
//public Date()
//将当前的系统时间,转换成Date对象
Date d = new Date();
System.out.println(d); //Tue May 05 10:36:30 CST 2020
//public Date(long date)
//将指定参数的毫秒值date,转换成Date对象
//1秒钟
Date d2 = new Date(1000);
System.out.println(d2); //Thu Jan 01 08:00:01 CST 1970
}
}
常用方法:
方法 | 说明 |
---|---|
getTime() | 获取时间对象的毫秒值 |
setTime(long time) | 设置时间对象的毫秒值 |
before(Date date) | 判断当前对象是否在参数时间之前 |
after(Date date) | 判断当前对象是否在参数时间之后 |
public class DemeDate常用方法 {
public static void main(String[] args) {
//getTime()
//获取时间对象的毫秒值
Date d = new Date(1000*60);
System.out.println(d);
System.out.println(d.getTime());
//对象时间距离1970年1月1日8点0分0秒的时间差值 60000
Date d2 = new Date();
System.out.println(d2.getTime());
//当前时间距离1970年1月1日8点0分0秒的时间差值 1588646585598
//setTime(long time)
//设置时间对象的毫秒值
Date d3 = new Date();
System.out.println(d3); //Tue May 05 10:44:20 CST 2020
d3.setTime(1000*60*60);
System.out.println(d3); //Thu Jan 01 09:00:00 CST 1970
//before(Date date)
//判断当前对象是否在参数时间之前
System.out.println(d3.before(d2));
//d3表示的是1970年 d2表示的是2020年 true
//after(Date date)
//判断当前对象是否在参数时间之后
System.out.println(d3.after(d));
//d3是1970年Jan 01 09:00:00 d是1970年1月1日8点1分0秒 true
}
}
概述:
DateFormat是一个抽象类。这个类的功能是对日期格式进行改变,还可以对String字符串类型和Date日期类型做互相转换。
DateFormat常用方法:
方法 | 说明 |
---|---|
String format(Date date) | 格式化:按照指定的格式,把Date对象转换为String对象 |
Date parse(String s) | 解析:按照指定的格式,把String对象转换为Date对象 |
方法 | 说明 |
---|---|
public SimpleDateFormat(String pattern) | 创建时间格式化对象,传入时间模式 |
示例代码:
格式化:
public class Demo格式化 {
public static void main(String[] args) {
//public SimpleDateFormat(String pattern)
//创建时间格式化对象,传入时间模式
//模式就是你要的日期格式
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//String format(Date date)
//格式化:按照指定的格式,把Date对象转换为String对象
Date d = new Date();
String s = sdf.format(d);
System.out.println(s);
}
}
解析:
public class Demo解析 {
public static void main(String[] args) throws ParseException {
String s = "1999年09月09日";
//创建对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//解析
//这个方法会出现红色波浪线,把光标放上去按alt+enter再enter
Date date = sdf.parse(s);
System.out.println(date);
//ParseException字符串和写的模式不一样,就会报错
}
}
/*
键盘输入一个日期:2008年08月08日
需求:变成"2008/08/08"的格式
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Demo练习一 {
public static void main(String[] args) throws ParseException {
/*
键盘输入一个日期:2008年08月08日
需求:变成"2008/08/08"的格式
*/
//1.键盘输入字符串表示时间
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个日期:格式(2008年08月08日)");
String s = sc.nextLine();
//2.先把字符串转成日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse(s);
//3.再把日期转成另一个字符串
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
String s2 = sdf2.format(date);
System.out.println(s2);
}
}
/*
键盘输入一个字符串类型的时间,打印来到世界多少天。
比如:
请输入你的出生时间:
1999-01-01
你来到这个世界已经8888天了
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Demo练习二 {
public static void main(String[] args) throws ParseException {
/*
键盘输入一个字符串类型的时间,打印来到世界多少天。
比如:
请输入你的出生时间:
1999-01-01
你来到这个世界已经8888天了
*/
//1.键盘输入一个时间代表生日String
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的出生年月日:(1999年01月01日)");
String s = sc.nextLine();
//2.获取现在时间Date
Date d = new Date();
//3.把生日的String-->Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date d2 = sdf.parse(s);
//4.获取Date的毫秒值
long nowTime = d.getTime();
long birthdayTime = d2.getTime();
//5.做计算
System.out.println("你已经活了" +((nowTime-birthdayTime)/1000/60/60/24) + "天");
}
}
概述:
Calendar把和时间相关的值都变成了字段,可以更加方便的对各种值进行单独的操作。
比如:前面只有毫秒的概念,所以如果要表示一个小时需要:1000乘60乘60
在日历类中想要表示一个小时,可以直接 小时 1
创建对象:
直接创建子类GregorianCalendar
GregorianCalendar gc = new GregorianCalendar();
在抽象类中,提供了一个今天方法也能返回子类对象
Calendar c = Calendar.getInstance();
常用方法:
方法 | 说明 |
---|---|
int get(int field) | 获取某个字段的值 |
void set(int field,int value) | 设置某个字段的值 |
void add(int field,int amount) | 偏移某个字段的值(加减) |
setTime(Date date) | 把Date对象转成Calendar对象 |
可以使用Calender中定义的常量来表示:
Calendar.YEAR : 年
Calendar.MONTH :月
Calendar.DAY_OF_MONTH:日期
Calendar.HOUR:小时
Calendar.MINUTE:分钟
Calendar.SECOND:秒
Calendar.DAY_OF_WEEK:星期
示例代码:
get方法演示
public class Demo日历的方法 {
public static void main(String[] args) {
//获取对象
//也是代表当前系统时间
Calendar c = Calendar.getInstance();
//int get(int field)
//获取某个字段的值
//获取年
int year = c.get(Calendar.YEAR);
System.out.println(year);
//获取月!!!在日历对象内部,保存月份用的是0-11,也就是说如果是1月保存的是0,如果是12月保存的是11
int month = c.get(Calendar.MONTH);
System.out.println(month);
//获取日期
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
//获取小时
int hour = c.get(Calendar.HOUR_OF_DAY);
System.out.println(hour);
//获取分钟
int minute = c.get(Calendar.MINUTE);
System.out.println(minute);
//获取秒
int second = c.get(Calendar.SECOND);
System.out.println(second);
//获取星期!!!日历类里面保存星期是以星期日作为一周的第1天,星期一就是第2天
int week = c.get(Calendar.DAY_OF_WEEK);
System.out.println(week);
//接下来说一个小问题
//public final static int YEAR = 1;
//在这里1不是生活中年份的意思,java之不过是用1来代表"年"这个字
}
}
对于月份和星期的特殊处理
public class Demo月份和星期的处理 {
public static void main(String[] args) {
//获取对象
Calendar c = Calendar.getInstance();
//获取月份
//只要在输出的时候+1就可以了
int month = c.get(Calendar.MONTH);
System.out.println(month+1 +"月");
//定义数组
String[] arr = {
" ","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
//获取星期
int i = c.get(Calendar.DAY_OF_WEEK); // 1-7
//返回的结果是3,从数组中获取索引为3的元素就是星期二
System.out.println(arr[i]);
}
}
set()和add()方法演示
public class Demo02日历的方法 {
public static void main(String[] args) {
//获取对象
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH)+1)+"月" + c.get(Calendar.DAY_OF_MONTH) + "日");
//void set(int field,int value)
//设置某个字段的值
//把年设置成2000年
c.set(Calendar.YEAR,2000);
//把月设置成10月
c.set(Calendar.MONTH,9);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH)+1)+"月" + c.get(Calendar.DAY_OF_MONTH) + "日");
//void add(int field,int amount)
//偏移某个字段的值(加减)
//在当前值的基础上做加减操作
//让年加10
c.add(Calendar.YEAR,10);
//让日减6
c.add(Calendar.DAY_OF_MONTH,-6);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH)+1)+"月" + c.get(Calendar.DAY_OF_MONTH) + "日");
}
}
setTime(Date date)方法演示
public class Demo03日历的方法 {
public static void main(String[] args) {
//setTime(Date date)
//把Date对象转成Calendar对象
Date d = new Date(1000);
System.out.println(d);
//把Date的时间赋值给Calendar
Calendar c = Calendar.getInstance();
c.setTime(d);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH)+1)+"月" + c.get(Calendar.DAY_OF_MONTH) + "日");
//这个方法不是讲义中要讲的,只是我发现经常有人用。
//其实在类中海油很多很多方法我没有讲,我们也讲不完。。。
//在以后你可能见到我们没有讲的方法,自己查方法的作用
}
}
效果:
1970年1月1日
概述:
Math表示数学,和数学相关的一些计算的方法在这个类中。
Math是一个工具类。
【工具类】的意思就是说,这个类的所有成员都是静态的,不需要创建对象可以使用类名直接访问。
常用方法:
方法 | 说明 |
---|---|
static int abs(int a) | 获取绝对值 |
static double ceil(double a) | 向上取整 |
static double floor(double a) | 向下取整 |
static double pow(double a, double b) | 获取a的b次方 |
static long round(double a) | 四舍五入 |
public class Demo_Math {
public static void main(String[] args) {
//static int abs(int a)
//获取绝对值
System.out.println(Math.abs(3)); //3
System.out.println(Math.abs(-4)); //4
//static double ceil(double a)
//向上取整
System.out.println(Math.ceil(3.14)); //4.0
//static double floor(double a)
//向下取整
System.out.println(Math.floor(9.99)); //9.0
//static double pow(double a, double b)
//获取a的b次方
System.out.println(Math.pow(2,3)); //8.0
//static long round(double a)
//四舍五入
System.out.println(Math.round(4.45)); //4
System.out.println(Math.round(4.5)); // 5
}
}
概述:
System也是一个工具类。
和系统相关的一些方法放在System类里。
常用方法:
方法 | 说明 |
---|---|
static void exit(int status) | 退出虚拟机,0表示正常退出 |
static long currentTimeMillis() | 获取当前时间的毫秒值 |
static void arrayCopy() | 数组中元素的复制 |
示例代码:
public class Demo_System {
public static void main(String[] args) {
//static void exit(int status)
//退出虚拟机,0表示正常退出
System.out.println(1);
System.out.println(2);
//System.exit(0);
System.out.println(3);
//static long currentTimeMillis()
//获取当前时间的毫秒值
long time = System.currentTimeMillis();
System.out.println(time);
Date d = new Date();
long time2 = d.getTime();
System.out.println(time2);
//static void arraycopy()
//数组中元素的复制
int[] arr = {
11,22,33,44,55,66};
int[] brr = new int[6];
/*
Object src 原数组
int srcPos 原数组开始索引
Object dest 目标数组
int destPos 目标数组开始索引
int length 复制的个数
*/
System.arraycopy(arr,1,brr,0,3);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
for (int i = 0; i < brr.length; i++) {
System.out.print(brr[i] + " ");
}
System.out.println();
int[] crr = {
11,22,33,44,55};
System.arraycopy(crr,2,crr,0,3);
for (int i = 0; i < crr.length; i++) {
System.out.print(crr[i] + " ");
}
}
}
Object
equals()【重要,需要理解】
因为Object类中的equals()判断的是两个对象的地址值,没有意义,所以要重写
重写之后判断两个对象的类型和成员变量
toString()【重要,需要理解】
因为Object类的toString()方法返回地址值的字符串,没有意义,所以要重写
重写之后返回的是成员变量值组成的字符串
Objects
equals()
在判断两个对象相同时,避免了空指针异常,但是我们也懒得用[作用有点鸡肋]
native
如果在底层看到了native表示这个方法无法查看源码
Date
构造方法:
new Date():【记】
new Date(long time):
常用方法:
setTime(long time):【记】
getTime():【记】
before(Date date):
after(Date date):
SimpleDateFormat
只有在需要把【字符串】转成【日期】或者【日期】转成【字符串】的时候使用
创建对象:
SimpleDateFormat sdf = new SimpleDateFormat("匹配模式yyyy MM dd");
常用方法:
format(Date date):【记】
parse(String s):【记】
Calendar
创建对象:
Calendar.newInstance();
常用方法:
get(int field):【记】
set(int field,int value):【记】
add(int field,int value):【记】
setTime(Date date):
Math:
abs(int i):
ceil(double a):
floor(double a):
round(double a):【记】
pow(int a,int b):
System:
exit(int i) :【记】
currentTimeMilles():【记】
arraycopy(Object src,int soff,Object dest,int doff,int len):【记】