Java day12——API(1)Object类、Date

Object类

它是所有类的父类,共有有11个方法,重点3个

String toString()

将对象变成字符串格式
Object中默认toString的实现方式:
完整类名+@+哈希code值
getClass().getName() + “@” +Integer.toHexString(hashCode());
public native int hashCode(); – 获得的是地址, 哈希码

  	public static void main(String[] args) {
      ZiToString zi = new ZiToString("张三", 28);
      //直接打印对象时, 自动就会调用对象的toString方法
      System.out.println(zi); // com.zzxx.api.Object.ZiToString@5fe5c6f
      
     // 想要打印对象时, 显示对象的属性内容 -- 重写toString方法 
      @Override
  	public String toString() {
      return "ZiToString{" +
              "name='" + name + '\'' +
              ", age=" + age +
              '}';
  }
  System.out.println(zi);//ZiToString{name='张三', age=28}

boolean equals(Object obj)

Object中默认equals的实现方式:
return (this == obj); – 比较对象的地址
当我们想要比较两个相同类型对象的属性值时, 需要重写equals

public class ZiEquals {
	public boolean equals(Object obj) {
		// this-ZiEquals 和 obj-Object
        // 1.this == obj, 如果对象地址⼀样,指得就是同一个对象,肯定相等
        if (this == obj) {
            return true;
        }
        // 2.类型不一致,一定是不等
        if (!(obj instanceof ZiEquals)) {
            return false;
        }
        // 3.类型一致,不是同一个对象,才要比较属性内容
        ZiEquals zi = (ZiEquals) obj; //转换为当前类型——子类型
        return zi.age == this.age && this.name.equals(zi.name);//名字和年龄都相同
        //直接生成的:return age == ziEquals.age &&Objects.equals(name, ziEquals.name);
        
}

hashCode()

获取对象的散列值,默认返回对象的堆内存地址

其余方法

Class getClass()

通过对象的该方法,可以获得对象对应的类的字节码对象

		Class c1 = "haha".getClass();//String的字节码对象
        Class c2 = "hi".getClass();//String的字节码对象
        // 同种类型的对象, 对应的字节码对象都是同一个
        System.out.println(c1 == c2);

补充:
类的加载: 将类的信息读取到方法区中,生成了一字节码对象Class
所有的Student对象共同拥有一个Student的字节码对象[包含了Student类中所有的信息]
Zi zi = new Zi(); -> zi = null;

Object clone():

克隆, 复制
复制一份全新的, 属性内容一致的对象, 深克隆
复制的是引用 -> 浅克隆
调用方法的对象, 需要类实现Cloneable接口

 	ZiClone zi = new ZiClone();
     zi.setName("lucy");
     ZiClone clone = (ZiClone)zi.clone();

     ZiClone clone2 = zi; // 引用的赋值 -> 浅克隆

     // 默认的clone方法, 是复制一份全新的, 属性内容一致的对象 -> 深克隆
     System.out.println(clone.getName());
     System.out.println(zi == clone);

wait() * 3(略)

wait()无限等待/wait(t)计时等待/wait(t+m)附加时间的毫秒范围

notify() / notifyAll()

这5个和线程有关

void finalize()

在GC垃圾回收器准备释放内存前,会先调用finalize()
GC: 垃圾回收机制, 定时清理内存中
栈:方法结束, 方法栈直接释放
堆:无效对象, 等待gc回收
手动调用: System.gc()

java.util.Date

日期, 时间

Date构造方法

new Date()
new Date(long time)

		// 空参构造方法 -> 当前系统时间
        Date date = new Date();
        // Tue Jul 21 11:48:57 CST 2020
        System.out.println(date);
         //Date中的 toString() 重写过了:Tue Jul 21 11:48:57 CST 2020

        // 参数是long类型的构造方法
        Date date1 = new Date(0l + 30l*24*60*60*1000);
        System.out.println(date1);
	
		System.currentTimeMillis()//new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。

Date常用API

long getTime() -> 获得date对应的毫秒值

  	  Date date = new Date();
      // 将时间从date类型, 转换成了long类型所表示的毫秒值
      long time = date.getTime();
      System.out.println("time: " + time);

void setTime(long time) -> 将date设置为对应毫秒值表示的时间

   	   time += 30l*24*60*60*1000;
       date.setTime(time);
       System.out.println(date);

判断前后

		Date date1 = new Date(0l);
        // date1 是否在 date 的后面
        boolean b = date1.after(date);
        System.out.println(b);
        // date1 是否在 date 的前面
        boolean b2 = date1.before(date);
        System.out.println(b2);

Calendar

java.util.Calendar -> 复杂的时间推算
初始化: static Calendar getInstance();

 // 1.获得万年历对象
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);

get/set方法

int get(分量字段) -> 获得字段对应的值
void set(分量字段, 值)
注意: cal.set(Calendar.MONTH, 6),设置进去的是7月

	    // 1). 获得cal对应的月份, 月份从0开始
        int month = cal.get(Calendar.MONTH);
        System.out.println("month: " + month); // 6
        // 2). 获得cal对应的年份
        int year = cal.get(Calendar.YEAR);
        System.out.println("year: " + year); // 2020

		 // 3) 今天时间是:2020-7-21 ->设置为2020-8-15
        cal.set(Calendar.MONTH, Calendar.AUGUST);
        cal.set(Calendar.DAY_OF_MONTH, 15);
        System.out.println(cal);

add方法

void add(分量字段, 值) -> 向前计算, 加负数

// 1.获得万年历对象 2020-7-21
       Calendar cal = Calendar.getInstance();
       System.out.println(cal);
       // 保质期48天, 求当天是几号  2020-9-7
       cal.add(Calendar.DATE, 48);
       // 到期日往前推两周
       cal.add(Calendar.WEEK_OF_MONTH, -2);
       // 要周四
       cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);

