Groovy05_Groovy方法调用与运算符重载

Posted 李樟清

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy05_Groovy方法调用与运算符重载相关的知识,希望对你有一定的参考价值。

1. Groovy方法调用

// groovy方法调用
class Person
    def name
    def age

    def getName() 
        println 'getName'
        return name
    

    void setName(name) 
        println 'setName'
        this.name = name
    


def person = new Person()

// get set 方法会自动生成,并且会自动调用get set方法
//person.setName('Jack')
person.name = 'jack'
//setName
println person.name
//getName
//jack
println person.'name'
//getName
//jack
def str = 'name'
println person."$str"
//getName
//jack
println person['name']
//getName
//jack

// 如果不想调用 get 方法 ,用@
println person.@name
//jack

println('=====================================')

class Person2
    def name
    def age

    def getName() 
        return name + "_"
    

    void setName(name) 
        this.name = name
    

    def excute(x,y,z)
        println "$x $y $z"
    

// 键值对的方式 给参数赋值
def person2 = new Person2(name:'jack')
println person2.name    // jack_
//person2.excute(x:1,y:2,z:3)  // 报错了
person2.excute(x:1,y:2,z:3,4,5)  // [x:1, y:2, z:3] 4 5  把键值对赋值给了第一个参数
person2.excute(4,5,x:1,y:2,z:3)  // [x:1, y:2, z:3] 4 5  还是把键值对赋值给了第一个参数
person2.excute(4,[1,2,3],5)      // 4 [1, 2, 3] 5

println('=====================================')

def str2 = 'org.codehaus.groovy:groovy-all:2.3.11'
// java写法   吧:分隔开
def array = str2.split(":")
println array      // [org.codehaus.groovy, groovy-all, 2.3.11]
def (group,name,verson) = str2.split(":")
println group       // org.codehaus.groovy
println name        // groovy-all
println verson      // 2.3.11

//def (group2,name2,verson2,classifier) = str2.split(":") // 报错java.lang.ArrayIndexOutOfBoundsException: 3

println('=====================================')

interface OnclickListener
    void onClick()


void func(OnclickListener listener)
    println listener.class      // class com.sun.proxy.$Proxy5 是个代理,使用代理的方式 调用闭包
    listener.onClick()


OnclickListener listener = 
    println 'onclick listenrer'


func  // 传递一个闭包进去,其实调用闭包,是调用闭包里面的call方法
    println 'onclick'       // onclick


func listener       // onclick listenrer

println('=====================================')

interface OnclickListener3
    void onClick3(str,str1)


void func3(OnclickListener3 listener3)
    println listener3.class      // class com.sun.proxy.$Proxy5 是个代理,使用代理的方式 调用闭包
    listener3.onClick3('hello','closure')


OnclickListener3 listener3 = 
    i,j->
    println "$i,$j"


func3 listener3       // hello,closure


println('=====================================')

interface OnclickListener4
    void after()
    void doing()
    void before()



OnclickListener4 listener4 = 
    println "hello"
 as OnclickListener4

listener4.doing()   // 报错 因为他有3个方法,不知道给那个方法
                    // 加上 as as OnclickListener4 , -》 hello
listener4.after()   // 加上 as as OnclickListener4 , -》 hello
listener4.before()  // 加上 as as OnclickListener4 , -》 hello

// 应用,比如他有3个方法,但是我只要使用1个



2. 运算符重载



// 操作符重载

class Rmb
    def number

    def isCase(o)
        println o
        if (o instanceof Rmb)
            o.number == 99
        else
            false
    

    boolean equals(o) 
        println 'equls 方法'
        if (this.is(o)) return true
        if (getClass() != o.class) return false

        Rmb rmb = (Rmb) o

        if (number != rmb.number) return false

        return true
    

    int hashCode() 
        return (number != null ? number.hashCode() : 0)
    

    def plus(o)
        if (o instanceof Number)
            new Rmb(number: number+o)
        else if (o instanceof Rmb)
            new Rmb(number: number + o.number)
        else 
            throw  new MissingMethodException('plus',o.class,o)
        
    

    @Override
    public String toString() 
        return "Rmb" +
                "number=" + number +
                '';
    


def rmb = new Rmb(number: 100)

println rmb + 100  //报错 Caught: groovy.lang.MissingMethodException: No signature of method: Rmb.plus() is applicable for argument types
                // 缺少plus方法
                // 如果我们加上了plus方法 toString方法,结果为--》Rmbnumber=200

println rmb + new Rmb(number: 1.0)  // Rmbnumber=101.0

//println rmb + ""  // Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.plus() is applicable for argument types

def  rmb2 = new Rmb(number: 99)
switch (rmb2)
    case new Rmb(number: 100):
        println "1"
        break
    case 100:
        println "2"
        break

// Rmbnumber=99
// 1


println('=====================================')


def str = ''
if (str)  // 之所以能作为条件判断,是因为他注入了asBoolean()方法,如果要改变让他
            // 不止为null返回false还要加些其他的内容
            // 我们可以在Rmb类中重写asBoolean方法



//还有 ==  调用的是equals方法
rmb == '111'  // equls 方法

下面是一些重载对应的方法

以上是关于Groovy05_Groovy方法调用与运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

Groovy06_Groovy方法扩展与脚本调用

Groovy06_Groovy方法扩展与脚本调用

看懂Gradle脚本- Groovy语法之运算符重载

在Groovy中增加String上的运算符