Object类
概述
object类是java.lang.object,包下的类,是java语言的根类(最顶层),即所有类的父类。它描述的所有方法子类都可以使用。在实例化对象是最终找到的父类就是object类;
1.object:java.lang.Object
2.类Object是类层次结构的根(最顶层)。每个类都有Object一个超类(父类)。
所有对象(包括数组)都实现此类的方法。
import com.commonClass.Object.toString.Person;
import java.util.Random;
import java.util.Scanner;
import java.util.stream.DoubleStream;
public class Application {
public static void main(String[] args) {
//person类是默认继承Object类的,我们可以使用Object类中的toString方法;
Person person1 = new Person("浩鑫",13);
Person person2 = new Person("Andy",13);
toString()方法
- 作用:打印对象的信息
- 重写前:打印的包名、类名@地址值
package com.commonClass.Object.toString;
import java.util.Random;
import java.util.Scanner;
public class Person {
private String name;
private int age;
public Person() {
}
package com.commonClass;
1.object:java.lang.Object
2.类Object是类层次结构的根(最顶层)。每个类都有Object一个超类(父类)。
所有对象(包括数组)都实现此类的方法。
import com.commonClass.Object.toString.Person;
import java.util.Random;
import java.util.Scanner;
import java.util.stream.DoubleStream;
public class Application {
public static void main(String[] args) {
//person类是默认继承Object类的,我们可以使用Object类中的toString方法;
Person person1 = new Person("浩鑫",13);
Person person2 = new Person("Andy",13);
//调用toString方法
String s1=person1.toString();
String s2=person2.toString();
//直接调用打印对象,事实上就是默认调用了toString方法
System.out.println(s1.toString());//com.commonClass.Object.toString.Person@1b6d3586
System.out.println(s2);//com.commonClass.Object.toString.Person@4554617c
//直接调用toString方法,其实就是打印对象的地址和直接打印对象没有区别
System.out.println(person1);//com.commonClass.Object.toString.Person@1b6d3586
System.out.println(person2);//com.commonClass.Object.toString.Person@4554617c
- 重写后:打印的是对象的属性值
package com.commonClass.Object.toString;
import java.util.Random;
import java.util.Scanner;
public class Person {
private String name;
private int age;
public Person() {
}
//重写toString方法可以使用快捷键:Alt+insert 选中toString 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.commonClass;
1.object:java.lang.Object
2.类Object是类层次结构的根(最顶层)。每个类都有Object一个超类(父类)。
所有对象(包括数组)都实现此类的方法。
import com.commonClass.Object.toString.Person;
import java.util.Random;
import java.util.Scanner;
import java.util.stream.DoubleStream;
public class Application {
public static void main(String[] args) {
//重写了toString方法后再重新输出
System.out.println(person1);//person={name=浩鑫,age=13}
System.out.println(person2);//person={name=Andy,age=13}
看一个类是否重写了toString方法,就直接打印这个类实例化的对象名字
如果没有重写,打印出来的就是对象的地址(默认方法)
如果重写了,那么就是按照重写的方式打印
System.out.println(new Random().ints());//没有重写toString方法
System.out.println(new Scanner(System.in));//重写toString方法
}
}
equals()方法
- 作用:比较两个对象
- 重写前:比较两个对象的地址值
package com.commonClass.Object.equals;
import java.util.Objects;
import java.util.Random;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
package com.commonClass;
1.object:java.lang.Object
2.类Object是类层次结构的根(最顶层)。每个类都有Object一个超类(父类)。
所有对象(包括数组)都实现此类的方法。
import com.commonClass.Object.equals.Person;
import java.util.Random;
public class Application {
public static void main(String[] args) {
/*person类是默认继承Object类的,我们可以使用Object类中的equals方法;
比较两个对象是否相等
object类equals方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
参数:
Object obj: 可以传递任意的对象
方法体:
==:比较运算符,返回的是一个布尔值,不是true 就是 false
基本数据类型:比较的是值
引用数据类型:比较的是地址值
*/
Person person1 = new Person();
Object person2 = new Person();
Random r = new Random();
//通过boolean进行比较,比较的是对象的地址值
boolean tese=(person1==person2);//false
System.out.println(tese);
//通过调用equals方法进行比较
//直接使用对象进行比较,比较的是对象的地址值,要通过方法重写比较两者的属性值
person1=person2;
System.out.println(person1.equals(person2));//true
- 重写方法后:比较的是对象的属性值
package com.commonClass.Object.equals;
import java.util.Objects;
import java.util.Random;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
Object类中的equals方法默认比较的是对象的地址值,没有意义
我们需要重写equals方法,来比较两个对象的属性值
问题:
Object类隐含了一个多态。
多态的弊端:无法使用子类特有的方法和属性
解决方法:使用向下转型(类型的强制转换)
*/
@Override
public boolean equals(Object obj) {
//增加一个判断,当传递进来的参数为this时,直接返回true
if(obj==this){
return true;
}
//增加一个判断,当传递进来的参数为null时,直接返回false
if(obj==null){
return false;
}
//使用instanceof关键字,判断传递进来的参数和本类,是否存在父子类的关系
if(obj instanceof Person){
Person person=(Person)obj;
//使用try-catch,避免当出现当this.name=null是,出现空指针异常
try {
return this.age==person.age && this.name.equals(person.name);
} catch (Exception e) {
//出现空指针异常时,让person.name与null进行比较
return this.age==person.age && person.name==null;
}
}
//当传递进来的参数与本类无父子关系,直接防护false
return false;
}
//可以使用快捷键Alt+insert 添加equalt方法
@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);
}
}
public class Application {
public static void main(String[] args) {
Person person1 = new Person();
Object person2 = new Person();
System.out.println(person1.equals(person2));//false
}
Objects类中的equals()方法
- 作用:比较两个对象,家里一些健壮性的判断
package com.commonClass.Object.Objects;
import java.util.Objects;
public class Test {
//定义一个测试类
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.commonClass;
/*
1.object:java.lang.Object
2.类Object是类层次结构的根(最顶层)。每个类都有Object一个超类(父类)。
所有对象(包括数组)都实现此类的方法。
*/
import com.commonClass.Object.Objects.Test;
import java.util.Objects;
//objects是JDK7添加的一个工具类,里面的方法都为静态方法,我们可以直接调用
public class Application {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
test1.setName(null);
test2.setName("浩鑫");
/*调用方法的对象为null时,使用Object中的equals方法会出现NullPointerException(空指针异常)
//所以,我们可以使用Objects中的equals方法来避免出现异常
//System.out.println(test1.getName().equals(test2.getName()));
1.Objects类中的equals方法是空指针安全的,是允许空指针的
2,源码: public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
3.Objects类中的equals方法是直接传入两个对象进行比较
*/
System.out.println(Objects.equals(test1.getName(), test2.getName()));
}
}
日期时间类
Date类
- java.util.Date 表示特定的瞬间,精确到毫秒。
- 常用的方法有:
- Date() 无参构造方法:获取当前系统的日期和时间
- Date(long date) 有参构造方法:将毫秒值转化为日期
- getTime() 成员方法:将日期转换为毫秒值
package com.commonClass.Date.date;
/*
1.java.util.Date:表示日期与时间
2.该类Date表示特定的时间瞬间,精度为毫秒。
3.1000毫秒=1秒
4.毫秒值的作用:可以对日期和日期进行计算,例如:从2020-1-1到2025-6-24中间一共有多少天、
5.计算时:可以先把日期转换成毫秒,计算完毕后,再毫秒转换为日期
6.毫秒值是一个long类型的值
7.把日期转换为毫秒:当前日期为 2020-6-24
默认的时间原点(0毫秒):1970年1月1日 00;00;00(英国格林威治标准时间)
注意点:中国属于东八区:默认的实际原点要增加8小时 1970年1月1日 08;00;00
8.把毫秒转换为日期:1天=24*60*60=86400秒=86400*1000=86400000L毫秒
*/
import javax.xml.soap.DetailEntry;
import java.util.Date;
public class Demo01 {
public void date1(){
/*
Date类的空构造方法
Date():获取当前系统的日期和时间
*/
System.out.println(new Date());
}
public void date2(){
/*
Date类带参数的构造方法
Date(long date):传递一个毫秒值,把毫秒化为Date日期
*/
System.out.println(new Date(1592982995640L));
}
public void date3(){
/*
Date类的成员方法
long getTime():把日期转换为毫秒值(相当于:System.currntTimeMillis())
*/
System.out.println(new Date().getTime());
}
}
import com.commonClass.Date.date.Demo01;
public class Application {
public static void main(String[] args) {
//System.out.println(System.currentTimeMillis());//获取当前系统的时间到时间原点的毫秒值
//获取当前系统的时间
new Demo01().date1();//Wed Jun 24 14:56:29 GMT+08:00 2020
//将输入的毫秒值转换为日期
new Demo01().date2();//Wed Jun 24 15:16:35 GMT+08:00 2020
//获取当前系统的毫秒值
new Demo01().date3();//1592982875531
}
}
DateFormat类
- java.text.Format. 它是一个抽象类,是日期/时间格式化的子类
- 抽象类不能被实例化,我们需要借助DateFormat的子类:SimpleDateFormat去调用DateFormat中的方法
- 常用的方法有:
- format()方法:将日期(Date对象)格式化为文本(字符串)
- parse()方法:将文本(字符串)解析为日期(Date对象)
SimpleDateFormat类
SimpleDateFormat:java.text.SimpleDateFormat exdents DateFoemat
构造方法:SimpleDateFormat(String pattern):使用给定的模式和默认Format语言环境的默认日期格式符号构造。
参数:String pattern
模式:区分大小写的
y-->年
M-->月
d-->日
H-->时
m-->分
s-->秒
对应的书写模式:"yyyy-MM-dd HH:mm:ss" "yyyy年MM月dd日 HH时mm分ss秒"
注意点:书写的模式中,字母是不能改变的,且区分大小写,连接字母之间的符号是可以改变的
package com.commonClass.Date.dateFormat;
/*
java.text.DateFormat:是日期/时间格式化子类的抽象类
作用:格式化(日期-->文本),解析(文本-->日期)
成员方法:
String format(Date date):把传递进来的Date对象格式化,转换成符合文本规范的字符串
Date parse(String source):把传递进来的字符串解析,转换成Date对象
DateFormat是一个抽象类,无法直接使用new关键字来实例化使用,可以使用DateFormat的子类 SimpleDateFormat
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo01 {
/*
使用DateFormat中的format方法,把日期格式化为文本
使用步骤:
1.实例化SimpleDateFormat,将要实现的文本格式传递进去
2.调用format方法,将传进去的Date对象转换为规范的文本格式
*/
public void dateFormat1(){
System.out.println(new SimpleDateFormat("yyyy,MM,dd HH:mm:ss").format(new Date()));
}
/*
使用DateFormat中的parse方法,把文本解析为日期
1.实例化SimpleDateFormat,将要实现的文本格式传递进去
2.调用parse方法,将传进去规范的字符串转换为规范的Date对象
注意:parse方法中声明了一个异常,如果要使用parse方法需要在方法中捕获(try-catch)异常
或者在方法外throws,继续向外抛出
*/
public void dateFormat2(){
try {
Date parse1 = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-01");
Date parse2 = new SimpleDateFormat("yyyy-MM-dd").parse("2025-06-24");
System.out.println(parse1);
System.out.println(parse2);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
package com.commonClass;
import com.commonClass.Date.dateFormat.Demo01;
public class Application {
public static void main(String[] args) {
new Demo01().dateFormat1();//2020,06,24 17:10:31
new Demo01().dateFormat2();//Wed Jan 01 00:00:00 GMT+08:00 2020
//Tue Jun 24 00:00:00 GMT+08:00 2025
}
}
package com.commonClass.Date.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/*
练习题:
请使用日期相关的API计算一个人出生了多少天
*/
public class Demo01 {
public long date(){
boolean flag=true;
long count=0;
long result=0;
while (flag) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入出生日期,输入格式为:yyyy-MM-dd");
flag=false;
try {
long parse = new SimpleDateFormat("yyyy-MM-dd").parse(scanner.nextLine()).getTime();
count=parse;
} catch (ParseException e) {
System.out.println("输入格式错误,请重新输入");
flag=true;
}
}
long time = new Date().getTime();
if(time-count>0){
long sun=time-count;
result=sun/(24*60*60*1000);
}else{
return 0;
}
return result;
}
}
package com.commonClass;
import com.commonClass.Date.test.Demo01;
public class Application {
public static void main(String[] args) {
System.out.println(new Demo01().date());
}
}
Calendar类
- java.util.Calendar:Calendar类是一个抽象类,是是日历类
- 我们通过Calendar的静态方法getInstance()去实例化Calendar
- 我们常用的方法有:
- int get(int field):返回给定日历的值
- void set(int field int value):将给定的日历字段设置成给定的值
- void add(int field int amount):给日历字段添加或减去指定的值
- Date geiTime():将日历对象转换为日期对象
package com.commonClass.Date.calendar;
/*
java.util.calendar
Calendar是一个抽象类,里面提供了很多操作日历字段的方法
Calendar不能实例化对象
getInstance()静态方法,返回值就是一个Calendar
Calendar instance = Calendar.getInstance();
*/
/*
成员方法的参数:
ins field:日历类的字段,可以使用Calendar的静态成员变量获取
public static final int YEAR=1; 年
public static final int MONTH=2;月
public static final int DATE=5; 月中的某一天
public static final int DAY_OF_MONTH = 5; 月中的某一天
public static final int HOUR=10; 时
public static final int MINUTE=12; 分
public static final int SECOND=13; 秒
*/
import java.util.Calendar;
public class Demo01 {
public void calendar1(){
Calendar instance = Calendar.getInstance();
System.out.println(instance);
}
/*
成员方法:
int get(int field):返回给定日历字段的值。
参数:通过Calendar的静态成员变量获取
*/
public void calendar2(){
Calendar instance = Calendar.getInstance();
System.out.print(instance.get(Calendar.YEAR)+"年");
System.out.print(instance.get(Calendar.MONTH)+1+"月");//西方的月份0-11,
System.out.print(instance.get(Calendar.DATE)+"日");
//System.out.print(instance.get(Calendar.DAY_OF_MONTH));
System.out.print("\t"+instance.get(Calendar.HOUR)+"时");
System.out.print(instance.get(Calendar.MINUTE)+"分");
System.out.println(instance.get(Calendar.SECOND)+"秒");
}
/*
成员方法
void set(int field, int value):将给定的日历字段设置为给定的值。
参数:int field:通过Calendar的静态成员变量获取
int value:为给定日历字段设置的值
*/
public void calendar3(){
Calendar instance = Calendar.getInstance();
instance.set(Calendar.YEAR,1994);
instance.set(Calendar.MONTH,9);
instance.set(Calendar.DATE,9);
//可以同时设置YEAR_MONTH_DATE,使用set()重载的方法
instance.set(2020,6,25);
System.out.print(instance.get(Calendar.YEAR)+"年");
System.out.print(instance.get(Calendar.MONTH)+"月");
System.out.println(instance.get(Calendar.DATE)+"日");
}
/*
成员方法:
abstract void add(int field, int amount):给定的日历字段中添加或减去指定的时间量
参数:int field:通过Calendar的静态成员变量获取
int amount:要添加到该字段的日期或时间量
正数:增加值
负数:减少值
*/
public void calendar4(){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.YEAR,5);
instance.add(Calendar.MONTH,1);
instance.add(Calendar.DATE,-5);
System.out.print(instance.get(Calendar.YEAR)+"年");
System.out.print(instance.get(Calendar.MONTH)+"月");
System.out.println(instance.get(Calendar.DATE)+"日");
}
/*
成员方法:
Date getTime():返回一个Date表示此Calendar时间值的对象
把日历对象转换为日期对象
*/
public void calendar5(){
Calendar instance = Calendar.getInstance();
System.out.println(instance.getTime());
}
}
package com.commonClass;
import com.commonClass.Date.calendar.Demo01;
public class Application {
public static void main(String[] args) {
new Demo01().calendar1();
new Demo01().calendar2();//2020年6月25日 1时36分54秒
new Demo01().calendar3();//2020年6月25日
new Demo01().calendar4();//2025年6月20日
new Demo01().calendar5();//Thu Jun 25 03:16:46 GMT+08:00 2020
}
}