getTimeInMillis()

获得当前日历对象的毫秒值

三种时间类型的总结和转换

所有时间格式的打印都要转换成date才能打印

// 1.获得万年历对象 2020-7-21
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);
        // 入职10周年, 当月的第三周的周五
        cal.add(Calendar.YEAR, 10);
        cal.set(Calendar.WEEK_OF_MONTH, 3);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);

        // 2.将 Calendar 转换成 Date 类型, 再来打印
        Date date = cal.getTime();
        System.out.println(date);

转换

	    // 1.Date -> long
        Date date = new Date();
        long time = date.getTime();
        
        // 2.long -> Date
        date.setTime(time);
        // 如果原先没有Date对象, 可以通过long创建一个新的Date对象
        Date date2 = new Date(time);
        // --------------------------
        // 3.Calendar -> Date
        Calendar cal = Calendar.getInstance();
        Date date3 = cal.getTime();

        // 4.Date -> Calendar
        Date date4 = new Date(0);
        cal.setTime(date4);
        // --------------------
        // 5.Calendar -> long (了解)
        Calendar cal1 = Calendar.getInstance();
        long time2 = cal1.getTimeInMillis();

        // 6.long -> Calendar (了解)
        cal1.setTimeInMillis(time2 + 1000);

时间展示、格式化

回顾:

  1. long: 简单时间计算, 7天之内
    运行效率计算
  2. Date: 展示时间
    2020-07-21 16:47:55
    2020/07/21 16:47:55
    2020年07月21日 16:47:55
  3. Calendar: 复杂计算

SimpleDateFormat格式化
自定义格式 java.text.DateFormat 的子类

// 为了显示时间 Date -> String
      Date date = new Date();
      System.out.println(date);//Fri Oct 23 09:41:31 CST 2020

      // 构造SimpleDateFormat对象, 需要传参 - 格式
      // 2020-07-21  16:47:55
      // yyyy-MM-dd HH:mm:ss E
      SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
      String str = sf.format(date);
      System.out.println(str);//2020-10-23 09:41:31 周五

      // ------------------------
      // 自行输入日期(String) -> Date  19980228
      String s = "19980228";
      SimpleDateFormat sf1 = new
              SimpleDateFormat("yyyyMMdd");
      Date date1 = sf1.parse(s);
   	  System.out.println(date1);//Sat Feb 28 00:00:00 CST 1998

System.out.println(sf.format(date1));//1998-02-28
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值