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. 求100!
package 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();