Java基本数据类型 Java语言细节特性 lambda表达式 import静态成员 打印异常栈

2017-01-03 23:11:00
admin
原创 1735
摘要:Java基本数据类型 Java语言细节特性 lambda表达式 import静态成员 打印异常栈

一、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、方法重写时返回值可以是子类,编译器会自动生成胶水方法,胶水方法即为实际重写版本;


泛型机制细节:

1、Java泛型会擦除类型到Object,泛型只是在编译时进行编译检查;

2、因为擦除类型,所以不允许new泛型参数或者new泛型参数数组;

3、静态方法不能使用类的泛型参数,需要自己定义独立的泛型参数;

4、通配泛型解决了动态类型赋值,包含:?无边界通配、? extends上限通配、? super下限通配;

5、读写限制:?无边界通配只能读Object类型,? extends上限通配只能读指定类型? super下限通配只能写指定类型;


try-with-resource:

1、语法格式是try(){}catch(){},比普通的try多一个圆括号,圆括号里面放资源的申明与赋值;

2、资源必须实现接口AutoCloseable,代码逻辑结束时,会自动调用资源的close方法;

3、圆括号的代码发生异常会被捕捉,自动生成的close代码发生异常也会被捕捉;

4、业务代码和生成代码都发生异常,则生成代码异常会被抑制

5、圆括号的变量不允许重新赋值;


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

发表评论
评论通过审核之后才会显示。