原本准备一天写一篇的,只是由于工作的原因,没有那么多时间看书,所以了解的东西自然也就相应的少了,也就没什么东西可写了。
看了一些Groovy的东西后,又有另一样东西吸引了我,那就是她的纯面向对象,呵,面向对象已经听了好多年了,而且也用了好多年了,但大家都知道,既使是我们熟悉的Java,也不是纯面向对象的,在Java里,同时存在着原类型和对象,而在Groovy里,却是一切皆为对象。
大家都知道,Java里是不能对原类型执行一些平时对对象所做的操作的,如toString()这些,如果想要这样做,则需将其转换成相对应的Wrapper,在Java里原类型相应的都有一些Wrapper,如int对应的java.lang.Integer。
虽然在Groovy里,你可能也会看到如Java里定义原类型一样的语句,如:
int i = 1
表面上是一样,但实际上,她还是会把变量转换成类似于Java里的Wrapper类型的,也就是说,你可以对变量i执行如toString()这些在Java不能对原类型执行的方法。原因就是因为在Groovy里一切皆为对象,呵,是不是很吸引人?
与Java相似,在定义基本的数据类型时,可以直接根据字面指定,如:
Integer -> 100
Long -> 100L/100l
Float -> 100F/100f
Double -> 100D/100d
在这里比Java多了两个可以直接由字面表示的类型:
BigInteger -> 100G/100g
BigDecimal -> 100.123G/100.123g
在数据后加G(or g)来标识这两种类型。
BigDecimal为非整型的数字的默认类型,如果不使用Float和Double的后缀标识,如F或D,将使用BigDecimal。
在Groovy里定义变量也有很趣,可以有两种方式,一种是定义静态类型,也就是在定义之初就指定变量的类型,如:
int i = 100
String s = "hello"
还有一种,则是动态类型,在定义的时候不指定其类型,之后可以随意的更改此对象的类型,如:
def i = 100
i = "string"
i = true
在Java里,一些操作符,如+, -, *, /这些,只是对原类型数据进行操作的,虽然个别的也可以由其他类型使用。但在Groovy里,这些对应的全是方法,这样的写法只是一种简写,它还会调用相应的类里面的方法的,如100+200,其实是调用100.plus(200);100-200调用的是100.minus(200)。所有的这些,都是对方法的调用。
在Groovy里,这些操作符将不再是原类型的专用,你完全可以执行这样的操作:
Person p1 = new Person()
Person p2 = new Person()
Person p3
p3 = p1 + p2
p3 = p1 - p2
p3 = p1 * p2
p3 = p1 / p2
println p1 == p2
执行上面的例子的前提是Person类实现了相应的方法。这里只是随便瞎写一个例子,一点实际意义都没有。另外,在重载equals时,最好复写hashCode方法,重载这个方法已经不新鲜了,参见java.lang.Object#equals,在这里一块写出来,只是为上说明,可以直接用==操作符来简写equals方法的调用。
class Person {
private String name
Person() {}
Person(name) {
this.name = name
}
Person plus(Person b) {
if (null == b) return null
return new Person(this.name + " + " + b.name)
}
Person minus(Person b) {
if (null == b) return null
return new Person(this.name + " - " + b.name)
}
Person multiply(Person b) {
if (null == b) return null
return new Person(this.name + " * " + b.name)
}
Person div(Person b) {
if (null == b) return null
return new Person(this.name + " / " + b.name)
}
Person mod(Person b) {
if (null == b) return null
return new Person(this.name + " % " + b.name)
}
Person power(Person b) {
if (null == b) return null
return new Person(this.name + " ** " + b.name)
}
boolean equals(Object b) {
if (null == b) return false
if (!(b instanceof Person)) return false
if (this.name != b.name) return false
return true
}
int hashCode() {
return this.name.hashCode()
}
}
看到这些,让我想起在学C++时最讨厌的运算符重载,呵呵,不过在这里确实是存在的。
在Groovy里,可以重载的方法有很多,可以相阅相关的资料来了解,在《Groovy in Action》上有详细的列表。
虽然这对于Java是一个进步,但我却不是很喜欢这种方式,因为要实现+,我在程序里要实现的却是plus方法,而在Ruby里,直接实现+就OK了,或许是因为历史原因吧,还没有深入的研究,不过猜想应该是Java的罪过。
虽然人家都说,时间就像乳沟一样,挤挤总会有的,但这段时间确实是太忙了,所以进度也是奇慢无比,只能给自己一个借口,美其名曰:小步前进。呵
分享到:
相关推荐
matplotlib-3.6.3-cp39-cp39-linux_armv7l.whl
numpy-2.0.1-cp39-cp39-linux_armv7l.whl
基于springboot个人公务员考试管理系统源码数据库文档.zip
onnxruntime-1.13.1-cp310-cp310-win_amd64.whl
基于springboot的西山区家政服务网站源码数据库文档.zip
Linux环境下,关于C++静态库的封装和调用代码。 TestLib是库目录。 TestLibCall是调用库的目录。
基于springboot软件技术交流平台源码数据库文档.zip
numpy-1.20.1-cp39-cp39-linux_armv7l.whl
ASP.NET酒店管理系统源码(WPF) 一、源码特点 采用WPF进行开发的酒店管理系统源码,界面相当美观,功能齐全 二、菜单功能 1、预订登记:可选择入住时间、离店时间、所在城市、证件类型,保存、删除、查询、返回 2、住宿结算:新增入住、保存、删除、查询、返回 3、今日盘点:查询、返回 4、查询统计: 5、房间管理:增加房间类型、删除类型、增加房间、删除房间、保存、返回 6、用户管理:增加用户、删除用户、保存、返回 7、系统配置:基本功能 8、显示当前系统时间等功能的实现
坠落的天空小游戏图片和代码
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
环境说明: 开发语言:python Python版本:3.6.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:pycharm
基于springboot高校学术交流平台源码数据库文档.zip
onnxruntime-1.16.2-cp310-cp310-win_amd64.whl
基于springboot+vue的实践性教学系统源码数据库文档.zip
基于springboot的校园二手物品交易系统源码数据库文档.zip
numpy-1.23.5-cp39-cp39-linux_armv7l.whl
bimdata_api_client-4.0.2-py3-none-any.whl
环境说明: 开发语言:PHP 框架:原生php/thinkphp5 服务器:Apache 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat 11 运行软件:小皮phpStudy
基于SpringBoot的中老年人文化活动平台源码数据库文档.zip