包装类

什么是包装类

java中8中数据类型都有对应的包装类,包装类属于引用数据类型

     int i = 10;
        doSome(i);
    }
    public static void doSome(Object obj){
        System.out.println(obj);
    }

jdk5之前是不能直接将int类型传进去,但是jdk5之后就可以了,因为有了自动拆装箱

8中数据类型的对应包装类型

基本数据类型 包装类型
byte Byte
short Short
long Long
int Integer
float Float
double Double
boolean Boolean
char Character

包装类型都在java.lang包下除了Boolean和Character没有继承Number类外,其他都继承了Number类

拆装箱

Number类中的方法(负责拆箱)

  byteValue():以byte形式返回指定的值

  doubleValue():以double形式返回指定的值

  floatValue():以float形式返回指定的值

  intValue():以int形式返回指定的值

  longValue():以long形式返回指定的值

  shortValue():以short形式返回指定的值

//123这个基本数据类型,进行构造的方法包装达到了:基本数据类型向引用数据类型的转换
//基本数据类型-(转换)————>引用数据类型(装箱)
Integer i = new Integer(123);
//将引用数据类型--(转换)-->基本数据类型
float f = i.floatValue();
System.out.println(f);
//将引用数据类型--(转换)-->基本数据类型(拆箱)
int retValue = i.intValue();
System.out.println(retValue);

Integer构造方法(其他七个依葫芦画瓢)

  Integer(int i)

  Integer(String str)

Integer i = new Integer(100);
Integer i1 = new Integer("100");

但是在jdk9之后就不推荐使用,已经过时了

通过包装类的常量来获取数据类型的最大值和最小值

  MAX_VALUE:最大值

  MIN_VALUE:最小值

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);

自动拆箱和自动装箱

jdk5之后就支持自动拆箱和自动装箱

自动装箱:基本数据类型自动转换为包装类型

自动拆箱:包装类型转换为基本数据类型

byte范围内的所有包装对象都提前创建好,放在方法区的整数型常量池当中,使用这个范围内的数据不需要new

Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);//false

Integer x = 127;
Integer y = 127;
System.out.println(x == y);//true

Integer类中的方法

parseInt(String s):将字符型数字转换成int类型

intValue():手动拆箱

toBinaryString(int i):将十进制转换成二进制字符串

toHexString(int i):将十进制转换成十六进制字符串

toOctalString(int i):将十进制转换成八进制字符串

valueOf(int i):将int类型转换为Integer类型

valueOf(String s):将String类型转换为Integer类型

Date类

date类用于获取系统时间 ,位于java.util包下

获取当前时间

 Date d = new Date();

