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方法,结果为--》Rmb{number=200}

println rmb + new Rmb(number: 1.0)  // Rmb{number=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
}
// Rmb{number=99}
// 1


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


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

}

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

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

这里写图片描述

这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/urrjdg/article/details/79968416
个人分类: Groovy、Gradle
上一篇Groovy04_闭包
下一篇Groovy06_Groovy方法扩展与脚本调用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