概述
get 和set函数
groovy中所有类成员编译后会自动生成get
set
函数
class Person{
def name
def age
def high
def sex
}
在编译后会自动生成get
和set
函数(其他生成函数请无视,这是元编程内容)。
public class Person implements GroovyObject {
private Object name;
private Object age;
private Object high;
private Object sex;
public Person() {
CallSite[] var1 = $getCallSiteArray();
MetaClass var2 = this.$getStaticMetaClass();
this.metaClass = var2;
}
static {
__$swapInit();
Long var0 = 0L;
__timeStamp__239_neverHappen1589035397337 = var0;
Long var1 = 1589035397337L;
__timeStamp = var1;
}
public Object getName() {
return this.name;
}
public void setName(Object var1) {
this.name = var1;
}
public Object getAge() {
return this.age;
}
public void setAge(Object var1) {
this.age = var1;
}
public Object getHigh() {
return this.high;
}
public void setHigh(Object var1) {
this.high = var1;
}
public Object getSex() {
return this.sex;
}
public void setSex(Object var1) {
this.sex = var1;
}
}
外部访问属性是隐式的通过get
,set
函数。
class Person {
def name
def age
def high
def sex
def setName(name) {
println "Invoke setName function"
this.name = name
}
def getName() {
println "Invoke getName function"
return name
}
}
Person person = new Person()
person.name = "XiaoMing"
println person.name
输出
Invoke setName function
Invoke getName function
XiaoMing
问题来了,如何不通过get
和set
函数访问属性?通过@属性语法
class Person {
def name
def age
def high
def sex
def setName(name) {
println "Invoke setName function"
this.name = name
}
def getName() {
println "Invoke getName function"
return name
}
}
Person person = new Person()
person.@name = "XiaoMing"
println person.@name
输出:
XiaoMing
- 注意:
类内部默认不通过get
和set
访问自身属性
class Person {
def name
def age
def high
def sex
def setName(name) {
println "Invoke setName function"
this.name = name
}
def getName() {
println "Invoke getName function"
return name
}
def test() {
name="XiaoMing"
println "My name is $name"
}
}
new Person().test()
输出
My name is XiaoMing
够敏捷的构造函数
在Groovy
如果Bean
存在无参构造,那么可以在创建对象的时候传入一个map
,键
为属性名,值
为赋值结果。
class Person {
def name
def age
def high
def sex
Person() {
}
}
def person = new Person(name: "hello world",age: 13)
println person.dump()
输出:
<Person@55d56113 name=hello world age=13 high=null sex=null>
运算符重载
语法 :
def
重载操作符名称
(参数
){
return
返回值
}
重载操作符名称
说明,比说加法重载就是plus
,乘法就是multiply
.参考运算符官方说明
demo:
class Person {
def name
def age
def high
def sex
Person() {
}
//重载+符号
def plus(int obj) {
return age + obj
}
//重载*符号
def multiply(int obj) {
return age * obj
}
}
def person = new Person(name: "hello world", age: 13)
def newAge = person + 1
def newAge2 = person * 2
println "newAge $newAge newAge2 $newAge2"
更智能的多态性为
public class Human {
public void sayHello(Object obj) {
System.out.println("Human say $obj");
}
}
public class WoMan extends Human {
public void sayHello(String obj) {
System.out.println("WoMan say $obj");
}
}
以下是在java中的测试
import groovy.lang.GroovyShell;
public class JavaMain {
public static void main(String[] args) {
Human human=new WoMan();
human.sayHello("str");
human.sayHello(1);
}
}
Human say $obj
Human say $obj
然而在groovy的输出:
class Main {
public static void main(String[] args) {
def human = new WoMan()
human.sayHello("str")
human.sayHello(1)
}
}
输出:
WoMan say $obj
Human say $obj
groovy输出我们预期的行为
最后
以上就是坦率星星为你收集整理的Groovy的Bean对象的全部内容,希望文章能够帮你解决Groovy的Bean对象所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复