新语法结构
1.JAVA的REPL工具:jShell命令
java拥有了像python和scala之类的语言的REPL工具(交互式编程环境,read - evaluate - print - loop) :
jShell。以交互式的方式对语句和表达式进行求值。(即写即得、快速运行)。
注意:利用jShell在没有创建类的情况下,在命令行里直接声明变量,计算表达式,执行语句。无需解释"public static void main(String[] args)"
2.使用举例:
3.常用的jShell命令
-
命令行中通过指令jShell,调取jShell工具
-
常用指令:
-
/help:获取有关使用 jShell 工具的信息
-
/help intro:jShell 工具的简介
-
/list:列出当前 session里所有有效的代码片段
-
/vars:查看当前session下所有创建过的变量
-
/methods:查看当前 session 下所有创建过的方法
-
/imports:列出导入的包
-
/history:键入的内容的历史记录
-
/edit:使用外部代码编译器来编写 Java 代码
-
/exit:退出 jShell 工具
4.异常处理 - try-catch资源关闭
/**
* JDK7之前
*/
@Test
void test01() {
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter("test.txt");
bw = new BufferedWriter(fw);
bw.write("我是你爸爸");
} catch (IOException e){
e.printStackTrace();
} finally {
try {
if (bw != null){
bw.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
在try的后面可以增加一个(),在括号中可以说明流对象并初始化。try中的代码执行完毕,会自动把流对象释放。就不用写finally了。
try(资源对象的声明和初始化){
业务逻辑代码,可能会产生异常
} catch(异常类型1 e){
处理异常代码
} catch(异常类型2 e){
处理异常代码
}
-
注意:
-
1.在try()中说明的资源,无论是否发生异常,无论是否处理异常,都会自动关闭资源对象,不用手动关闭了。
-
2.这些资源实现类必须实现AutoCloseable或Closeable接口,实现其中的close方法。Closeable是AutoCloseable的子接口。Java几乎把所有的"资源类"(包括文件IO的各种类、JDBC编程的Connection、Statement等接口...)都进行了改写,改写后资源类都实现了AutoCloseable或Closeable接口,并实现了close()方法。
-
3.写到try()中的资源类的变量默认是final声明的,不能修改。
-
4.类图如下:
/**
* JDK7中
*/
@Test
void test02() {
try (FileWriter fw = new FileWriter("test.txt");
BufferedWriter bw = new BufferedWriter(fw);
) {
bw.write("我是你爷爷");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 举例2:从test.txt(utf-8)文件中,读取内容,写出到abc.txt(gbk)文件中
* JDK7之前
*/
@Test
void test03() {
BufferedReader br = null;
BufferedWriter bw = null;
try {
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("abc.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
bw = new BufferedWriter(osw);
String str;
while ((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null){
br.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
/**
* 举例2:从test.txt(utf-8)文件中,读取内容,写出到abc.txt(gbk)文件中
* JDK7及JDK7之后中
*/
@Test
void test04() {
try (
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("abc.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");
BufferedWriter bw = new BufferedWriter(osw);
) {
String str;
while ((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
注:很大程度上减少了代码的使用量
5.JDK9的新特性
try的前面可以定义流对象,try后面的()中可以直接引用流对象的名称。try代码执行完毕后,流对象也可以释放掉,也不用写finally了。
A a = new A();
B b = new B();
try(a;b){
可能出现的异常代码
} catch(异常类名 变量名){
异常处理的逻辑
}
@Test
void test5() {
InputStreamReader reader = new InputStreamReader(System.in);
OutputStreamWriter writer = new OutputStreamWriter(System.out);
try (reader;writer) {
// String str;
} catch (IOException e) {
e.printStackTrace();
}
}
6.JDK10的新特性
局部变量的显示类型声明,常常被认为是不必须的,给一个好听的名字反而可以很清楚的表达出下面应该怎么继续。本新特性允许开发人员省略通常不必要的局部变量类型声明,以增加java语言的体验性、可读性。
//可以使用的场景
@Test
void test6() {
//1.局部变量的实例化
var list = new ArrayList<String>();
var set = new LinkedHashSet<Integer>();
//2.增强for循环中的索引
for (var v : list) {
System.out.println(v);
}
//3.传统for循环中
for (var i = 0; i < 100; i++) {
System.out.println(i);
}
//4.返回值类型含复杂泛型结构
var iterator = set.iterator();
HashMap<String, Integer> map = new HashMap<>();
var entrySet =map.entrySet();
}
-
不适合的场景
-
声明一个成员变量
-
声明一个数组变量,并为数组静态初始化(省略new 的情况下)
-
方法的返回值类型
-
方法的参数类型
-
没有初始化的方法内的局部变量声明
-
作为catch块中异常类型
-
Lambda表达式中函数式接口的类型
-
方法引用中函数式接口的类型
7.instanceof模式匹配
JDK14预览
JDK15二次预览
JDK16转正特性
//先判断类型
if (obj instanceof String) {
//然后转换
String s = (String) obj;
//然后才能使用
}
if (obj instanceof String s) {
//如果类型匹配 直接使用
} else {
//如果类型不匹配则不能直接使用
}
@Test
void test7() {
Object obj = new String("hello,java14");
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.contains("java"));
} else {
System.out.println("jsjjdsjsd");
}
}
@Test
void test8() {
Object obj = new String("hello,java14");
if (obj instanceof String str) {
System.out.println(str.contains("java"));
} else {
System.out.println("jsjjdsjsd");
}
}