动力节点springboot3视频笔记第一章
JDK:JDK19OpenJDK: https://jdk.java.net/19/Liberica JDK: https://bell-sw.com/pages/downloads/, 是一个OpenJDK发行版,为云原生,容器特别优化。
Maven:构建和依赖管理,版本选择3.6以上配置本地仓库和阿里云镜像
IDEA2022.3.1Ultimate:主要的开发工具,我是30天试用版本
JDK8-19新增了不少新特性,这里我们把实际常用的新特性,给大家介绍一下。包括以下几个方面:
[if !supportLists]1. [endif]Java Record
[if !supportLists]2. [endif]Swich开关表达式
[if !supportLists]3. [endif]Text Block文本块
[if !supportLists]4. [endif]var 声明局部变量
[if !supportLists]5. [endif]sealed 密封类
Java14中预览的新特性叫做Record,在Java中,Record是一种特殊类型的Java类。可用来创建不可变类,语法简短。参考JEP 395. Jackson 2.12支持Record类。
任何时候创建Java类,都会创建大量的样板代码,我们可能做如下:
[if !supportLists]· [endif]每个字段的set,get方法
[if !supportLists]· [endif]公共的构造方法
[if !supportLists]· [endif]重写hashCode, toString(), equals()方法
[if !supportLists]· [endif]带有全部参数的构造方法
[if !supportLists]· [endif]public访问器
[if !supportLists]· [endif]toString(),hashCode(),equals()
[if !supportLists]· [endif]无set,get方法。没有遵循Bean的命名规范
[if !supportLists]· [endif]final类,不能继承Record,Record为隐士的final类。除此之外与普通类一样
[if !supportLists]· [endif]不可变类,通过构造创建Record
[if !supportLists]· [endif]final属性,不可修改
[if !supportLists]· [endif]不能声明实例属性,能声明static成员
IDEA创建新的Maven工程 Lession01-feature
step1: 创建Student Recordpublic record Student(Integer id,String name,String email,Integer age) {}
现在能查看控制台输出:lisi = Student[id=1001, name=lisi,email=lisi@qq.com, age=20]zhangsan = Student[id=1002, name=zhangsan, email=lisi@qq.com, age=20]lisi.equals(zhangsan) = falselisi.name() = lisizhangsan.name() = zhangsan
Record是Java类,和普通Java类一样定义方法。下面定义方法concat,将姓名和年龄一起打印输出。我们创建普通的方法concat,将name和age连接为一个字符串输出。
Record类定义静态方法,试用静态方法与普通类一样。step1: 创建静态方法
step2:编译Student.java -> Student.class
Java Record可以与普通类一样实现接口,重写接口的方法。
public interface PrintInterface {/** 输出自定义描述信息 */void print();}
step2: 创建新的Record实现接口,重写接口的方法,实现当前Record有关的业务逻辑
Record可以作为局部对象使用。在代码块中定义并使用Record,下面定义一个SaleRecord
控制台输出:销售记录= SaleRecord[saleId=S22020301, productName=手机, money=3000.0]
多个Record可以组合定义, 一个Record能够包含其他的Record。我们定义Record为Customer,存储客户信息,包含了Address和PhoneNumber两个Record
instanceof 能够与 Java Record一起使用。编译器知道记录组件的确切数量和类型。
step1:声明Person Record,拥有两个属性name和agepublic record Person(String name,Integer age) {}
step2: 在一个业务方法判断当是Record类型时,继续判断age年龄是否满足18岁。
*总结*1. abstract类java.lang.Record是所有Record的父类。2. 有对于equals(),hashCode(),toString()方法的定义说明3. Record类能够实现 java.io.Serializable序列化或反序列化4. Record支持泛型,例如 record Gif( T t ) { }5. java.lang.Class类与Record类有关的两个方法:boolean isRecord() : 判断一个类是否是Record类型RecordComponent[] getRecordComponents():Record的数组,表示此记录类的所有记录组件
[if !supportLists]· [endif]支持箭头表达式
[if !supportLists]· [endif]支持yied返回值
[if !supportLists]· [endif]支持Java Record
step1:新的case 标签week:表示周日(1)到周六(7),1和7是休息日,其他是工作日。如果1-7以外为无需日期
语法变量= switch(value) { case v1: yield 结果值; case v2: yield 结果值;case v3,v4,v5.. yield 结果值 }
System.out.println("week = " + memo);
无需中间变量,switch作为表达式计算,可以得到结果。yield是表达式的返回值
switch表达式中使用record,结合 case 标签-> 表达式,yield实现复杂的计算step1: 准备三个Record
case Line , Rectangle,Shape 在代码块执行多条语句,或者箭头->表达式。
Text Block处理多行文本十分方便,省时省力。无需连接 "+",单引号,换行符等。Java 15 ,参考JEP 378.
String myname= """zhangsan20"""; //正确
文本块定义要求:v文本块以三个双引号字符开始,后跟一个行结束符。v不能将文本块放在单行上v文本块的内容也不能在没有中间行结束符的情况下跟随三个开头双引号
三个双引号字符""" 与两个双引号""的字符串处理是一样的。与普通字符串一样使用。例如equals() , "==" , 连接字符串(”+“), 作为方法的参数等。
Text Block使用方式与普通字符串一样,==,equals比较,调用String类的方法。
step1:字符串比较与方法public void fun1() {String s1= """lisi""";String s2 = """lisi""";
//比较字符串boolean b1 = s1.equals(s2);System.out.println("b1 = " + b1);
//使用 == 的比较boolean b2 = s1 == s2;System.out.println("b2 = " + b2);
step2:输出结果b1 = trueb2 = truesub = hello
[if !supportLists]1. [endif]JEP 378中包含空格处理的详细算法说明。
[if !supportLists]2. [endif]Text Block中的缩进会自动去除,左侧和右侧的。
[if !supportLists]3. [endif]要保留左侧的缩进,空格。将文本块的内容向左移动(tab键)
public void fun2(){//按tab向右移动,保留左侧空格String html= """动力节点,Java黄埔军校""";System.out.println( html);}
1.2.3.4 文本块的方法Text Block的格式方法formatted()
输出:Spring Boot是一个快速开发框架 基于Spring框架,创建Spring应用 内嵌Web服务器,以jar或war方式运行
在JDK 10及更高版本中,您可以使用var标识符声明具有非空初始化式的局部变量,这可以帮助您编写简洁的代码,消除冗余信息使代码更具可读性,谨慎使用.
[if !supportLists]1. [endif]var是一个保留字,不是关键字(可以声明var为变量名)
[if !supportLists]2. [endif]方法内声明的局部变量,必须有初值
[if !supportLists]3. [endif]每次声明一个变量,不可复合声明多个变量。var s1="Hello", age=20; //Error
[if !supportLists]4. [endif]var动态类型是编译器根据变量所赋的值来推断类型
[if !supportLists]5. [endif]var代替显示类型,代码简洁,减少不必要的排版,混乱。
[if !supportLists]· [endif]代码简洁和整齐。
[if !supportLists]· [endif]降低了程序的可读性(无强类型声明)
[if !supportLists]· [endif]简单的临时变量
[if !supportLists]· [endif]复杂,多步骤逻辑,嵌套的表达式等,简短的变量有助理解代码
[if !supportLists]· [endif]能够确定变量初始值
[if !supportLists]· [endif]变量类型比较长时
Sealed Classes主要特点是限制继承,Java中通过继承增强,扩展了类的能力,复用某些功能。当这种能力不受控。与原有类的设计相违背,导致不预见的异常逻辑。
[if !supportLists]· [endif]final关键字,修饰类不能被继承
[if !supportLists]· [endif]private限制私有类
sealed 作为关键字可在class和interface上使用,结合permits 关键字。定义限制继承的密封类
sealed class 类名 permits 子类1,子类N列表 {}
[if !supportLists]1. [endif]final 终结,依然是密封的
[if !supportLists]2. [endif]sealed 子类是密封类,需要子类实现
[if !supportLists]3. [endif]non-sealed 非密封类,扩展使用,不受限
public sealed interface SomeService permits SomeServiceImpl {void doThing();}
public final class SomeServiceImpl implements SomeService {@Override public void doThing() {}}