这一周因为要准备期末考试,时间不是特别充裕,所以Java学习的进度也不是很快,但也有一些收获。
目录
一、包装类
Java中,基本数据类型不能创建对象,所以和其他对象使用时不是特别方便,所以Java为了优化对基本数据的处理,提供了特殊类与之对应,我们把这些和基本数据类型的对应类称之为包装类。
Byte、Short、Integer、Long、Float、Double、Character、Boolean,这8个类分别对应8个基本数据类型byte、short、int、long、float、double、char、boolean。下面是我创建的一个Integer的对象:
int i=10;
Integer a=Integer.valueOf(i);
这相当于用箱子把我们的基本数据类型用箱子包装成一个对象,由于这种方式用得比较多,所以Java虚拟机可以自动帮我们调用,因此代码可以写成以下形式:
int i=10
Integer a=i;
这个过程(将基本数据类型转化成包装类)称为自动装箱,如果要将我们的包装类转化为基本数据类型,也可以进行以下操作:
int i=10;
Integer i1=i;
int i2=i1.intvalue();
同样的,因为这个方式用得比较多,所以Java虚拟机也可以帮我们完成,我们可以写成以下形式:
int i=10;
Integer i1=i;
int i2=i1;
这个过程(将包装类转化成基本数据类型)成为自动拆箱。
二、日期类和日历类
在Java中,如果要获取当前系统时间,可以使用下面的语句:
System.out.println(System.currentTimeMillis());
这个代码的运行结果的是一段long型的整数,表示从1970年1月1日0时开始经历的毫秒数,我们称之为时间戳。这个结果很难看懂,所以Java中提供了操作时间的基本功能,在这里主要介绍操作时间的两个功能,即日期类和日期类。
(一)日期类
import java.util.Date;
public class DateClass {
public static void main(String[] args){
Date d=new Date();
System.out.println(d);
}
}
这段代码的结果为:
Sat Jun 03 22:24:20 CST 2023
以上结果还是不够直观,因此Java提供了一种特殊类,可以对时间进行格式化操作,SimpleDateFormat类
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateClass {
public static void main(String[] args){
Date d=new Date();
System.out.println(d);
//Java格式化日期格式:
//y(Y)->y:正常年份->Y:一年有52周,如果大于52周算下一年
//m(M)->m:分钟->M:月份
//d(D)->d:一个月中的日期->D:一年中的日期
//h(H)->h:12进制->H:24进制
//s(S)->s:秒->S:毫秒
//yyyy-MM-dd HH:mm:ss:SSS
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String dateFormatString=sdf.format(d);
System.out.println(dateFormatString);
//运行结果为:2023-06-03 22:41:48:295
}
以上是将日期对象转化为String类型,下面是将String类型转化为日期对象,前提:String的格式要符合日期转化格式
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateClass {
public static void main(String[] args){
Date d=new Date();
System.out.println(d);
//Java格式化日期格式:
//y(Y)->y:正常年份->Y:一年有52周,如果大于52周算下一年
//m(M)->m:分钟->M:月份
//d(D)->d:一个月中的日期->D:一年中的日期
//h(H)->h:12进制->H:24进制
//s(S)->s:秒->S:毫秒
//yyyy-MM-dd HH:mm:ss:SSS
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String dateString="2022-06-01";
try{
Date parseDate=sdf.parse(dateString);
System.out.println("转化的格式为:"+parseDate);
}catch(ParseException e){
e.printStackTrace();
}
//运行结果:转化的格式为:Wed Jun 01 00:00:00 CST 2022
}
}
(二)日历类
日历类(Calendar)用于日历上的日期操作,因为日历类是抽象的,所以不能构建对象,要用静态方法获取。
import java.util.Calendar;
public class CalendarClass {
public static void main(String[] args){
Calendar calendar=Calendar.getInstance();
System.out.println(calendar);
}
}
下面是日历类常用的一些方法:
import java.util.Date;
import java.util.Calendar;
public class CalendarClass {
public static void main(String[] args){
Calendar calendar=Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.get(Calendar.YEAR));//获取年份
System.out.println(calendar.get(Calendar.MONTH));//获取月份,月份从0开始,0就是一月
System.out.println(calendar.get(Calendar.DATE));//获取日期
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//一个月中的第几天
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//一周的第几天,周日为一周的第一天
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//一年的第几天
calendar.set(Calendar.YEAR,1);//将年份设置为指定的那一年,月份,日期同理
calendar.setTime(new Date());//将日期应用到日历中,可将日历指向那一天
calendar.add(Calendar.YEAR,1);//MONTH、DATE也如此
calendar.getMaximum(Calendar.DAY_OF_MONTH);//一个月最多可以有多少天,即31天
calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//当前月份有多少天
}
}
下面是一个打印日期的代码:
import java.util.Calendar;
//打印当前月份的日历
//getActualMaximum(Calendar.DAY_OF_MONTH)获取当前月份的最大天数
//getMaximum(Calendar.DAY_OF_MONTH)一个月最多能有多少天,不管设置几月,都是31
public class JavaPrintCalendar {
public static void main(String[] args){
System.out.println("一\t二\t三\t四\t五\t六\t日");
Calendar firstdate=Calendar.getInstance();
int maxDay=firstdate.getActualMaximum(Calendar.DAY_OF_MONTH);
firstdate.set(Calendar.DAY_OF_MONTH,1);
for(int i=0;i<maxDay;i++){
int weekx=firstdate.get(Calendar.DAY_OF_WEEK);
int monthY=firstdate.get(Calendar.DAY_OF_MONTH);
if(i==0){
if(weekx==Calendar.SUNDAY){
for(int j=0;j<6;j++){
System.out.print(" \t");
}
System.out.println(monthY);
}
else{
for(int k=0;k<weekx-2;k++){
System.out.print(" \t");
}
System.out.print(monthY+"\t");
}
}
else{
if(weekx==Calendar.SUNDAY){
System.out.println(monthY);
}
else{
System.out.print(monthY+"\t");
}
}
firstdate.add(Calendar.DATE,1);
}
}
}
/*
运行结果:
一 二 三 四 五 六 日
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
*/
三、异常类
异常是指在程序运行过程中发生的异常事件,例如,除0溢出、数组越界、找不到文件等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性(即健壮性),设计程序时,必须考虑可能发生的异常事件并作出相应的处理。
语法:
try{
可能抛出异常的代码
}catch(异常类1 异常类1对象){
捕获异常类1有关的处理程序段;
}
catch(异常类2 异常类2对象){
捕获异常类2有关的处理程序段;
}
...
finally{
//最后必须执行的代码,无论是否捕获到异常
}
Java中异常分为两大类:
1、可以通过代码恢复正常逻辑执行的异常,称之为运行期异常:RuntimeException
2、不可以通过代码恢复正常逻辑执行的异常,称之为编译期异常:Exception
RuntimeException是Exception的子类
运行期异常在编译时不需要做处理,在运行时发生异常,根据异常提示进行处理即可。
编译器异常在编译时编译器会提示,需要进行处理,否则程序无法运行。
转换异常:
在方法调用时,要想事先告诉别人你调用的方法可能会出现异常,并在编译的时候提示你,就得将异常转换为编译期异常。
如上图,原来的除0异常只是算数异常,编译时不会提示,但将算数异常转换为编译期异常Exception后,在编译时就会得到提示,说明调用该方法可能会出现异常,提前做出处理。
自定义异常:
Java中定义的异常主要用来处理系统可以预见的、比较常见的运行错误。如果某个应用
程序有特殊的要求,则可能出现系统不能识别的运行错误,这时,用户就需要自己创建异常和异常类,使系统能够识别这种错误并进行处理。
例如:登录时,账号或密码不正确,就是我们可能会出现的异常,这时候系统不能识别出来,就需要我们自己去定义。
下面是一个自定义异常的程序:
//自定义异常
public class JavaCustomException {
public static void main(String[] args){
try{
login("admin","admin");
}catch(AccountException accountException){
System.out.println("账号错误,请重新输入");
}catch(PasswordException passwordException){
System.out.println("密码错误,请重新输入");
}catch(LoginException loginException){
System.out.println("其他登录的相关错误,需要重新确认");
}
}
public static void login(String account,String password) throws LoginException{
if(!"admin".equals(account)){
throw new AccountException("账号不正确");
}
if(!"admin".equals(password)){
throw new PasswordException("密码不正确");
}
System.out.println("登录成功");
}
}
class AccountException extends LoginException{
public AccountException(String message){
super(message);
}
}
class PasswordException extends LoginException{
public PasswordException(String message){
super(message);
}
}
class LoginException extends Exception{
public LoginException(String message){
super(message);
}
}
在上面代码中,如果账号或密码不正确,会给出相应的提示,让使用者发现问题所在。
本周学习到此结束。