第十九单元 常用API
复习
- 什么是面向对象
类:一类事物的抽象的表现形式
包含属性和行为
对象:是类的实例。对类进行描述
- 面向对象的三大特征及好处
封装(private):提高代码的安全性
继承(extends):调高代码的复用性
多态(instanceof):提高代码的灵活性
- 多态的前提、好处及弊端
前提: 1、继承或者实现
2、重写父类或者接口中的方法 ---接口中可以定义抽象方法、静态方法、(default)默认方法、私有方法
3、父类的引用指向子类的对象
好处: 提高代码的灵活性
弊端: 不能调用子类的特有的方法 -先判断再向下转型
今日重点学习目标
- Object类toString()方法和equals()方法
- Date类常用的方法
- DateFormat类中的常用方法
- Canlender类中的常用方法
- System类中的常用方法
Object类
什么是Java的API?
Application Programing Interface:面向程序接口编程。俗称Java词典。
Java.lang.Object
2.1、概念
概述:
类 Object
是类层次结构的根类。每个类都使用 Object
作为超类。所有对象(包括数组)都实现这个类的方法。
它是所有的类的父类。
2.2、方法
JVM内存划分
栈、堆、方法区
JVM占用内存默认是1/64,可以调成最大的1/4.
演示堆内存溢出异常
public class User {
public static void main(String[] args) {
int[] arr = new int[999999999];//堆内存溢出异常 空指针 角标越界异常 类型转换异常
System.out.println(arr);
}
}
2.3、查看Object类源码
private static native void registerNatives();
static {
registerNatives();
}
native关键字:
代表调用本地的属性和行为。只要加native关键字,它所有的属性和行为都不是java语言开发的。都是由c/c++语言开发的。
C语言是面向过程语言 c++是面向过程和面向对象的中间产物。
java语言也是开源编程语言。实际上java语言并不开源。
2.4、toString()方法
public String toString(); 返回该对象的字符串表示。
代码演示
定义User类
/**
* Create by yanhongbo
* 日期 2021/4/22
* 在没有制定父类的前提下 该类的父类就是Object类
* 概念:
* 它是所有的类的父类。
* 只要任意定义一个类。默认就有12个方法。 本类的空参构造方法和Object类的11个方法
*
* @Version 1.0
*/
public class User {
//属性
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写父类的toString(); 如果不重写默认会调用父类的toString()方法
/* public String toString() {
return name+"....."+age ;
}*/
//第二种解决方案 快捷键 alt+insert
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
定义测试类
public class TestObject {
public static void main(String[] args) {
User user = new User("杨过",18);
System.out.println(user);//com.deyuan.User@1540e19d
System.out.println("----------犹豫的分割线-------------");
String str = user.toString();//调用的是父类的toString();
System.out.println(str);//com.deyuan.User@1540e19d
/**
* 结论:
* 输出语句中,打印的对象默认会调用父类的toString();
* 需求:
* 打印的地址,是没有意义的
* 产生有意义的数据 要看到user对象中的属性和行为
* 属性:姓名要看到具体的名字
* 行为:具体的动作。
*
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* 获取类名+"@"+十进制转换为十六进制 hashCode是一个十进制的数
* }
* 解决方案:
* 重写父类的toString()方法
*/
//学过的哪些类都重写toString()方法
Scanner sc=new Scanner(System.in);
System.out.println(sc);//重写了object类中的toString()方法
ArrayList<String> list=new ArrayList<>();
list.add("aa");
list.add("bb");
System.out.println(list);
}
}
2.5、equals()方法
public boolean equals(Object obj);指示其他某个对象是否与此对象“相等”。
代码演示
定义User类–重写equals()方法
/**
* Create by yanhongbo
* 日期 2021/4/22
*
* @Version 1.0
*/
public class User {
private String name;
private int age;
public User() {
}
public User(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 String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写父类的equals()方法 真正的用法是比较对象中的内容
public boolean equals(Object obj) {
if(this==obj){
return true;
}
//非空判断
if (obj == null) {
return false;//对于任何非空引用值 x,x.equals(null) 都应返回 false。
}
//age是子类特有的属性 向下转型
if (obj instanceof User) {
User user1 = (User) obj;
return this.age == user1.age;
}
return false;
}
}
定义测试类 1
/**
* Create by yanhongbo
* 日期 2021/4/22
* 演示equals()方法
*
* @Version 1.0
*/
public class TestEquals {
public static void main(String[] args) {
int a = 1;
int c = 1;
System.out.println(a == c);//==如果两边是基本数据类型 比较的是具体的数值
System.out.println("----------------------------");
User user1 = new User("佳伟", 19);
User user2 = new User("佳伟", 19);
System.out.println(user1 == user2);//== 如果两边是引用类型 ,比较的是对象的地址值
System.out.println("----------------------------");
boolean b = user1.equals(user2);
System.out.println(b);//false equals比较的是对象中的内容 指示其他某个对象是否与此对象“相等”。
/**
* public boolean equals(Object obj) {
* return (this == obj);
}
* 重写父类equals()方法
*/
System.out.println(user1.equals(user1));
System.out.println(user1.equals(null));//对于任何非空引用值 x,x.equals(null) 都应返回 false。
}
}
定义测试类 2
public class Test02 {
public static void main(String[] args) {
User user1=new User("佳伟",19);
User user2=new User("佳伟",19);
System.out.println(user1.equals(user2));//true
}
}
使用快捷键来重写父类的equals方法
面试题 ==和equals的区别
==:如果两边是基本数据类型,比较的是具体的数值。
如果两边是引用数据类型,比较的是内存的地址值。
equals:比较的是对象中的内容。
笔试题:
public class Test03 {
public static void main(String[] args) {
String str1=null;
String str2="abc";
System.out.println(str1.equals(str2));//空指针异常
System.out.println("-----------可爱的分割线-------------");
String str3="abc";
String str4=null;
System.out.println(str3.equals(str4));//false
System.out.println("-----------可爱的分割线-------------");
String str5=new String("abc");
String str6="abc";
System.out.println(str5.equals(str6));//true 原因 String类重写Object的equals()方法,比较的就是内容了
System.out.println("-----------可爱的分割线-------------");
System.out.println(str5==str6);//false
}
}
Date日期类
Java.util.Date 包下
3.1、概述
类 Date
表示特定的瞬间,精确到毫秒。 1秒= 1000 毫秒
3.2、方法
Date():空参构造方法
public long getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date
对象表示的毫秒数。
public void setTime(): 设置此 Date
对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time
毫秒的时间点。
日期对象转换为毫秒值-getTime()
毫秒值转换为日期对象-setTime();
代码演示
import java.util.Date;
/**
* Create by yanhongbo
* 日期 2021/4/22
* date对象打印的结果分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
* @Version 1.0
*/
public class TestDate01 {
public static void main(String[] args) {
Date date=new Date();
System.out.println(date);//Thu Apr 22 14:23:49 CST 2021 格式: 2021年4月22日 14:25
long time = date.getTime(); //date对象转化为毫秒值
System.out.println(time);//1619072815184 当前的毫秒值
//毫秒值转换日期对象 setTime();
date.setTime(1519234324332L);
System.out.println(date);
}
}
DateFormat类
java.text.DateFormat
从api中可以看出它是一个抽象类,它表示日期格式化。
4.1、 概述
DateFormat 是日期/时间格式化子类的抽象类
通过这个类来实现2个功能
日期–>文本—format()方法 --使用的是父类的format()方法
文本–>日期—parse()方法 --使用的是父类的parse()方法
具体实现由子类SimpleDateFormat来实现
4.2、 日期转换字符串 -format()
代码演示
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDate02 {
public static void main(String[] args) {
Date date=new Date();
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
String format = df.format(date);//使用的是父类DateFormat中format()方法 将一个 Date 格式化为日期/时间字符串。
System.out.println(format);//2021年04月22日 03:01
}
}
4.3、字符串转化为日期 --parse()
代码演示
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Create by yanhongbo
* 日期 2021/4/22
* 字符串转化为日期 --parse()
* @Version 1.0
*/
public class TestDate03 {
public static void main(String[] args) throws ParseException {
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
String str="1999-03-05";//参考SimpleDateFormat里面的日期格式
Date parse = df.parse(str);
System.out.println(parse);
}
}
4.4 、练习
从出生年月到现在活了多少天。
思路分析
第一步:获取今天的时间 毫秒值
第二步:减去出生的时间 毫秒值
第三步:通过毫秒值来计算时间的 今天的毫秒值 减去 出生年月的毫秒值
第四步:得到的毫秒值转换为天数 毫秒值/1000/60/60/24 天数
代码演示
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class TestDate04 {
public static void main(String[] args) throws ParseException {
//请输入你的出生年月 例如 1999-04-05
System.out.println("请输入你的出生年月,格式:1999-04-05");
String birthday = new Scanner(System.in).next();//输入的文本转换为日期对象
//创建Date对象 获取毫秒值
Date date=new Date();
long endtime = date.getTime();//获取今天时间的毫秒值
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date date2 = df.parse(birthday);
long starttime = date2.getTime();//获取出生年月的毫秒值
long time=endtime-starttime;//毫秒值
System.out.println("天数"+time/1000/60/60/24);
}
}
Calender类-日历类
java.util.Calender类
5.1 、概述
Calendar
类是一个抽象类,它为特定瞬间与一组诸如 YEAR
、MONTH
、DAY_OF_MONTH
、HOUR
等 日历字段
之间的转换提供了一些方法。
创建Calendar
对象
Calendar calender = Calendar.getInstance();
5.2 方法
public int get(int field); 返回给定日历字段的值。
public void set(int field,int value);将给定的日历字段设置为给定值。
public abstract void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或减去指
import java.util.Calendar;
/**
* Create by yanhongbo
* 日期 2021/4/22
*
* @Version 1.0
*/
public class TestDate05 {
public static void main(String[] args) {
//get 方法
//创建Calender对象
Calendar calendar = Calendar.getInstance();
//获取年
int year = calendar.get(Calendar.YEAR);
System.out.println(year+"年");
//获取月
int month = calendar.get(Calendar.MONTH);
System.out.println(month+1+"月");//国外12月算第一个月 国内1月算第一个月
//获取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(day+"日");
//set方法 互联网 财务软件
//设置年
/* calendar.set(Calendar.YEAR,2020);
System.out.println(calendar.get(Calendar.YEAR));
//设置月
calendar.set(Calendar.MONTH,3);
System.out.println(calendar.get(Calendar.MONTH));
//设置日
calendar.set(Calendar.DAY_OF_MONTH,23);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));*/
//add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量
calendar.add(Calendar.YEAR,-2);
calendar.add(Calendar.MONTH,2);// 5月
System.out.println(calendar.get(Calendar.YEAR));//2019年
System.out.println(calendar.get(Calendar.MONTH));//5月
}
}
getTime方法
Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。
代码演示
import java.util.Calendar;
import java.util.Date;
/**
* Create by yanhongbo
* 日期 2021/4/22
*
* @Version 1.0
*/
public class Test06 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(date);
}
}
System类
System.out System.in
代码演示
/**
* Create by yanhongbo
* 日期 2021/4/22
*static long currentTimeMillis()
* 返回以毫秒为单位的当前时间。
*
* 循环打印1-99999 耗时多长时间 毫秒值来计算
* @Version 1.0
*/
public class TestSytem {
public static void main(String[] args) {
//当前时间
long start = System.currentTimeMillis();
for(int i=0;i<99999;i++){
System.out.println(i);
}
//结束时间
long end= System.currentTimeMillis();
long time=end-start;
System.out.println(time);
}
}