欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Groovy学习笔记二 基本语法

程序员文章站 2022-07-12 15:10:39
...
1.默认导入
下面的导入列表总是隐藏在Groovy代码之中:
groovy.lang.*;
groovy.util.*;
java.lang.*;
java.io.*;
java.math.BigDecimal;
java.math.BigInteger;
java.net.*;
java.util.*;
 
如果还需要引入其他的java类,则可以直接使用java中的import语句进行导入,如java.math.*;
2.数字处理
Groovy在底层用Java中的BigDecimal表示浮点数,但它会确保BigDecimal的行为尽量符合开发人员的期望。
3.变量、动态与静态类型、作用域
(1)动态与静态类型
Groovy是动态语言,所以不必指定变量的类型,变量的类型是在声明(或返回)时确定的。
如果声明了静态类型变量,在用不不正确的类型值对它赋值时,Groovy能检查出来,运行如下代码,会报错
a=new Date()
a=1;
Date b=new Date();
b=2.0;
Exception thrown
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '2.0' with class 'java.math.BigDecimal' to class 'java.util.Date'
 at ConsoleScript4.run(ConsoleScript4:4)
也就是在b=2.0;这一句执行报错,不能将2.0这个值赋给Date型的变量b。
(2)Groovy中的作用域
对于Groovy里的类,其作用域和Java一样,类、方法、循环作用域的变量,他们的作用域都跟你想的一样。但Groovy脚本则不同。
简单说,Groovy脚本有两种作用域
  1. 绑定域,绑定域是脚本的全局作用域。
  2. 本地域,本地域就是变量的作用域局限于声明它们的代码块。对于在脚本代码块内声明的变量(比如在脚本的顶部),如果是定义过的变量,其作用域就是定义它的本地域。
定义变量是指被声明为静态类型,或用特殊的def关键字定义的变量(表明它是未确定类型的定义变量)。
    在脚本中声明的方法访问不了本地域。
 String hello="Hello World";
    void printHello()
    {
        System.out.println(hello);
    }
    printHello();
    将会出现如下异常:
Exception thrown
    groovy.lang.MissingPropertyException: No such property: hello for class: ConsoleScript6
   at ConsoleScript6.printHello(ConsoleScript6:4)
   at ConsoleScript6.run(ConsoleScript6:6)
    但如果去掉String,则可以正常输出Hello World.
(3)列表和映射语法
    Groovy中的列表和映射在底层是由Java ArrayList和LinkedHashMap实现的。
    Groovy用方括号[]指定和使用列表结构.
jvmLanguages=["Java","Groovy","Scala","Clojure"];
println(jvmLanguages[0]);
println(jvmLanguages.size());
println(jvmLanguages[0..2])
println(jvmLanguages[-1])
jvmLanguages=[];
println(jvmLanguages);
    输出为:
Java
4
[Java, Groovy, Scala]
Clojure
[]
Groory是动态类型语言,所以可以把不同类型的只保存在列表和映射中。
 jvmLanguages=["Java",2,"Scala",new Date()];
 println(jvmLanguages);
    输出为:
[Java, 2, Scala, Mon Jan 05 14:22:22 CST 2015]
    Groovy处理映射也差不多,用[]符号,并用冒号(:)来分开键值对,以映射.键(map.key)的方式去引用映射中的值。
    
languageRatings=[Java:100,Groovy:99,Clojure:"null"];
println(languageRatings["Java"]);
println(languageRatings.Clojure)
languageRatings["Clojure"]=75;
println(languageRatings["Clojure"]);
println(languageRatings);
languageRatings=[:];
println(languageRatings);
    输出为:
100
null
75
[Java:100, Groovy:99, Clojure:75]
[:]
   4.与Java差异
    (1)Groovy有大量可以省略的语法:
  1.      语句结束处的分号;
  2.     返回语句(return);
  3.     方法参数两边的括号;
  4.     public访问限定符。
 Demo demo=new Demo();
println(demo.doSomething());
public class Demo
{
     public Integer doSomething()
     {
          def x=1
          def y;def String z="Hello World"
          println "the doSomething method be invoked!"
          x=5
      }
}
    输出为:
the doSomething method be invoked!
5
   如果把上面代码中的public都去掉,输出还是一样
   (2)异常处理
    Groovy不区分检查异常和未检查异常。Groovy编译器会忽略方法签名中的所有throws语句。
    (3)相等操作符
    遵循最小以外原则,Groovy把==当做Java中的equals()方法。
    
Integer x=new Integer(2);
    Integer y=new Integer(2);
    Integer z=null;
    if(x==y)
    {
        println "x==y"
    }
    if(!x.is(y))
    {
        println "x is not y"
    }
    if(z.is(null))
    {
        println "z is null"
    }
    if(z==null)
    {
        println "z is null"
    }
 
 输出为:
x==y
x is not y
z is null
z is null
(4)内部类
  Groovy支持内部类,但大多数情况下我们应该用函数字面值替代它。