Gradle系列——Groovy面向对象(基于Groovy文档4.0.4)day2-2
Groovy面向对象
类型
原始类型
整数类型
- byte:8位
- short:16位
- int:32位
- long:64位
浮点型
- float:32位
- double:64位
布尔型
- true
- false
char
char :16位
包装类型
- Boolean
- Character
- Short
- Long
- Integer
- Float
- Double
当原始类型调用.toString()
或者 .equals(other)
可以进行自动包装和展开
继承
使用extends
关键字,Groovy同样也不支持多重继承,可以继承类或者接口(类继承类,接口继承接口)
class Test3 extends Test2{
...
}
//虽然不报错,但在运行是就会有报错
class Test3 extends Test2,Test4{}
泛型
Groovy 在泛型方面与 Java 具有相同的概念。 定义类和方法时,可以使用类型参数并创建 泛型类、接口、方法或构造函数。
泛型类和方法的使用,无论它们是否在 Java 中定义 或 Groovy,可能涉及提供类型参数。
我们可以声明一个 “字符串列表” 如下所示:
List<String> roles = ['Trinity', 'Morpheus']
Class类
使用class
关键字声明
类和类成员可以具有与 Java 中相同的修饰符(public、protected、private、static 等)
Groovy 类与其 Java 对应类之间的主要区别是:
- 没有可见性修饰符的类或方法自动成为公共的(可以使用特殊的注释来实现包私有的可见性)。
- 没有可见性修饰符的字段会自动转换为属性,从而减少冗长的代码, 因为不需要显式的 getter 和 setter 方法。 更多关于这方面的内容将在 字段和属性部分 。
- 类不需要与其源文件定义具有相同的基本名称,但在大多数情况下强烈建议使用(另请参阅关于脚本的下一点)。
- 一个源文件可能包含一个或多个类(但如果文件包含任何不在类中的代码,则将其视为脚本)。 脚本只是一些类 特殊约定,并且将与其源文件同名(因此不要在与脚本源文件同名的脚本中包含类定义)。
以下代码提供了一个示例类。
class Test1 {
def username;
def password;
def getAll(){
username = "wangwu"
password = "123321"
username + password
}
}
内部类
package cn.test
class Test1 {
def username;
def password;
def showInner(){
def inner = new Inner()
inner.show()
}
class Inner{
def show(){
println("inner ...")
}
}
}
匿名内部类
class Outer3 {
private String privateStr = 'some string'
def startThread() {
new Thread(new Runnable() {
void run() {
println "${privateStr}."
}
}).start()
}
}
静态内部类
使用static
关键字进行声明
class Test7 {
static class InnerTest7{
}
}
抽象类
使用abstract
关键字设置位抽象类,方法也必须用abstract
关键字声明,否则认为是带有方法体的方法
abstract class Test2 {
abstract def show();
def show2(){
println("show2")
}
}
接口
使用interface
关键字声明
interface Test5 {
def showTest5()
}
实现
使用implements
关键字进行实现
class Test6 implements Test5{
}
闭包(lambda表达式)
闭包是一个开放的、匿名的代码块,它可以接受参数、也可以有返回值
闭包可以引用周围作用域中声明的变量(lambda表达式)
虽然我在这里这样将闭包称为lambda但实际上闭包不等于lambda,至于区别大家可以去看一下相关文章
语法
闭包:
{...}
如
def bi(a){
println(a)
}
lambda
()->{...}
如:
def lam = ()->{
println("this is lam")
}
调用
- 直接使用名字调用
- 使用call方法调用
lam()
lam.call()