建议安装idea2023版本,新版占用资源少,增加了些新功能。
在接口中申明private方法,不会被外部实现。
1.1、接口类:
public interface LoginInterface { private void login(){ System.out.println("登录方法"); } private void register(){ System.out.println("注册方法"); } default void interfaceMethod(){ login(); register(); } }
1.2、实现类:
public class LoginImpl implements LoginInterface{ @Override public void interfaceMethod() { LoginInterface.super.interfaceMethod(); } public static void main(String[] args) { LoginImpl loginImpl = new LoginImpl(); loginImpl.interfaceMethod(); } }
实现接口,只能看到default方法,无法实现private方法
java11特性中,方法内使用var申明变量,可以被编译器自动判断类型。
2.1、代码示例
var list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); var set = new LinkedHashMap<>(); set.put("1",1); set.put("2",2); for (var l : list) { System.out.println(l); } for (var s : set.entrySet()){ System.out.println(s); } }
输出结果
1 2 3 1=1 2=2
2.2、不适用场景
1)只能在方法内部使用(局部变量);
2)必须有初始化值且不能为null;
3)不能定义为方法的返回类型。
4) 方法的返回值类型
5)方法的参数类型
三引号取代了双引号,因为双引号的内容会夹带一堆换行符,而三引号里面就单纯是内容,很清晰。
3.1、代码示例
String text1 = "The Sound of silence\n" + "Hello darkness, my old friend\n" + "I've come to talk with you again\n" + "Because a vision softly creeping\n" + "Left its seeds while I was sleeping\n" + "And the vision that was planted in my brain\n" + "Still remains\n" + "Within the sound of silence"; // 文本块 String str= """ The Sound of silence Hello darkness, my old friend I've come to talk with you again Because a vision softly creeping Left its seeds while I was sleeping And the vision that was planted in my brain Still remains Within the sound of silence """; System.out.println(text1); System.out.println(str);
java16新特性,对instanceof做了增强。
4.1、代码示例
@Test void testInstanceOf(){ test1("hello world"); test2("字符串内容"); } static void test1(Object obj){ if(obj instanceof String){ String s = (String) obj; System.out.println(s); } } static void test2(Object obj){ if(obj instanceof String){ System.out.println(obj); } }
如果,idea安装了阿里巴巴代码规范插件,鼠标悬浮在test1方法s变量有替换代码提示。
注意:instanceof 如果需要判断必须用&&,不能使用||,因为instanceof本来就匹配判断,java确保&&后面变量一定存在,但无法保证||后面变量存在,会报错!
record实现了一个简单的数据载体类,避免了编写:构造函数,访问器,equals()、hasCode()、toString()等等。 当你使用record声明类时,该类具有public get、hashcode、equals、toString、构造器等结构,减少了代码编写量。
代码示例
public record Person(String name,int age,String say) { public static String hobby = "zhangsan"; public String upName(){ return name.toUpperCase(); } public static String getHobby(){ return hobby; } //不可以声明非静态的属性 // private int id;//报错 //不可以将record定义的类声明为abstract的 //abstract record Order(){ // //} //不可以给record定义的类声明显式的父类(非Record类) //record Order() extends Thread{ // //} } @Test void recordClass(){ Person person = new Person("wjx",18,"hi"); Person.hobby="eat"; System.out.println(person.name()); System.out.println(person.upName()); System.out.println(Person.getHobby()); }
record不适合场景
它不是 JavaBeans 的直接替代品,因为record的方法不符合 JavaBeans 的 get 标准。另外 JavaBeans通常是可变的,而记录是不可变的。尽管它们的用途有点像,但并不会这样取代javaBeans。
1)、支持箭头语法
2)、支持表达式
3)、支持case null
6.1、箭头语法
private static void fruits(int i) { switch (i) { case 1 -> System.err.println("香蕉"); case 2 -> System.err.println("猕猴桃"); default -> System.err.println("苹果"); } }
6.2、表达式
/** * 单表达式 */ private static String fruits(int i) { return switch (i) { case 1 -> "香蕉"; case 2 -> "猕猴桃"; default -> "苹果"; }; } /** * 多表达式 */ private static String fruitsNew(int i) { return switch (i) { case 1, 2 -> { System.err.println("来一个香蕉"); yield "香蕉来咯"; } case 3, 4 -> { System.err.println("来一个猕猴桃"); yield"猕猴桃来咯"; } default -> { System.err.println("没的选就来个苹果吧"); yield "苹果来咯"; } }; }
6.3、支持null,传入null值不会报错
private static void fruits(String s) { switch (s) { case "1" -> System.err.println("香蕉"); case null -> System.err.println("null"); default -> System.err.println("苹果"); } }
注意:
箭头语法,冒号和箭头不能同时存在;
多表达式要使用花括号,并通过yield关键字返回;
case null是预览功能,在IDEA - Project Structure - Modules中选择Language Level为17(Preview)才能编译通过。
jdk新特性不仅仅以上几点,比如不可变集合、模块化、String和Stream增强等等,之所以没列出来,估计大概率用不到。
通过这些特性,发现java语言有python、go语言的影子,说明它在不断进步。
联系客服