表示自从标准基准时间(即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

Date d = new Date(1000);

日期格式化

SimpleDateFormat是java.text包下的,专门负责日期格式化

yyyy年

MM月

dd日

HH时

mm分

ss秒

SSS毫秒

注意:在日期格式中,除了y、M、d、H、m、s、S这些字符不能乱写之外,剩下的符号格式随意组合

Date类型转换为String类型

Date d = new Date();
SimpleDateFormat s = new SimpleDateFormat("yyyy:MM:dd HH-mm-ss-SSS");
String l = s.format(d);
System.out.println(l);

String类型转换为Date类型

String time = "2008-08-08:0808 50 888";
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd:HHmmss SSS");
        Date l = s.parse(time);
        System.out.println(l);

获取时间戳

System.currentTimeMillis():获取自1970年1月1日00:00:00 000到现在的时间
long n = System.currentTimeMillis();

获取昨天到此时的时间

Date t = new Date(System.currentTimeMillis() - 24*60*60*1000);
        System.out.println(t);
System类

System.out:out是System的静态变量

System.out.println():println()不是System类的方法,是PrintStream类的方法

System.gc():建议启动垃圾回收器

System.currentTimeMillis():获取时间戳

System.exit(0):退出JVM

数字类

数字格式化

java.text.DecimalFormat专门负责数字格式化

#:代表任意数字

,:千分位

.:小数点

0:位数不够时补0

DecimalFormat df = new DecimalFormat("###,###.0");
String s = df.format(1237989799);
System.out.println(s);//1,237,989,799.0

BigDecimal

BigDecimal属于大数据类型,精度极高,属于java对象,精度极高

BigDecimal b = new BigDecimal(100);

随机数

在java.util包下的Random类可以创建随机数

Random random = new Random();
int n = random.nextInt(101);//生成0~100之间的数字
int i = random.nextInt(99)+1;//生成1~100之间的数字
枚举

枚举赋予了程序在编译时进行检查的功能,枚举编译之后也是生成class文件,枚举也是一种引用数据类型,枚举中每一个值都可以看做是常量

枚举定义:

enum 枚举类型{
    枚举值1,枚举值2
}

枚举的使用:

//颜色枚举类型
public enum color{
    RED,BLUE,YELLOW,BLACK
}

//四季枚举类型
public enum Season{
    SPRING,SUMMER,AUTUMN,WINTER
}

//switch语句支持枚举类型
//switch也支持String,int
//低版本的jdk,只支持int
//高版本的jdk,也支持int、String、枚举
//byte short char也可以,因为存在自动类型转换
switch(Season.AUTUMN){
//必须省略Season
    case SPRING:
    break;
    case SUMMER:
    break;
    case AUTUMN:
    break;
    case WINTER:
    break;
}

深入了解枚举类型

可以将一个枚举类型看作是一个类,继承于java.lang.Enum类,枚举类型成员都默认被final、public、static修饰,枚举的每一个枚举类型成员都可以看做是一个枚举类型的实例

枚举类型的常用方法

values():(静态方法)将枚举类型成员以数组的形式返回

valueOf():(静态方法)将字符串转换为枚举实例

compareTo():(实例方法)比较两个枚举对象在定义时的顺序

ordinal():(实例方法)得到枚举成员的位置索引

public class Demo2 {
    public static void main(String[] args) throws ParseException {
        //values()方法
        Color[] c = Color.values();
        for (Color l:c) {
            System.out.println(l);
        }
        Color o = Color.valueOf("YELLOW");
        System.out.println(o.compareTo(Color.BLUE));//1
        System.out.println(o.ordinal());//2
    }
}
enum Color{
    RED,BLUE,YELLOW,BLACK
}

compareTo()方法A使用compareTo方法和B进行比较(A.compareTo(B))若返回结果为正值,表示A对象先创建,返回负值,表示B对象先创建,返回正值表示同时创建两个对象

枚举类型中的构造方法

在枚举中可以添加构造方法,但是必须是以privite修饰的,即使没有使用修饰符也会默认是private修饰,所以不能使用new创建对象,JVM会自动实例化枚举类型的对象

enum Color{
    RED,BLUE,YELLOW,BLACK;
    private Color(){
        
    }
}

枚举类型的成员后如果有其他方法需要在最后一个枚举类型成员添加分号,否则报错

如何使用有参构造方法

enum Color{
    RED(10),
    BLUE,
    YELLOW,
    BLACK;
    private int i;
    private Color(){

    }
    private Color(int i){
        this.i = i;
    }
    public int getI(){
        return i;
    }
}
异常Exception

什么是异常,java提供异常机制有什么用

  程序执行过程中发生了不正常的情况,而这种不正常情况叫做:异常

  java语言时很完善的语言,提供了异常的处理方式,程序执行过程中出现了不正常情况,java把该异常信息打印输出到控制台,供程序员参考, 程序员看见异常信息后,可以对程序进行修改,让程序更加健壮

  异常信息是JVM打印的

java语言中异常以什么形式出现

  异常在java中以类的形式存在,每一个异常类都可以创建异常对象

异常的分类

  异常分为运行时异常和编译时异常

    所有RuntimeException及子类都属于运行时异常(未受检异常,非受控异常),运行时异常在编写程序阶段可以选中处理或者不处理

    所有Exception的直接子类都叫做编译时异常(受检异常,可控异常),编译时异常在编写程序阶段必须进行处理

异常处理

java中对异常的处理方式包括两种

第一种:在方法声明的位置上使用throws关键字,抛给方法的调用者(相当于推卸责任)

第二种:使用try…catch语句进行异常捕捉 

throws关键字

public class Demo2 {
    public static void main(String[] args) throws ArithmeticException{
        int a = 10;
        int b = 0;
        int i = a/b;
    }
}

try…catch语句

public class Demo2 {
    public static void main(String[] args) throws ArithmeticException{
        int a = 10;
        int b = 0;
        try {
            int i = a/b;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("出异常了@!!!");
        }
    }
}

两种方法的区别:使用throws关键字处理异常如果将异常抛给JVM则会直接结束程序,而使用try…catch语句则不会将异常抛给JVM,程序也不会直接被终止

try…catch语句

try不能单独出现,catch语句可以有多个,finally语句可有可无,finally语句无论是否出现异常都会执行

try语句中的某一行出现异常,该行后面的代码不会执行

异常捕捉和上抛联合使用

main方法不要抛出异常,会导致程序的直接终止

异常方法

getMessage():获取异常简单的描述信息

toString():给出异常的类型和性质

printStackTrace():指出异常的类型、性质、栈层次及出现在程序中的位置

自动义异常

如何自动义异常?

第一步:

  编写一个类继承Exception或者RuntimeException

第二步:

  使用throw关键字抛出异常

public class Demo2 {
    public static void main(String[] args){
        try {
            doSome();
        } catch (A a) {
            System.out.println(a);
        }
    }
    public static void doSome() throws A {
        int a = 10;
        int b = 2;
        int i = a/b;
        throw new A("不给算");
    }
}
class A extends Exception{
    public A(){ }
    public A(String str){
        super(str);
    }
}

异常使用原则

一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类

重写方法不能抛出比原方法更多的异常

错误Error

所有错误只要发生,就会终止程序