Java基本数据类型 Java语言细节特性 lambda表达式 import静态成员 打印异常栈
- 2016-04-03 23:11:00
- admin
- 原创 1994
一、Java基本数据类型
byte 1字节
short 2字节
int 4字节
long 8字节
float 4字节
double 8字节
char 2字节
boolean 1字节
补充说明:
1、Java没有无符号类型,long常量一般以L字符结尾,数值可以使用下划线提高可读性;
2、对象类型可以获取最小值和最大值,比如Integer.MIN_VALUE和Integer.MAX_VALUE;
3、float精度23位,无法表示所有整数,double精度52位,可以表示所有整数;
4、1/0抛出异常,1/0.0等于Infinity,-1/0.0等于-Infinity,0/0.0等于NaN;
5、字符串使用UTF16进行编码,所以char类型长度是2字节;
6、new出来对象的元素默认都有初始化,包括数组;
二、Java语言细节特性
对象成员初始化顺序:
1、普通成员按申明顺序初始化,后面的成员可以使用前面成员初始化;
2、静态成员按申明顺序初始化,后面的成员可以使用前面成员初始化;
静态初始化clinit:
1、调用时机:类被初次访问的时候,后于静态变量初始化;
2、调用线程:初次访问的线程;
3、调用类:ClassLoader;
4、调用特性:虽然没有ACC_SYNCHRONIZED标志,但ClassLoader仍然会加锁;
匿名类初始化:
1、匿名类没有名称,所以不能申明构造函数;
2、匿名类支持通过{}语句块申明初始化语句;
3、匿名类初始化语句在默认构造函数后面执行;
方法多态细节:
1、方法重写时访问权限可以改变,不影响查找方法,但执行方法前会先检查是否有权限执行;
2、方法重写时返回值可以是子类,编译器会自动生成胶水方法,胶水方法即为实际重写版本;
泛型机制细节:
1、Java泛型会擦除类型到Object,泛型只是在编译时进行编译检查;
2、因为擦除类型,所以不允许new泛型参数或者new泛型参数数组;
3、静态方法不能使用类的泛型参数,需要自己定义独立的泛型参数;
4、通配泛型解决了动态类型赋值,包含:?无边界通配、? extends上限通配、? super下限通配;
5、读写限制:?无边界通配只能读Object类型,? extends上限通配只能读指定类型,? super下限通配只能写指定类型;
try-with-resource:
1、try-with-resource非常靠谱,初始化的变量一定会被关掉;
2、语法格式是try(){}catch(){},比普通的try多一个圆括号,圆括号里面放资源的申明与赋值;
3、资源必须实现接口AutoCloseable,代码逻辑结束时,会自动调用资源的close方法;
4、圆括号的代码发生异常会被捕捉,自动生成的close代码发生异常也会被捕捉;
5、业务代码和生成代码都发生异常,则生成代码异常会被抑制;
6、圆括号的变量不允许重新赋值;
1、传值在堆栈上面放置变量内容,传引用在堆栈上面放置变量地址;
2、for循环变量作用域在循环内部,所以多个循环可以用同一个变量名;
3、break+label和continue+label虚拟机底层实现是一个goto指令;
4、java和javax都是标准API,只不过javax是扩展API,加密模块jce就位于javax;
5、null instanceof Object:System.out.println(null instanceof Object),false;
6、Exception.toString默认打印异常类名,所以一定非空;
三、lambda表达式
1、JDK8支持lambda表达式和静态函数指针,lambda表达式使用->符号,静态函数指针使用双冒号;
2、lambda表达式和函数指针使用invokedynamic指令,且会在BSM区域生成一段胶水代码;
3、通过invokedynamic指令和胶水代码生成一个接口的实例,所以返回值必须指向一个接口;
4、lambda表达式本身会生成一个私有静态方法,方法名是lambda$num,引用局部变量导致静态方法增加参数;
5、Predicate支持and、or、negate多种操作,Consumer支持andThen组合多个Comsumer,组合对象按顺序执行;
6、stream用于对集合或数组进行流式过滤,支持多次filter,filter不影响原有数据,过滤完后再进行消费;
7、Optional类可以更优雅的解决空指针异常,orElseGet和orElseThrow方法可以使用Supplier对象;
lambda表达式接口:
1、interface Consumer<T>,单参数无返回值操作;
2、Interface BiConsumer<T,U>,双参数无返回值操作;
3、interface Function<T,R>,单参数有返回值操作;
4、Interface BiFunction<T,U,R>,双参数有返回值操作;
5、interface Predicate<T>,单参数布尔验证操作;
6、Interface BiPredicate<T,U>,双参数布尔验证操作;
7、Interface Supplier<T>,无参数返回数据操作;
四、import静态成员
import静态成员用于引入静态变量、静态方法、静态类,可以简化代码编写。
import static java.lang.System.out;
public static void staticImport() {
out.println("hello world!");
}
五、打印异常栈
public static void printStackTraces(StackTraceElement[] stacks) {
for (StackTraceElement stack: stacks) {
String info = String.format("%s:%s:%s",
stack.getClassName(), stack.getMethodName(), stack.getLineNumber());
System.out.println(info);
}
}
public static void getStackTraces() {
try {
throw new Exception("MyException");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getCause());
StackTraceElement[] stacks = e.getStackTrace();
printStackTraces(stacks);
}
try {
throw new Exception(new Exception("MyException"));
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getCause());
StackTraceElement[] stacks = e.getStackTrace();
printStackTraces(stacks);
}
}
输出:
MyException
null
logdemo.LogDemo:getStackTraces:33
logdemo.LogDemo:main:57
java.lang.Exception: MyException
java.lang.Exception: MyException
logdemo.LogDemo:getStackTraces:41
logdemo.LogDemo:main:57