Java进阶之代码块&常用API
一、代码块
1.1 代码块概述
代码块:在Java中,使用{}括起来的代码,常用于减少代码冗余,优化代码结构。
代码块有三种类型:
- 构造代码块 此代码块的内容是在每个构造方法执行之前都会执行,优点:减少代码量;缺点:每次构造方法执行之前都会执行。
- 静态代码块 此代码是在类加载时创建,只会执行一次,用于初始化静态成员。
- 局部代码块:写在方法体内,用于定义更小范围的变量,控制变量的生命周期
,方法执行时被执行。
这三种代码块常用的是静态代码块。
1.2 代码块的使用
案例:彩票35选5和体彩35选7
public class Lottery {
private int number = 7; //中奖号码个数
static int[] arr = new int[35]; //定义35个基数
//构造代码块: 此代码块的内容是在每个构造方法执行之前都会执行。
{
Random random = new Random();
for (int i = 0; i < 35; i++) {
arr[i] = random.nextInt(35) + 1;
}
System.out.println("构造代码块执行了");
}
//无参构造
public Lottery(){ //福彩
System.out.println("无参构造");
}
//有参构造
public Lottery(int number){ //体彩大乐透
this.number = number;
System.out.println("有参构造");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//35选7
Lottery lottery1 = new Lottery();
//35选5
Lottery lottery2 = new Lottery(5);
}
}
测试结果
public class Lottery {
private int number = 7; //中奖号码个数
static int[] arr = new int[35]; //定义35个基数
//静态代码块:此代码是在类加载时就创建了,只执行一次。用于初始化静态成员。
static {
Random random = new Random();
for (int i = 0; i < 35; i++) {
arr[i] = random.nextInt(35) + 1;
}
System.out.println("构造代码块执行了");
}
//无参构造
public Lottery(){ //福彩
System.out.println("无参构造");
}
//有参构造
public Lottery(int number){ //体彩大乐透
this.number = number;
System.out.println("有参构造");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//35选7
Lottery lottery1 = new Lottery();
//35选5
Lottery lottery2 = new Lottery(5);
}
}
测试结果:
局部代码块中不能定义所在方法中同名的变量,局部变量和成员变量能同名是因为局部变量在栈中,成员变量在堆中;局部代码块中的变量和方法中的变量都是局部变量,都在栈中,所以不能同名。
public void show(){
//int a = 20;//变量同名报错
System.out.println("普通方法执行了");
//局部代码块:写在方法体内。用于定义更小范围的变量。
{
int a = 10;
System.out.println(a); //10 可以访问
}
//System.out.println(a); //不能访问
}
二、常用API
2.1 Object类
Object类是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,实现这个类的方法。
Object只有一个无参构造方法:
public Object(){}
2.1.1 Object常用方法
public String toString()
返回对象的字符串表示形式
对象名默认会调用Object类的toString()方法
源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass().getName():获取当前包名和类名
hasCode():获得操作系统中生成的一个随机整数
Integer.tohexString(随机整数):把整数转换为16进制的数值
toString()方法源码中只生成地址值,无实际意义,要想输出具体的数据就需要重写
通过ALT+insert,然后选择toString()即可自动生成重写的代码
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public boolean equals(Object obj)
默认判断两个对象的地址值是否相等
源码:
源码中也是通过==比较的两个对象的地址值,要想比较两个对象的内容,需重写
public boolean equals(Object obj) {
return (this == obj);
}
快捷键:alt + insert ==> equals()
@Override
public boolean equals(Object o) {
//如果if语句中只有一条语句,则{}可以省略
if (this == o) return true;
if (!(o instanceof Student)) return false;
//都是Student类型,在Student这个类里面可以直接使用私有成员
Student student = (Student) o;
if (age != student.age) return false;
return this.name != null ? this.name.equals(student.name) : student.name == null;
}
public int hashCode()
返回一个对象的哈希代码值public final Class getClass()
返回该 Object运行时的类
2.1.2 Object类-native方法
public native int hashCode();获得操作系统中生成的一个随机整数
native修饰方法的作用:
- 表示能够使用Java语言调用其它语言的代码。比如调用 C或C++。
当需要访问C或C++的代码时,或者访问操作系统的底层语言代码时,可以使用本地方法实现,这意味着Java可以和其它的编程语言进行交互。
2.2 Date类
java.util.Date :Date类代表了一个特定的时间,精度为毫秒。
2.2.1 构造方法
默认时间是当前系统时间
Date date = new Date();
使用一个从1970年1月1日零时开始到time毫秒值构造的一个Date对象
Date date = new Date(time);
Date date = new Date(1000);
System.out.println(date);
打印结果:Thu Jan 01 08:00:01 CST 1970
2.2.1 常用成员方法
Date类的成员方法大部分已过时,目前还在用的成员方法有两个:
获取从1970年1月1日零时到此Date对象所表示时间之间的毫秒值
public long getTime()
设置此Date对象的毫秒值。此方法将改变此Date对象所表示的时间。
public void setTime(long time)
public class DemoDate {
public static void main(String[] args) {
//1.Date()
Date date1 = new Date();
System.out.println("date1=" + date1);
System.out.println(date1.getTime());
//2.Date(long m):
Date date2 = new Date(1000 * 3600 * 24);
System.out.println(date2);//Fri Jan 02 08:00:00 CST 1970
date2.setTime(date1.getTime());
System.out.println("date2=" + date2);
}
}
2.3 DateFormat类
java.text.DateFormat(类):对日期/时间进行格式化,是一个抽象类,不能被实例化。
使用方式:使用SimpleDateFormat子类
2.3.1 构造方法
用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat
SimpleDateFormat(String pattern)
y:年
M:月
d:日
H:时
s:分
m:秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
2.3.2 成员方法
public String format(Date date)
将Date对象转换为指定格式的String对象public Date parse(String s)
将String对象转换为Date对象
2.4 Calendar类
java.util.Calendar类表示一个“日历类”,可以进行日期运算,它是一个抽象类,不能实例化,一般通过子类GregorianCalendar使用。
有两种方式可以获取GregorianCalendar对象:
- 直接创建GregorianCalendar对象;
Canlendar now = new GregorianCalendar
- 通过Calendar的静态方法getInstance()方法
Calendar.getInstance()//返回一个GregorianCalendar
2.4.1 成员方法
-
public static Calendar getInstance()
获取一个它的子类GregorianCalendar对象 -
public int get(int field)
(field参数表示字段)获取某个字段的值可以使用Calender中定义的常量来表示: Calendar.YEAR : 年 Calendar.MONTH :月(0~11) Calendar.DAY_OF_MONTH:月中的日期 Calendar.HOUR:小时 Calendar.MINUTE:分钟 Calendar.SECOND:秒 Calendar.DAY_OF_WEEK:星期(从星期天开始,星期六结束)
-
public void set(int field,int value)
设置某个字段的值 -
public void add(int field,int amount)
为某个字段增加/减少指定的值 -
public boolean after(Object when)
判断当前时间是否在参数时间之后 -
public boolean before(Object when)
判断当前时间是否在参数时间之前 -
public final void setTime(Date date)
使用给定的Date设置此日历的时间
2.5 BigDecimal类
java.math.BigDecimal(类):做浮点运算的,可以防止精度丢失的问题
构造方法:
BigDecimal(String str):使用一个数字字符串构造一个BigDecimal对象
成员方法:
BigDecimal add(BigDecimal b)
:当前对象 + 参数对象,返回一个新的BigDecimal;BigDecimal subtract(BigDecimal b)
:当前对象 - 参数对象,返回一个新的BigDecimalBigDecimal multiply(BigDecimal multiplicand)
:当前对象 * 参数对象,返回一个新的BigDecimalBigDecimal divide(BigDecimal divisor)
除数,返回一个新的BigDecimalBigDecimal divide(BigDecimal divisor,int roundingMode)
除数,roundingModez表示进位,如roundingMode=5,则表示4舍5入。BigDecimal divide(BigDecimal divisor,int,scale,int roundingMode)
除数,roundingModez表示进位,如roundingMode=5,则表示4舍5入; scale表示要保留的小数位数。