Groovy05_Groovy方法调用与运算符重载

5人阅读 评论(0) 收藏 举报
分类:

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 方法

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

这里写图片描述

这里写图片描述

查看评论

【用OOP的思想来学习JavaScript】(JavaScript的运算符){第4章}

JavaScript已经成为当今最流行的语言,是基于Java的一种非常松散的面向对象语言,是数亿网民受益的最新动态语言,增强了与用户的交互性。 本课程将毫无保留的将作者积累的开发经验分享给大家,知识点深入浅出,详略得当。技能都来自实际开发的经验,在本课程中,也会将JavaScript开发的常见的“坑”让大家去填满,填满后你离JavaScript高级开发又进了一步。
  • 2017年05月05日 13:13

C++ 运算符重载讲解与经典实例

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如:  class complex  {   public:    complex(dou...
  • u013982161
  • u013982161
  • 2016-10-16 13:58:04
  • 3367

浅析Python运算符重载

Python语言中提供了运算符重载功能,这一点与C++有点类似,却又和C++有些许多的不同。Python的运算符重载是通过重写一些Python内置的方法实现的。这些运算符方法都是以双下划线开头和结尾的...
  • goodlixueyong
  • goodlixueyong
  • 2016-09-20 23:14:38
  • 4949

[C++学习]矩阵运算符重载

#include#includeclass A{public:  A (){p=0;}; A (const A&);            A operator++();   A operator+(...
  • hbh1
  • hbh1
  • 2005-08-23 01:05:00
  • 1323

关于运算符重载的两种方式的优缺点比较

大家都知道一般常用两种重载运算符的方式分别是: 1.作为成员函数重载运算符.    2.作为友元函数重载运算符. 这里我给个例子. 这里是DoubleA class DoubleA { publi...
  • y1196645376
  • y1196645376
  • 2016-03-31 17:06:37
  • 3188

【C++】运算符重载总结

运算符重载的概念和语法 重载,就是赋予新的含义,运算符重载和函数重载类似,同一个运算符可以有不同的功能。 运算符重载的方式就是定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器就会自...
  • Tanswer_
  • Tanswer_
  • 2016-10-20 14:40:11
  • 1122

C++运算符重载的心得

第一次写这种技术的博客,如果有大牛经过,请指导:   说到C++运算符重载,不得不先说说C++都有哪些运算符,C++包含以下运算符: 能重载的有:::::==(等于),   !=(不等于),  ...
  • dyjhx0105
  • dyjhx0105
  • 2012-04-01 23:31:02
  • 972

C++程序设计 运算符重载实验(二)

  • 2012年04月12日 19:56
  • 191KB
  • 下载

java中没有运算符重载

java中既然没有运算符重载,那么它的代替实现是什么??? 我来帮他解答 满意回答 2011-04-22 13:43 其实是有的,就是字符串操作里的+和+=。但是不能自定义运算符重载,所以只有...
  • autumn20080101
  • autumn20080101
  • 2013-01-09 12:41:12
  • 1152

C++基础篇--运算符重载

运算符重载没有多高深复杂,但牵扯到的相关概念和语法变化不少,如果这块基石不牢固,读复杂C++代码时就只有雾里看花的份。 运算符重载由来     C/C++中所有运算符(+-*/等)默认只用于基本数据类...
  • ipmux
  • ipmux
  • 2015-09-01 15:04:19
  • 1137
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 609
    排名: 8万+
    最新评论