Object类
Object类是所有类的父类,如果一个类没有指定父类,那么则默认继承自Object类
最常用的两个方法
toString方法:
public static void main(String[] args) {
//Person类默认继承Object类,所以可以使用其中toString的方法
Person person = new Person("张三",18);
String s = person.toString();
//打印对象的名字,其实就是调用对象的toString()方法,即System.out.println(person); == System.out.println(person.toString);
System.out.println(s);
//未重写toString方法,打印出来的是:Demo03.Person@1540e19d,地址值
//重写toString方法后,打印出来的就是下方toString中的值
}
//在Person类中,重写toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/*看一个类是否重写了toString方法,直接打印这个类对应的对象名字就可以
如果没有重写toString方法,那么打印的就是地址值,如果有重写那么打印就按照重写的方式打印*/
equal方法:
public static void main(String[] args) {
Person p1 = new Person("迪丽热巴",18);
Person p2 = new Person("古力娜扎",20);
Person p3 = new Person("迪丽热巴",18);
//p1 = p2; 当存在该语句是,p1,p2就相等
System.out.println(p1.equals(p2)); //false
System.out.println(p1.equals(p3)); //false
//对于引用类型,比较的是地址值而不是内容的值,所以都是false,每一个对象都是new了一个新的对象,所以存储的地址不同
}
//由于Object类的equal方法默认的是比较两个对象的地址值而不是内容的属性值,所以需要重写equal方法,比较不同的属性值是否相同
//Person类中重写equal方法,自己重写的euqal方法
@Override
public boolean equals(Object obj) {
if (obj == this){
return true;
}
if (obj == null){
return false;
} else if (obj instanceof Person){
Person p = (Person)obj;
boolean b = this.name.equals(p.name) && this.age == age;
return b;
}else{
return false;
}
}
//系统的equal方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
Object中的equals方法和Objects中equals方法的区别:
String a = "abc";
String b = "aaa";
System.out.println( a.equals(b) ); //false
//Object中的equals方法,对于非空的值基本对象没有什么问题,但是一旦a或者b中,有一个的值为null,那么就会报错
Objects.equals(a,b);
//而对于Objects中的equals方法,则不会去关注值是否为零
Date类
类 Date
表示特定的瞬间,精确到毫秒。
毫秒:千分之一秒,一千毫秒等于一秒
毫秒值的作用,可以对时间和日期进行计算
时间原点(0毫秒): 1970 年 1 月 1 日 00:00:00 (英国格林威治)
将日期转换为毫秒,其实就是计算日期相对于时间原点有多少毫秒:
System.out.println(System.currentTimeMillis()); //获取当前系统时间的毫秒值
毫秒转换为日期:
1 天 = 24 × 60 × 60 = 86400 秒 = 86400000 毫秒
注意:中国俗语东八区,会把时间增加8个小时,中国:1970 年 1 月 1 日 00:08:00
Data类的构造方法和成员方法:
Date date = new Date(); //Date的空参数构造方法,就是获取当前系统的日期和时间
System.out.println(date); //Sat Nov 09 17:02:29 CST 2019
Date date1 = new Date(1000L); //Date(long date),带参数的构造方法,返回的是从1970 年 1 月 1 日 00:00:00开始,经过long date毫秒后的时间
System.out.println(date1); //Thu Jan 01 08:00:01 CST 1970
Date date3 = new Date(); //Date的成员方法
System.out.println(date3.getTime());
//long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
//和System.out.println(System.currentTimeMillis());一模一样
DateFormat类
DateFormat,是日期/时间格式化子类的抽象类,不能直接使用
要用他的子类:SimpleDateFormat(SimpleDateFormat extends DateFormat)
因为返回的是一个字符串类型的数据,所以属于text:java.text.DateFormat
格式化:按照指定的格式,从Date对象转换为String对象(日期 转 文本)
解析:按照指定的格式,从String对象转换为Date对象(文本 转 日期)
成员方法:
String format(Date date)
将一个 Date 格式化为日期/时间字符串
Date parse(String sourse)
把符合模式的字符串,解析为Date日期
SimpleDateFormat的构造方法:
SimpleDateFormat(String pattern)用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
参数:String pattern,传递的指定的格式
日期和时间模式 结果 "yyyy.MM.dd G 'at' HH:mm:ss z"
2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"
Wed, Jul 4, '01
"h:mm a"
12:08 PM
"hh 'o''clock' a, zzzz"
12 o'clock PM, Pacific Daylight Time
"K:mm a, z"
0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"
02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"
Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"
010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
2001-07-04T12:08:56.235-0700
SimpleDateFormat(String pattern)使用方法:
- 创建SimpleDateFormat对象,构造方法中传递指定的模式
- 调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date格式化为符合模式的字符串
package Demo03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
demo01();
try {
demo02();
} catch (ParseException e) {
e.printStackTrace();
}
}
/*
SimpleDateFormat(String pattern)使用方法:
1. 创建SimpleDateFormat对象,构造方法中传递指定的模式
2. 调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date格式化为符合模式的字符串
*/
private static void demo01() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = new Date();
String text = sdf.format(date);
System.out.println(date); //Sun Nov 10 14:04:26 CST 2019
System.out.println(text); //2019-11-10T14:04:26.863+0800
}
private static void demo02() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = sdf.parse("2019-11-09T17:35:38.288+0800");
System.out.println(date); //Sat Nov 09 17:35:38 CST 2019
}
}
练习
计算一个人已经出生了多少天
- 使用scnner获取出生日期
- 使用DateFormat中的parse方法,把出生日期转换为Date格式
- 把Date格式的出生日期转换为毫秒值
- 获取当前日期的毫秒值
- 使用当前日期的毫秒值减去出生日期的毫秒值
- 把毫秒值转换为天
package Demo03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Birthday {
public static void main(String[] args) throws ParseException {
Date noDate = new Date();
System.out.println("请输入你的出生日期,格式为yyyy-MM-dd:");
Scanner sc = new Scanner(System.in);
String birthDay = sc.next(); //按照指定格式输入出生日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(birthDay); //利用parse方法将字符串格式转换为Date格式
long now = noDate.getTime(); //获取现在时间的毫秒值
long birth = date.getTime(); //获取出生日期的毫秒值
long x = now - birth; //获取两者的差值
long day = x/86400000;
System.out.println("您已出生:"+day+"天!");
}
}
Calendar类
日历类,里面提供了很多操作日历字段的方法,如YEAR、MONTH、DAY_OF_MONTH、HOUR 等
由于Calendar是一个抽象类,无法直接创建对象,里面有一个静态方法叫做getInstance()
,该方法返回了Calendar类的子类对象
static Calendar getInstance()
:使用默认时区和语言环境获得一个日历。
package Demo03;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
System.out.println(c);
}
}
//java.util.GregorianCalendar[time=1573368059979,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=3,DAY_OF_MONTH=10,DAY_OF_YEAR=314,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=40,SECOND=59,MILLISECOND=979,ZONE_OFFSET=28800000,DST_OFFSET=0]
Calendar类常用的成员方法:
int field
:日历类的字段,可以通过静态变量进行获取,例如:Calendar.YEAR
-
int get(int field)
返回给定日历字段的值Calendar c = Calendar.getInstance();//本人运算时间2019/11/10 System.out.println(c.get(Calendar.YEAR));//返回年:2019 System.out.println(c.get(Calendar.MONTH));//返回月:10(月份是从0开始计算) System.out.println(c.get(Calendar.DATE));//返回日:10
-
void set(int field, int value)
将给定的日历字段设置为给定值。Calendar c = Calendar.getInstance();//本人运算时间2019/11/10 c.set(Calendar.YEAR,2018);//将今年设置为2018年 //c.set(1999,12,31);set的重载方法,可以同时设置三个值 System.out.println(c.get(Calendar.YEAR));//输出2018
-
abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。//通过amount的正负来确定是增加还是减少 Calendar c = Calendar.getInstance(); //现在时间为2019/11/10 c.add(Calendar.YEAR,2); //将年加2年 System.out.println(c.get(Calendar.YEAR)); //2021 c.add(Calendar.MONTH,-3); //将月份减3 System.out.println(c.get(Calendar.MONTH)); //7 c.add(Calendar.DATE,6); //天数增加6 System.out.println(c.get(Calendar.DATE)); //16
-
Date getTime()
返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。把日历对象转换为日期对象
Calendar c = Calendar.getInstance(); System.out.println(c.getTime());//Sun Nov 10 15:11:50 CST 2019