文章目录
背景
Groovy是JVM平台上的一门脚本语言, 本身也支持OOP,也具有类这个概念. Groovy本身可以简化Java编程过程, Groovy的类也体现了这一点, 简化了传统Java类的构建过程, 使得构建更加简单.
一个简单的例子
class Student {
def name
def number
String toString(){
return "student name is ${name} and number is ${number}"
}
}
def student = new Student(name:'xiaoming', number:1)
println student
println student.name
println student.getName()
println student.number
println student.getNumber()
上面一个简单的例子反应了Groovy语言中类的很多特点. 第一, 字段默认是public的(当然可以使用其他访问权限的关键字修饰如private protected),第二简单的定义字段其实其访问的getter与setter方法也同时定义了, 上述例子中的student.name
和 student.getName()
是等价的,其实都是调用get
相关的方法. 第三, 对象创建时的初始化, 上述简单的例子中使用def student = new Student(name:'xiaoming', number:1)
来创建一个Student
类的对象, 其中传递的参数是一个HashMap
. 其实这个简单的初始化过程翻译成Java代码包含了如下的几个步骤:
Student student = new Student(); // 调用默认的构造器
student.setName("xiaoming");
student.setNumber(1)
可见使用Groovy的class 无论是创建class 还是初始化构建一个对象都减少了代码量, 是编写更加的快捷方便
自定义构造函数与默认构造函数
上述的例子中使用的是默认的构造函数,但是如果使用自定义的构造函数对属性进行初始化会出现什么样的结果,如下例子:
class Student {
def name
def number
def Student(name, number) {
this.name = name
this.number = number
}
String toString(){
return "student name is ${name} and number is ${number}"
}
}
//def student = new Student(name:'xiaoming', number:1) //Error
def student = new Student('xiaoming', 1)
println student
println student.name
println student.getName()
println student.number
println student.getNumber()
如果我们依然使用HashMap
传递初始化的值,那么会有如下的错误:
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Student(LinkedHashMap)
自定义的构造函数将原有的默认构造函数覆盖, 因此解决方法还是加上默认的构造函数:
class Student {
def name
def number
def Student(){
}
def Student(name, number) {
this.name = name
this.number = number
}
String toString(){
return "student name is ${name} and number is ${number}"
}
}
def student = new Student(name:'xiaoming', number:1) //Error
//def student = new Student('xiaoming', 1)
println student
println student.name
println student.getName()
println student.number
println student.getNumber()
可以保证运行的正确性.
操作符重载
Groovy中所有操作的事物都是对象, 使用任何操作符对对象进行操作其实都是调用对象中的对应的方法, 预定义的操作符号都有约定俗成的类方法, 对应列表如下:
比如使用操作符号重载完成两个list的加法和减法:
class Exlist{
def values
def plus(arg){
def res = []
if(values.size() == arg.values.size()) {
def size = values.size()
for(i in 0..<size) {
res << values[i] + arg.values[i]
}
}
return res
}
def minus(arg) {
def res = []
if(values.size() == arg.values.size()) {
def size = values.size()
for(i in 0..<size) {
res << values[i] - arg.values[i]
}
}
return res
}
}
def arg1 = new Exlist(values:[1, 2, 3, 4])
def arg2 = new Exlist(values:[3, 4, 5, 6])
println (arg1 + arg2)
println (arg1 - arg2)
运行结果:
[4, 6, 8, 10]
[-2, -2, -2, -2]
小结
Groovy本身就是基于JVM的脚本话语言, 原则即是简洁优雅的编写代码, 因此其类相关的操作比Java的代码量都小.其他的关于抽象类, 接口以及继承等问题与Java类似,本文将不再赘述.