常用类
SimpleDateFormat 重要
new Date() 获取到当前系统时间: Sat Apr 09 09:36:18 CST 2022
进行转换: yyyy-MM-dd hh:mm:ss 日期字符串
用户输入Scanner, 输入日期只能是一个字符串 "1993-12-12" 需要把String转换为Date
使用SimpleDateFormat: 进行日期与String之间转换, 位于java.text包下: 父类: 抽象类 DateFormat
创建对象 构造方法
pattern: 日期格式表达式字符串: 比如: yyyy-MM-dd hh:mm:ss
日期每一部分的 标识符:
常用方法:
1.把日期转换为字符串
String format(Date 日期) 从DateFormat继承的
- 把指定日期格式字符串转换为日期
Date parse(String s) 抛一个ParseException
public static void main(String[] args) {
Date now = new Date(); //得到当前系统时间
System.out.println(now); //Sat Apr 09 09:50:59 CST 2022
//把日期转换为指定格式: yyyy-MM-dd 2022-04-09
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//调用format() 方法进行转换
String dateStr = sdf.format(now);
System.out.println(dateStr); //2022-04-09
Scanner input = new Scanner(System.in);
System.out.println("请输入您的出生日期(yyyy-MM-dd):");
String birthdayStr = input.next();
//把birthdayStr字符串转换为Date类型
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
//调用parse()
try {
Date birthday = sdf1.parse(birthdayStr);
System.out.println(birthday);
} catch (ParseException e) {
// 字符串的格式与SimpleDateFormat的pattern匹配,抛这个异常
e.printStackTrace();
}
}
Calendar 日历类, 替换java.util.Date
设置年,月,日, 时,分秒 位于java.util包 Calendar 是抽象类: 子类: GregorianCalendar
- public abstract class Calendar
创建对象
1) 调用子类的构造方法创建Calendar对象
- 调用Calendar类的static方法: static Calendar getInstance(); 推荐
public static Calendar getInstance() //Calendar返回的是基于默认时区的当前时间
常用方法
获取指定日期部分的值
int get(int field) //field 日期部分
- 设置日期
- 日期相加
add(int field, int amount)
- Calendar对象转换Date
Date getTime()
Calendar的getTime() //把Calendar对象转换Date
Date的getTime() 获取日期的毫秒值
- 把Date转换为Calendar
setTime(Date date)
枚举
学生类, 性别属性: (男,女) ,姓名, 年龄
现在性别是男女:
第一种方式: setSex() 方法进行通过代码判断
public void setSex(String sex) {
//限制 通过逻辑代码实现
if("男".equals(sex) ||"女".equals(sex) ){
this.sex = sex;
}else{
throw new RuntimeException("性别只能是男或者女,不能是:"+sex);
}
}
缺点:
- 编写逻辑代码: if--else
- 检查是在代码运行的时候,才会判断
第二种方式: 男,女作为一个常量, 要求给sex属性赋值, 把常量赋值给sex属性
public class Student {
//定义男女的两个常量
public static final String MAN = "男";
public static final String WOMAN = "女";
}
stu.setSex(Student.MAN);
经验:
开发过程中, 善用常量: 避免"魔法数字" ,可读性
使用常量缺点:
- 无法检查, 很弱的限制, 口头限制,代码无法限制
好处: 可读性高
第三种: 使用私有构造方法, 提供两个公开静态的本类对象, 显示这个类的对象个数
/**
* 性别类,
* 使用对象, sex 只有 两个对象: 男的对象 ,女的对象
*/
public class Sex {
//Sex定义两个常量, 本类的对象
public static final Sex MAN = new Sex();
public static final Sex WOMAN = new Sex();
//私有的构造方法 表示这个构造方法只能在本类使用
private Sex(){
}
//提供公开的静态方法, 调用本类的构造方法,创建一个对象,返回
//public static Sex createInstance(){
// return new Sex();
//}
}
偷懒:
public static final 类 省略: MAN ,WOMAN MAN 等同于: public static final Sex MAN = new Sex();
构造方法默认就是private修饰
public enum Sex{
MAN,WOMAN
}
JDK 为了简化上面的代码. 提供 enum (枚举) , 还是一个类
/**
* 枚举
* 如果一个类的对象有限个数, 列举出来,使用枚举
*/
public enum SexEnum {
MAN,WOMAN
}
1.enum和class、interface的地位一样
2.使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
3.枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
4.使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
5.枚举类的构造器只能是私有的。
枚举类的父类java.lang.Enum: 父类有两个属性:
1) name: 枚举的对象的名字, name() 获取对象名字
2) ordinal: 枚举对象下标 ordinal() 获取对象的下标
枚举使用场景: 某个类的对象有限个数, 需要列举出来, 可以使用枚举
比如: 季节类: 春夏秋冬 季节类定义枚举
BigInteger, BigDecimal 大整数, 大小数
int.long,double 存的位数有限, double还有精度问题: 0.1+0.2 !=0.3
解决上面问题: 提供BigInteger,BigDecimal 存放无限大小的数字, BigDecimal 解决小数精度问题
位于 java.math包
创建对象
BigInteger(String val)
BigDecimal(String val)
常用方法
加减乘除
add(BigDecimal augend) //加
subtract(BigDecimal subtrahend) //减
multiply(BigDecimal multiplicand) //承
divide(BigDecimal divisor) //除
转换为基本数据类型:
int intValue()
long longValue()
double doubleValue()
String toString()
setScale(保留小数位, BigDecimal.ROUND_HALF_UP) //四舍五入
注意:在实际开发中,关于金钱方面的,不会使用double类型,而是使用java.math.DigDecimal类型。
或者: 单位不是使用元作为单位, 使用分作为单位, 1.99元 --> 199分
重点: String, Date