以前我们使用class关键字来定义类,但是从Java16开始,我们将多一个关键字record,也可以用来定义类。record关键字的引入主要是为了提供一种更加简洁紧凑的方式来定义final类。让我们仔细看看记录类的细节。配套视频教程:Java16新特性:使用recorddeclarationclassdeclarationrecordclassdeclarationrecordclassdeclaration基本语法:recordrange(intstart,intend){}我们知道class类可以存在于单独的文件中,也可以存在于其他类中该声明。record类也是如此,它有几种声明方式:单独文件声明:publicrecordrange(intstart,intend){}类内部声明:publicclassDidispaceTest{publicrecordrange(intstart,intend){}}函数内声明:publicclassDidispaceTest{publicvoidtest(){publicrecordrange(intstart,intend){}}}recordclass详解知道声明后你肯定会想要用recordPoint元素声明,它有什么能力?因为record关键字声明类主要是为了简化一些类的声明,本质上是一个特殊的类,或者说是某个模板的类。record声明的类有这些特点:它是一个final类,自动实现了equals,hashCode,toString函数成员变量都是public属性。所以,对于之前写的range类,就相当于这样一个类:publicfinalclassrange{finalintstart;最终的结局;公共范围(intstart,intend){this.start=start;this.end=结束;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;如果(o==null||getClass()!=o.getClass())返回false;范围范围=(范围)o;returnstart==range.start&&end==range.end;}@OverridepublicinthashCode(){returnObjects.hash(start,end);}@OverridepublicStringtoString(){return"range{"+"start="+x+",end="+y+'}';}publicintstart(){返回开始;}publicintend(){返回结束;}}因为有些函数是隐藏的,定义range的时候我们是看不到的,所以我们可以试着写这么一段测试代码来验证一下:@Testpublicvoidtest(){ranger=n新范围(100、200);log.info(r.toString());范围r2=新范围(100,200);log.info(String.valueOf(r.equals(r2)));}定义成员因为record语句的本质也是一个类,所以定义成员函数肯定是可以的。例如,我们可以这样定义记录类中的成员函数:recordrange(intstart,intend){intdistance(){returnend-start;然后,你可以这样称呼它:ranger=newrange(100,200);r.distance();如果你在学习过程中遇到困难?您可以加入我们超优质的技术交流群,参与交流讨论,更好的学习进步!另外,不要走开,关注我,继续更新Java新特性专栏!欢迎来到我的公众号:程序员DD。第一时间了解行业前沿资讯,分享深度技术干货,获取优质学习资源
