12.常用类API

1. 静态代码块和非静态代码块

静态代码块: jvm运行时加载时,只运行一次。 例如:加载驱动

非静态代码块:每次实例化的时候调用。


public class A {
	private int a1;
	{
		// 非静态代码块: 每次实例化的时候
		System.out.println("非静态代码块");
	}
	static {
		// 静态代码块: jvm运行时加载时
		// 场景:只调用一次的时候。例如加载驱动
		System.out.println("静态代码块");
		a2 = 10;
	}
	static int a2;
	public A() {
		super();
		System.out.println("构造方法");
	}
	
}
public class TestMain1 {
	public static void main(String[] args) {
//		System.out.println(A.a2);
//		System.out.println(A.a2);
		A a = new A();
		A a1 = new A();
	}
}

2. BigInteger/BigDecimal

BigInteger: 超大整数,对象类型。

  • add(): 加法
  • substract(); 减法
  • multiply(): 乘法
  • divid(); 除法
1.100package com.etc.lesson12;

import java.math.BigInteger;

public class TestMain2 {

	public static void main(String[] args) {
		
		BigInteger n = new BigInteger("100");
		BigInteger r = abc(n);
		System.out.println(r);
		BigInteger bi = n.subtract(new BigInteger("1"));
		BigInteger bi1 = n.multiply(abc(n));
		System.out.println(bi);
	}
	private static BigInteger abc(BigInteger p_n) {
		if (p_n.intValue() == 1) {
			return new BigInteger("1");
		} else {
			return p_n.multiply(abc(p_n.subtract(new BigInteger("1"))));
		}
	}
} 

BigDecimal : 大型的浮点型

add. substract , mutiply,

  • divide(); 无线循环小数

    MathContext.DECIMAL32|64|128: 算数上下文。 以多少位进行运算

    RoundingMode.HALF_UP|CEILLING|FLOOR| 四舍五入,数轴取右,数轴取左

    BigDecimal .setScale(); 用返回值的

System.out.println(0.1 + 0.2 == 0.3);
System.out.println(0.1 + 0.2);
// 金额的运算不允许浮点型运算的

System.out.println(0.1 + 0.2 == 0.3);
System.out.println(0.1 + 0.2);

// 金额的运算不允许浮点型运算的
BigDecimal bd1 = new BigDecimal(0.1);
BigDecimal bd2 = new BigDecimal(0.2);

// 通过指定算数上下文MathContext的常量确定位数
BigDecimal bd3 = bd1.add(bd2, MathContext.DECIMAL64);

System.out.println(bd3.doubleValue());
System.out.println(bd3);

// 精确位数
BigDecimal bd4 = bd3.setScale(2);
System.out.println(bd4);

// 精确位数,指定舍入模式
System.out.println(new BigDecimal(3.1405).setScale(2, RoundingMode.HALF_UP));

// 除法特殊: 无线循环小数
BigDecimal bd5 = new BigDecimal(1).
    divide(new BigDecimal(3) , MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP);
System.out.println(bd5);

BigDecimal bd6 = TestMain3.divide(new BigDecimal(1), new BigDecimal(3));
System.out.println(bd6);


BigDecimal bd7 = new BigDecimal(3.1405, MathContext.DECIMAL32);
System.out.println(bd7); 
System.out.println(bd7.setScale(2, RoundingMode.HALF_UP)); // 用返回值的
System.out.println(bd7); // bd7没变化

	
// 金额相关的时候会封装一个工具类 
public static BigDecimal divide(BigDecimal a1, BigDecimal a2) {
    return a1.divide(a2, MathContext.DECIMAL64).setScale(2, RoundingMode.FLOOR);
}

3. Arrays工具类。 java.util.Arrays

看以前

System.arraycopy(五个参数)

4. 内部类

静态内部类

​ 直接就可以用。属于外部类的

非静态内部类

​ 属于对象的。所以要公开方法实例化。

​ 访问外部类属性 Outer.this.属性

局部内部类

​ 只活在当前的局部作用域中,定义的后面。

​ 局部内部类访问局部变量,必须时final的。


public class Outter {

	private String name = "tom";
	
	public static void main(String[] args) {
		
		Outter.InnerA a1 = new Outter.InnerA();
		// 编译出几个class文件
		
//		Outter.InnerB a2 = new Outter.InnerB();
		Outter a2 = new Outter();
		Outter.InnerB a3 = a2.newInstance();
		a3.showName();
		
		final int b = 1;
		class JuInner {
			public void abc() {
				System.out.println(b);
			}
		}
		JuInner a = new JuInner();
		a.abc();
			
	}
		
	public InnerB newInstance() {
		InnerB b = new InnerB();
		return b;
	}
	
	public class InnerB {
		
		public void showName() {
			System.out.println(name);
			System.out.println(Outter.this.name);
		}
	}
	
	private static class InnerA {
		
	}
}

※局部匿名内部类

		
class TianQingNiuMang extends Animal {

    @Override
    public void eat() {
        System.out.println("TianQingNiuMang@ eat");
    }
}

Animal an1 = new TianQingNiuMang();
an1.eat();

// 局部匿名内部类
Animal an2 = new Animal() {

    @Override
    public void eat() {
        System.out.println("匿名的一种类型@ eat");
    }
};

an2.eat();
posted @ 2021-04-11 12:32  剑心空明  阅读(0)  评论(0编辑  收藏  举报  来源